【发布时间】:2018-07-09 17:27:09
【问题描述】:
我在使用轨道控制时遇到以下问题。我将相机目标设置为 0、0、0。然后在 AJAX 调用之后,我手动设置相机位置和旋转。在轨道控制更新调用后,相机的旋转被重置。
我发现发生这种情况是因为当调用轨道控制更新时,相机的旋转是根据相机位置和轨道控制的目标来计算的。
有没有办法解决这个问题?
【问题讨论】:
标签: javascript three.js 3d
我在使用轨道控制时遇到以下问题。我将相机目标设置为 0、0、0。然后在 AJAX 调用之后,我手动设置相机位置和旋转。在轨道控制更新调用后,相机的旋转被重置。
我发现发生这种情况是因为当调用轨道控制更新时,相机的旋转是根据相机位置和轨道控制的目标来计算的。
有没有办法解决这个问题?
【问题讨论】:
标签: javascript three.js 3d
在将变换应用于相机之前,我会保存相机和目标之间的距离。之后,我会将目标以相应的距离放在相机前面。
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()。
【讨论】: