首页 > 解决方案 > 我的相机无法在 3d 空间中正确移动

问题描述

我创建了一个光线追踪算法,该算法当前在屏幕上显示一个三角形,但现在无法正确移动相机。

我希望我的代码让箭头键旋转相机,而 WASD 在 3D 空间中移动相机。相机当前使用两个旋转矩阵正确旋转 y 和 z 旋转。

问题

移动相机,而不是旋转,是问题出现的地方。要移动相机,我需要两个向量 - cameraForward 和 cameraRight。当检测到输入时,这些向量可以添加到相机的位置。当 cemara 旋转时,这些矢量也需要改变,与所有光线所经历的旋转相同。但是当我将这些旋转矩阵应用于表示 cameraRight 和 cameraForward 的向量时,似乎存在问题。按住 A 或 D 键会导致相机意外地以圆圈或奇怪的波浪线移动。

我设法通过使用不同的方法解决了 cameraForward 的问题。我添加了几行代码来计算中心的光线何时被“发射”并继续将 cameraForward 设置为该光线。因此,cameraForward 将始终跟随发出的中心光线,即视野的中心。但是,我不能对 cameraRight 做同样的事情,因为这个矢量不在视野中。在使用这种方法解决 cameraForward 之前,向前和向后移动也会出现同样的问题。我还尝试将其他光线之一的叉积与我认为可能会产生 cameraRight 的 cameraForward 向量相乘,但无济于事 - 更多零星的相机移动我也没有 cameraUp 的向量,因此无法计算叉积找到cameraRight。

我还认为代码可能运行了太多次,并且向量被旋转了多次。但是,在其他地方移动代码没有任何效果,并且它已经存在的方法在每一帧都运行,所以我不认为这是问题所在。

这是我向右旋转相机的代码以及进行旋转的方法。camRight 的初始值为 (0, 0, 1)

camRight = normalize(rotateVector(camRight, rotationZ));
camRight = normalize(rotateVector(camRight, rotationY));

function rotateVector(v, m) {
    return new Vector3(dot(m.a, v), dot(m.b, v), dot(m.c, v));
}

我知道这段代码的工作原理是使用相同的矩阵和方法正确旋转相机视图功能的代码。(以下代码)

myDirection = normalize(rotateVector(myDirection, rotationZ));
myDirection = normalize(rotateVector(myDirection, rotationY));

当用户按下 A 或 D 时,将运行以下代码

    if (keys[65]) {
        camPos = add(camPos, normalize(camRight));
        requestAnimationFrame(render);
    }
    if (keys[68]) {
        camPos = subtract(camPos, normalize(camRight));
        requestAnimationFrame(render);
    }

如前所述,相机正确地前后移动。最初,相机也正确地左右移动(因为它的初始值 (0, 0, 1) 是正确的),但是如果我旋转相机,cameraRight 的值就会变得疯狂。

我是不是假设错了什么?还是我的逻辑在某处有缺陷?

感谢您的帮助

标签: javascriptcameraraytracing

解决方案


推荐阅读