我有一个摄像头在场景中以几种不同的方式移动.相机应围绕目标位置旋转.在我的情况下,这是用户定位的网格上的一点.因为摄像机通常不需要相对于这一点移动,所以我无法在这里使用枢纽的想法:
https://github.com/mrdoob/three.js/issues/1830.我当前的解决方案使用以下代码:
var rotationY = new THREE.Matrix4();
var rotationX = new THREE.Matrix4();
var translation = new THREE.Matrix4();
var translationInverse = new THREE.Matrix4();
var matrix = new THREE.Matrix4();
function rotateCameraAroundObject(dx,dy,target) {
// collect up and right vectors from camera perspective
camComponents.up = rotateVectorForObject(new THREE.Vector3(0,1,0),camera.matrixWorld);
camComponents.right = rotateVectorForObject(new THREE.Vector3(1,camera.matrixWorld);
matrix.identity();
rotationX.makeRotationAxis(camComponents.right,-dx);
rotationY.makeRotationAxis(camComponents.up,-dy);
translation.makeTranslation(
target.position.x - camera.position.x,target.position.y - camera.position.y,target.position.z - camera.position.z);
translationInverse.getInverse(translation);
matrix.multiply(translation).multiply(rotationY).multiply(rotationX).multiply(translationInverse);
camera.applyMatrix(matrix);
camera.lookAt(target.position);
}
问题是我们不想使用lookAt,因为重新定位.我们希望能够删除该行.
如果我们在没有lookAt的情况下使用上面的代码,我们围绕点旋转,但我们不看这一点.我的理解是,我的方法应该像相机本身旋转一样旋转相机的视图,而是相机旋转的次数很少.有人可以帮助我了解错误吗?
编辑:清理原来的帖子和代码,希望澄清我的问题.
我的想法是,我可以翻译成起源(我的目标位置),旋转我想要的数量,然后翻译回到起始位置.由于旋转,我希望在一个新的位置看起源.
实际上,我现在正在测试它,而不使用翻译矩阵,所以矩阵乘法线是:
matrix.multiply(rotationY).multiply(rotationX);
它似乎是一样的行为.感谢所有帮助到目前为止!
还有一件事!问题的一部分是,当相机的行为非常接近北极或南极.我正在寻找一种“自由漫游”的感觉.