我如何处理平行于 y 轴的相机方向我的 raytracer

How can i handle a camera direction parallel to the y-axis my raytracer

我正在研究我的光线追踪器,但似乎我无法处理相机的方向矢量与矢量 (0,1,0) 平行的情况。

我认为这与我为相机向上和向右计算矢量的方式有关,但我找不到解决方法。

这是我的做法:

cam_up = vector_cross(cam_dir, {0, 1, 0});
camp_right = vector_cross(cam_right, cam_dir);

谁能赐教一下?

您拥有从单个 cameraOut 向量计算正交轴的正确公式。然而,如前所述,该公式不会考虑相机滚动,它可以是垂直于相机方向的平面中的任何方向。这在将相机移过极点(y 轴)时会很明显,因为会出现不良行为(是的,它会正确瞄准,但毫无疑问,滚动是不需要的)。

有关详细信息,请查看 gimbal lock

滚动本身并不是真的不正确,但实际上要使此相机过渡平滑且看起来正确(而不是突然翻转或旋转,因为它的方向变为 0,1,0),您需要更正任何滚动招致。这是围绕 cameraOut 轴的旋转,理想情况下应该相对于之前的 cameraAlong。这意味着为了保持正确的滚动(或感知到的正确滚动),您需要考虑前一帧的相机姿势(位置和方向)并确保减少滚动。当然,如果相机不移动(即您渲染具有静态相机位置的帧),则您没有先前的相机状态,因此无法计算位置,而必须明确定义为场景定义的一部分。

就我个人而言,我存储了相机的整个正交轴,因此方向和滚动始终清晰定义。这只是为了完整性,老实说,您不需要存储整个轴,2 个向量 cameraOut 和 cameraAlong(第三个是 cameraUp)就足够了。 cameraAlong 取决于您的坐标系的惯用手性(例如,对于初始相机位置,例如左手坐标系中的位置 (0,0,0),cameraAlong 方向将相对于观察者处于正确的方向,对于右手手系统 cameraAlong 将相反。cameraUp 和 cameraOut 在两个坐标系中都是相同的)。

希望对您有所帮助。

P.S 这不是特定于光线追踪的,相同的原则适用于 OpenGL/DirectX 或任何 3D 表示。