直接获取法

Unity

HLSL
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节点中调用

HLSL
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;
点击展开查看更多

叉乘法

  1. Forward:摄像机指向物体的方向(即面向摄像机的“前”方向)。 $$ \vec{Forward} = \mathbf{P_{Object}} - \mathbf{P_{Camera}} $$
HLSL
float3 Forward = normalize(ObjectPosition - CameraPosition);
点击展开查看更多

  1. Right:通过 Forward × 世界空间 Up 叉乘得到。(世界空间 Up 取决于引擎) $$ \vec{Right} = \vec{Forward} \times \begin{bmatrix} 0 \\ 1 \\ 0 \end{bmatrix} $$
HLSL
float3 Right = normalize(cross(Forward, float3(0, 1, 0)));
点击展开查看更多

  1. Up:通过 Forward × Right 叉乘得到。 $$ \vec{Up} = \vec{Forward} \times \vec{Right} $$
HLSL
float3 Right = normalize(cross(Forward, Right));
点击展开查看更多

版权声明

作者: Cheyne Xie

链接: https://chaim.eu.org/posts/8f00267b/

许可证: CC BY-NC-SA 4.0

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License. Please attribute the source, use non-commercially, and maintain the same license.

开始搜索

输入关键词搜索文章内容

↑↓
ESC
⌘K 快捷键