【问题标题】:Calculate camera target for orbit controls from given rotation and position of camera根据给定的相机旋转和位置计算轨道控制的相机目标
【发布时间】:2018-07-09 17:27:09
【问题描述】:

我在使用轨道控制时遇到以下问题。我将相机目标设置为 0、0、0。然后在 AJAX 调用之后,我手动设置相机位置和旋转。在轨道控制更新调用后,相机的旋转被重置。

我发现发生这种情况是因为当调用轨道控制更新时,相机的旋转是根据相机位置和轨道控制的目标来计算的。

有没有办法解决这个问题?

【问题讨论】:

    标签: javascript three.js 3d


    【解决方案1】:

    在将变换应用于相机之前,我会保存相机和目标之间的距离。之后,我会将目标以相应的距离放在相机前面。

    var distance = new THREE.Vector3().subVectors(camera.position, controls.target).length();
    
    // apply transformation - matrix, euler rotation, or quaternion?
    
    var normal = new THREE.Vector3(0,0,-1).applyQuaternion(camera.quaternion);
    // instead of quaternion, you could also use .applyEuler(camera.rotation);
    // or if you used matrix, extract quaternion from matrix
    
    controls.target = new THREE.Vector3().add(camera.position).add(normal.setLength(distance));
    

    编辑: 您能否另外解释一下为什么在计算法线时使用向量 (0, 0, -1)?

    在计算机图形学中,相机的局部坐标系通常是 x 轴正向指向右侧,y 轴正向指向上方,因此您所看的方向是 z 轴负向。对于上面的计算,我需要相机的方向 - 从本地空间 (0,0,-1) 到世界空间 (0,0,-1).applyQuaternion()

    【讨论】:

    • 您能否另外解释一下为什么在计算法线时使用向量 (0, 0, -1)?
    • 我添加了一些解释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-18
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多