Transforming Normal Vector

昨天开始写一些经典的Shader来练手,被一个数学问题难住了,把一个Vertex的Position从World Space转到 View 或者 Projection,我们只要执行 mul(pos, worldView) 或者mul(pos, worldViewProjection)就好了,但Vector如果通过这样的运算之后,得出来的结果是明显不正确的,为了解决这个问题,翻了一下大一的线性代数,推导了一下,得出公式,下面来严格的推导一次。

这个运算主要用在Object Space的坐标系和Tangent Space的坐标系的转换,用一个3*3的Matrix去处理一个Vector的结果大概如下:
 

变换之后方向明显不对了。

然后我们可以这样考虑:在Tangent Space上面, Tangent和Normal是垂直的,即有 N·T = 0
存在矩阵M, G,使 T' = M·T, N' = G·N,且 N'·T' = 0
有, N'·T' = (G·N)T·(M·T) = NT·(GT·M)·T= 0 又N·T = NT·T = 0 得 G = (M-1)T 

也就是说,Vector的坐标转换矩阵等于Position的转换矩阵的逆矩阵的转置

 
这样你再去看texture mapping的shader就阔然开朗,”为什么需要这样那样的矩阵呢?“之类的感叹应该尽量减少, 尝试用数学去解决它。

btw,google的信条是算法可以解决一切问题。
我以为,算法和数学是科学的基础,科学是我们的生活方式。face5.gif

转载于:https://www.cnblogs.com/eric720/archive/2007/04/20/721056.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值