不是一个float4乘以_World2Object一个4by4矩阵?

时间:2014-08-04 10:57:36

标签: matrix unity3d shader

我正在研究Unity shader,但是一行代码让我困惑:

float3 normalDirection = normalize(mul(float4(v.normal,0.0),_World2Object).xyz);

不是float4的结果乘以_World2Object(4x4矩阵)也是4x4矩阵?但似乎结果是float4,然后通过访问.xyz属性转换为float3。

是否有任何用于访问二维矩阵的预定义属性,如.xyz?

非常感谢:)

1 个答案:

答案 0 :(得分:2)

您可以将矢量乘以矩阵以及矩阵乘矢量。

第一种称为左或前乘法和向量的情况以行 - 主要顺序(1x4)表示。第二种情况是右乘或后乘,其中向量以列主要顺序(4x1)表示。

让我们考虑矩阵(4x4)作为X,Y,Z和W向量的基础。然后在行 - 主要顺序矩阵将写为

 X1,X2,X3,X4
 Y1,Y2,Y3,Y4
 Z1,Z2,Z3,Z4
 W1,W2,W3,W4

虽然按列主要顺序,相同的矩阵将写为

 X1,Y1,Z1,W1
 X2,Y2,Z2,W2
 X3,Y3,Z3,W3
 X4,Y4,Z4,W4

因此乘法的顺序(V.M对M.V)仅取决于矩阵的阶数。在您的示例中,矩阵以行主顺序写入。由于它的4x4矩阵,它代表了3D空间中的完全仿射变换(旋转,缩放和变换)。因此,要将向量乘以此矩阵,必须提供行向量(X,Y,Z,0)。请注意,如果要转换,则必须提供行向量(X,Y,Z,1)。

关于你的其余问题,有一个内置的混合运算符:.xyzw或.rgba for vectors。此运算符允许重新排列矢量的组件并进行复制(.xxxx,.wzyx,.rrra,et.c)。矩阵没有sqizzle运算符。