Unity Shader切空间旋转矩阵的笔记

在学习 Unity的Shader时,发现 unity Shader内置了一个宏定义

// Declares 3x3 matrix 'rotation', filled with tangent space basis
#define TANGENT_SPACE_ROTATION \
	float3 binormal = cross( v.normal, v.tangent.xyz ) * v.tangent.w; \
	float3x3 rotation = float3x3( v.tangent.xyz, binormal, v.normal )

这个矩阵的作用是从模型空间转换到切空间。突如其来的定义让我有点没反应过来,仔细理了一下。理解这个需要先复习坐标系的定义:

假设线性子空间的基B={v1,v2,...,vk}, 向量 a = v1c1+v2c2+...+vkck,那么(c1,c2,...,ck)即为a基于B的坐标。换句话说,坐标是向量在某组基下的表示。此时,我们称B定义了一个坐标系。假设向量a在基{v1,v2,vk}下的坐标已知为b,矩阵C={v1,v2...vk},那么有 a  = Cb,C就是这个坐标变换的变换矩阵。


现在我们来看切空间的三个轴,它其实就是一组正交的基 {v1,v2,v3} , 任何一个切空间的坐标b (xb,yb,zb)与之相乘,都可以转化为模型空间的坐标a (xa,ya,za),即a = Cb。

展开写就是

                  

|xa|     |v.tangent.x,  binormal.x,  v.normal.x|       |xb|   
|ya| =  |v.tangent.y,  binormal.y,  v.normal.y|  *   |yb|
|za|     |v.tangent.z,  binormal.z,  v.normal.z|       |zb|

因此,上面的变换矩阵就是一个从切空间到模型空间的变换矩阵,那么从模型空间到切空间的变换矩阵就是上面矩阵的逆矩阵。又因为这个矩阵是一个正交矩阵,因此它的逆矩阵可以写成它的转置矩阵。

一旦转置,就出现了最开始的那段代码。

float3x3( v.tangent.xyz, 
               binormal, 
               v.normal )

它表示从切空间到模型空间的一个变换

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值