我正在研究unity着色器,但是一行代码让我困惑:
float3 normalDirection = normalize(mul(float4(v.normal,0.0),_World2Object).xyz);
float4 乘以 _World2Object(这是一个 4x4 矩阵)的结果不也是一个 4x4 矩阵吗?但结果似乎是 float4,然后通过访问 .xyz 属性转换为 float3。
是否有任何预定义的属性用于访问 .xyz 等二维矩阵?
非常感谢:)
最佳答案
您可以将向量与矩阵相乘,也可以将矩阵与向量相乘。
第一种情况称为左乘或预乘,向量以行主序 (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)。
关于您问题的其余部分,有一个内置的 swizzle 运算符:用于向量的 .xyzw 或 .rgba 。该运算符允许重新排列和复制向量的组成部分(.xxxx、.wzyx、.rrra 等)。矩阵没有 sqizzle 运算符。
关于matrix - float4 乘以 _World2Object 不是一个 4by4 矩阵吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25117094/