变换矩阵与向量相乘,有以下两种情况
有坐标空间A和坐标空间B
变换矩阵M(A->B):A的基向量在B空间的表示,按列排列。
情况1:
M(A->B)*空间A的向量Va,空间A表示的Va转为在B空间表示;变换后,向量不变,用另一个坐标系表示。
例:切线空间:空间A、世界空间:B空间、法线贴图的法线:空间A的向量Va
切线空间的切线、副切线、法线在世界空间的表示,按列排列,构成变换矩阵,把法线贴图的法线转换到世界空间。
情况2:
M(A->B)*空间B的向量Vb,Vb通过M旋转、位移、缩放;变换后,向量改变,发生旋转、位移、缩放。
例:《Unity Shader入门精要》11.3.2广告牌例子,新坐标空间:A空间、模型空间:B空间、模型空间内各点:空间B的向量Vb。
新坐标空间的基向量在模型空间的表示,按列排列,构成变换矩阵,将模型空间内各点变换(旋转)到新坐标空间。
《Unity Shader入门精要》11.3.2广告牌例子
矩阵变换代码:
float3 centerOffs = v.vertex.xyz - center;
float3 localPos = center + rightDir * centerOffs.x + upDir * centerOffs.y + normalDir * centerOffs.z;
实现的原理如情况2,相当于rightDir ,upDir ,normalDir构成的矩阵与centerOffs向量相乘,得到centerOffs旋转后的位置
在这个例子中星星的xy面始终面对摄像机,z轴指向摄像机,如果想要星星始终平放在地面上的效果,将xy面对应到新坐标系的xz(rightDir 、normalDir )面(注意z轴朝向),代码改成
float3 localPos = center + rightDir * centerOffs.x + upDir * centerOffs.z + normalDir * -centerOffs.y;
效果如下: