光线追踪中的向上矢量是什么?

What is up vector in ray tracing?

我想了解光线追踪中的向上矢量是什么,但我不确定我是否理解正确。向上矢量是否用于获取图像平面?我将得到“右向量”,使向上向量和前向向量(= 目标 - 原点)之间产生叉积。它有其他动机吗?一个很好的例子可以帮助我理解它。

将世界space坐标转换为视图space的矩阵称为视图矩阵。视线矩阵是由视点、视线方向或目标点和向上向量构成的视角矩阵。

更多详情here

让我们修改一下构建这些向量的方式:

首先你的前向矢量非常简单:vec3 forward = vec3(camPos - target) 即你的相机面对的相反方向,目标是 3d 中的一个点 space 和 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)。所以向上矢量的功能或“动机”是我们需要它来描述相机的方向。你需要它来“点头”相机,即调整它的间距。

Is the up vector used to get the image plane?

向上矢量用于描述相机的方向或场景中的视图。我假设您正在使用通过“查看方法”生成的视图矩阵。应用视图矩阵时,您不会旋转相机。您正在旋转所有 objects/vertices。相机始终面向同一方向(通常沿负 z 轴)。更多信息您可以访问:https://www.scratchapixel.com/lessons/3d-basic-rendering/ray-tracing-generating-camera-rays/generating-camera-rays