我正在处理我的光线跟踪器,似乎我无法处理我的相机的方向向量与向量(0,1,0)平行的情况。
我认为这与我计算相机向上和向右相机的方式有关,但我无法找到解决方法。
我是这样做的:
cam_up = vector_cross(cam_dir, {0, 1, 0});
camp_right = vector_cross(cam_right, cam_dir);
有人可以启发我吗?
答案 0 :(得分:1)
您可以从单个cameraOut矢量计算正交轴的正确公式。然而,如上所述,该公式将不考虑相机胶卷,其可以是垂直于相机方向的平面中的任何方向。当将相机移过极点(y轴)时,这将是显而易见的,因为会有不良行为(是的,它将被正确瞄准,但毫无疑问不会需要滚动)。
有关详细信息,请查看gimbal lock。
滚动本身并不是真的不正确,但实际上这个摄像机过渡是平滑的并且看起来是正确的(而不是突然翻转或旋转,因为它的方向变为0,1,0),你需要纠正任何滚动。这是关于cameraOut轴的旋转,理想情况下应该相对于前一个cameraAlong。这意味着为了保持正确的滚动(或感知正确的滚动),您需要考虑前一帧中的摄像机POSE(位置和方向)并确保减轻滚动。当然,如果相机没有移动(即渲染具有静态相机位置的帧),则您没有先前的相机状态,因此无法计算位置,而是必须明确定义为场景定义的一部分。 / p>
就个人而言,我为相机存储了一个完整的正交轴,因此始终清晰地定义了方向和滚动。这只是为了完整性,说实话你不需要存储整个轴,2个矢量cameraOut和cameraAlong(第三个是cameraUp)就足够了。 cameraAlong取决于你的坐标系的手数(例如,对于初始摄像机位置,例如左手坐标系中的位置(0,0,0),cameraAlong方向将相对于观察者在正确的方向上,对于右侧手系统cameraAlong将是另一种方式。在两个坐标系统中,cameraUp和cameraOut都是相同的。)
希望这有帮助。
P.S这不是光线追踪特定的,相同的原则适用于OpenGL / DirectX或任何3D表示。