让我们修改一下如何构建这些向量:
首先,您的前向矢量非常简单:vec3 forward = vec3(camPos - target) 即您的相机面向的相反方向,其中目标是 3d 空间中的一个点,而 camPos 是您相机的当前位置。
现在您无法仅使用一个向量来定义笛卡尔坐标系,因此我们需要另外两个来描述相机/光线追踪器视图的坐标系。所以让我们找到一个垂直于前向向量的向量。可以通过以下方式找到此类向量:vec3 v = cross(anyVec, forward)。事实上,您可以使用随机向量(前向和空向量除外)来获得所需的第二个方向,但这并不方便。我们希望当沿 z 轴 (0, 0, 1) 看时,“右”被描述为 (1, 0, 0)。 vec3 right = cross(yAxis, forward) 和 vec3 yAxis = (0, 1, 0) 也是如此。如果你改变你的前向矢量而不是沿着 z 轴看,你的右矢量也会改变,类似于你改变方向时你的“右”如何改变。
所以现在只剩下一个向量来描述我们相机的方向。这个向量必须垂直于右向量和前向量。可以通过以下方式找到此类向量:vec3 up = cross(forward, right)。这个向量描述了相机的“向上”。
请注意,前向、右向和上向向量需要归一化。
如果你倒立,你的向上向量将是(0, -1, 0),因此会描述你看到的一切都是颠倒的,而其他两个向量将完全一样。如果您以 90° 角观察地板,您的上矢量将是 (0, 0, 1),您的前向矢量将是 (0, 1, 0),而您的右矢量将保持在 (1, 0, 0)。因此,向上矢量的功能或“动机”是我们需要它来描述相机的方向。你需要它来“点头”相机,即调整它的俯仰。
向上向量是用来获取图像平面的吗?
向上向量用于描述相机的方向或场景中的视图。我假设您使用的是通过“查看方法”生成的视图矩阵。应用视图矩阵时,您不会旋转相机。您正在旋转所有对象/顶点。相机始终面向同一方向(通常沿负 z 轴)。更多信息您可以访问:https://www.scratchapixel.com/lessons/3d-basic-rendering/ray-tracing-generating-camera-rays/generating-camera-rays