直接获取法
Unity
float3 Right = float3(UNITY_MATRIX_I_V[0].x, UNITY_MATRIX_I_V[1].x, UNITY_MATRIX_I_V[2].x);
float3 Up = float3(UNITY_MATRIX_I_V[0].y, UNITY_MATRIX_I_V[1].y, UNITY_MATRIX_I_V[2].y);
float3 Forward = -float3(UNITY_MATRIX_I_V[0].z, UNITY_MATRIX_I_V[1].z, UNITY_MATRIX_I_V[2].z);
// swizzle 语法
float3 cameraRight = UNITY_MATRIX_I_V._m00_m10_m20;
float3 cameraUp = UNITY_MATRIX_I_V._m01_m11_m21;
float3 cameraForward = -UNITY_MATRIX_I_V._m02_m12_m22;UE
只能在Custom节点中调用
ResolvedView.ViewForward; // 相机前方向
ResolvedView.ViewUp; // 相机上方向
ResolvedView.ViewRight; // 相机右方向
// 构建矩阵(列)
float3x3 M;
M._m00_m10_m20 = ResolvedView.ViewRight;
M._m01_m11_m21 = ResolvedView.ViewUp;
M._m02_m12_m22 = ResolvedView.ViewForward;叉乘法
- Forward:摄像机指向物体的方向(即面向摄像机的“前”方向)。 $$ \vec{Forward} = \mathbf{P_{Object}} - \mathbf{P_{Camera}} $$
float3 Forward = normalize(ObjectPosition - CameraPosition);- Right:通过
Forward × 世界空间 Up叉乘得到。(世界空间 Up 取决于引擎) $$ \vec{Right} = \vec{Forward} \times \begin{bmatrix} 0 \\ 1 \\ 0 \end{bmatrix} $$
float3 Right = normalize(cross(Forward, float3(0, 1, 0)));- Up:通过
Forward × Right叉乘得到。 $$ \vec{Up} = \vec{Forward} \times \vec{Right} $$
float3 Right = normalize(cross(Forward, Right));