代码之家  ›  专栏  ›  技术社区  ›  EldarGranulo

根据给定的相机旋转和位置计算轨道控制的相机目标

  •  1
  • EldarGranulo  · 技术社区  · 6 年前

    我在使用轨道控制时有以下问题。我把摄像机目标设为0,0,0。然后在ajax调用之后,我手动设置相机的位置和旋转。在轨道控制更新调用之后,相机的旋转将重置。

    我发现这是因为当调用“动态观察控制更新”时,相机的旋转是从相机位置和“动态观察控制”的目标计算出来的。

    有什么办法解决这个问题吗?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Brakebein    6 年前

    在对相机应用变换之前,我会保存相机和目标之间的距离。之后,我会把目标放在摄像机前面,并保持相应的距离。

    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() 是的。

    enter image description here