flushthink

just for essential skill
随笔 - 14, 文章 - 0, 评论 - 30, 引用 - 0
数据加载中……

模型视图变换时,法线向量要乘模型视图矩阵的逆转置矩阵

早前一直被这个问题困惑,但是自己推倒了很多遍也没推出来。
哎,在gameres上搜了3年前的谈话,后来在gamedev搜到了答案。
其实在计算机图形学中,只要是变换,无论平移,旋转,缩放,都是乘一个矩阵。
在模型视图变换时,顶点乘模型视图变换矩阵,而顶点对应的顶点法线向量(或其他的法线向量)则要乘模型视图矩阵的逆转置矩阵。
顶点和法线都是向量,他们的区别是什么?无非顶点是<x, y, z>表示缺省的<x, y, z, 1>,而法线向量是<x, y, z>表示缺省的<x, y, z, 0>。关于为什么是这样,不用我说了吧,2个顶点向量减下看看就知道了。
从这点来看,确实不同,或许就是这个不同,造成了变换的不同吧。
法线向量只能保证方向的一致性,而不能保证位置的一致性,所以,所有线向量必须以面的形式进行变换,如下:

Transforming Planes

If we have a plane vector n = [a, b, c, d] which describes a plane then for any point p = [x, y, z, 1] in that plane the follow equation holds:

nt p = ax + by + cz + d = 0

If for a point p on the plane, we apply an invertible transformation R to get the transformed point p1, then the plane vector n1 of the transformed plane is given by applying a corresponding transformation Q to the original plane vector n where Q is unknown.

p1 = R p
n1 = Q n

We can solve for Q by using the resulting plane equation:

n1t p1 = 0

Begin by substituting for n1 and p1:

(Q n)t (R p) = 0
nt Qt R p = 0

If Qt R = I then nt Qt R p = nt I p = nt p = 0 which is given.

Qt R = I
Qt = R-1
Q = (R-1)t

Substituting Q back into our plane vector transformation equation we get:

n1 = Q n = (R-1)t n

posted on 2009-11-19 14:38 tiny 阅读(3010) 评论(4)  编辑 收藏 引用

评论

# re: 模型视图变换时,法线向量要乘模型视图矩阵的逆转置矩阵[未登录]  回复  更多评论   

给normal做矩阵计算时,只提取旋转变换因子,不用到平移,切边,缩放这些因子不就可以了。
2009-11-19 16:18 | foxriver

# re: 模型视图变换时,法线向量要乘模型视图矩阵的逆转置矩阵  回复  更多评论   

@foxriver
是的,旋转不还是保证了方向性,而没有保证他的位置性吗?
2009-11-19 16:30 | tiny

# re: 模型视图变换时,法线向量要乘模型视图矩阵的逆转置矩阵  回复  更多评论   

路过顶一下
2009-11-20 19:01 | 罗莱家纺

# re: 模型视图变换时,法线向量要乘模型视图矩阵的逆转置矩阵  回复  更多评论   

时间跨度富家大室
2009-11-22 14:27 | 凡客网站

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理