法线从object space到eye space的转换((normal matrix)
对于顶点来说,从object Space转换到eye space, 使用model-view矩阵就好了.那么顶点的法线是否也可以直接使用model-view矩阵转化?
通常情况下是不行的.
如下两张图是顶点的tangent和normal向量使用m-v矩阵从object space到eye space的变换:
>>>>>>>>>>>>>>>>
可以看到在eye-space中,tangent的方向仍符合定义,normal则不再垂直于tangent了.m-v矩阵不适用于normal.
令T为tangent,MV为model-view矩阵.P1, P2为tangent联系的2个顶点.
T = P2 - P1
T' = T * MV = (P2 - P1) * MV = P2 * MV - P1 * MV = P2' - P1'
因此T'保留了tangent的定义.但对于normal,你也可以找到N=Q2-Q1代表它,但是变换后Q2'-Q1'却不能保证垂直于T'.object space到view space,角度关系被改变了.
如何求出normal的变换,维持与tangent垂直?假设该变换为G.
normal与tangent垂直:
N'.T' = (GN).(MT) = 0
点积转化为叉积:
(GN).(MT) = (GN)T * (MT) = (GN)T(MT) = (NTGT)(MT) = NTGTMT = 0
注意到NTT为0:
若GTM = I,则上式成立.因此G=(M-1)T.
即normal matrix是model-view矩阵的逆矩阵的转置矩阵.
若model-view矩阵是一个正交矩阵,则G=M.这便是例外情况下normal matrix为model-view矩阵.
转自:http://www.cnblogs.com/flytrace/p/3379816.html
法线从object space到eye space的转换((normal matrix)的更多相关文章
- User space 与 Kernel space
学习 Linux 时,经常可以看到两个词:User space(用户空间)和 Kernel space(内核空间). 简单说,Kernel space 是 Linux 内核的运行空间,User spa ...
- 关于sed中的Pattern Space和Hold Space的随笔
首先是一部分概念和示例,这部分转自:http://coolshell.cn/articles/9104.html Pattern Space 第零个是关于-n参数的,大家也许没看懂,没关系,我们来看一 ...
- JVM内存区域划分Eden Space、Survivor Space、Tenured Gen,Perm Gen解释
以下内容转自:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=29632145&id=4616836 jvm区域总体分两 ...
- JVM内存区域划分Eden Space、Survivor Space、Tenured Gen,Perm Gen解释(转)
jvm区域总体分两类,heap区和非heap区.heap区又分:Eden Space(伊甸园).Survivor Space(幸存者区).Tenured Gen(老年代-养老区). 非heap区又分: ...
- JVM内存区域划分Eden Space,Survivor Space,Tenured Gen,Perm Gen
jvm区域总体分两类,heap区和非heap区.heap区又分:Eden Space(伊甸园).Survivor Space(幸存者区).Tenured Gen(老年代-养老区). 非heap区又分: ...
- JVM内存区域详解(Eden Space、Survivor Space、Old Gen、Code Cache和Perm Gen)
JVM区域总体分两类,heap区和非heap区.heap区又分为: Eden Space(伊甸园). Survivor Space(幸存者区). Old Gen(老年代). 非heap区又分: Cod ...
- Permanent Space 和 Heap Space
JVM堆内存 JVM堆内存分为2块:Permanent Space 和 Heap Space. Permanent 即 持久代(Permanent Generation),主要存放的是Java类定 ...
- Kernel Space与User Space(转)
对于刚刚接触Linux的菜鸟来说,可能会不理解大家常说的Kernel Space和User Space是什么意思,我简单搜了一下,发现阮一峰写过一个比较简洁的介绍,贴下来给大家: 学习 Linux 时 ...
- [转]JVM内存区域划分Eden Space、Survivor Space、Tenured Gen,Perm Gen解释
jvm区域总体分两类,heap区和非heap区.heap区又分:Eden Space(伊甸园).Survivor Space(幸存者区).Tenured Gen(老年代-养老区). 非heap区又分: ...
随机推荐
- 数据操作流DataOutputStream、DataInputStream类
[例子1] import java.io.DataOutputStream; import java.io.File; import java.io.FileOutputStream; import ...
- Nutch源码阅读进程3
走了一遍Inject和Generate,基本了解了nutch在执行爬取前的一些前期预热工作,包括url的过滤.规则化.分值计算以及其与mapreduce的联系紧密性等,自我感觉nutch的整个流程是很 ...
- jQueryPrint 的简单使用
jQueryPrint 的简单使用 一.为什么要使用 jQueryPrint? 1.当然是方便的要死尼,相比于其他的方法. 2.打印整个页面或者局部页面都是非常的可以的,使用很方便. 3.如果要导出 ...
- Python3正则表达式(1)
正则表达式 作用:处理字符串.形式上检查格式 应用:文本编辑与处理.网页爬虫 特点:可以快速.准确地完成复杂的查找.替换 操作: step1:预定义模式 step2:采用预定义的模式匹配具有共同特征的 ...
- Python3基础之基本问题
问题1: 加法运算符重载 如果我们有两个列表对象,我要将两个列表中的元素依下标进行加和,我们该如何实现? 1列表对象的加法 list1 = [1,2,3,4] list2 = [10,20,30,40 ...
- Python初识及变量
第一句python,输出 Hello world #!/usr/bin/evn python #指定解释器 #_*_ coding:utf- _*_ #指定编码 print("hello w ...
- sitemap xml文件生成
sitemap xml生成方法 <?php /** * SitemapService.php. * * 生成sitemap */ class Sitemap { public $newLine ...
- ImageMagick简单记录
一.安装 mac下的安装非常简单 brew search ImageMagick brew install xxx 安装后,可验证 magick logo: logo.gif identify log ...
- libnids使用 (转)
http://blog.csdn.net/kl222/article/details/6248827---原始链接 Libnids是一个用于网络入侵检测开发的专业编程接口,它使用了Libpcap所以它 ...
- Shell脚本编程基础笔记一
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/8176137.html 一:脚本文件的创建.格式.运行 1:创建shell脚本 首先,要创建一个文件 touch ...