我有一个相机,它在场景中以几种不同的方式移动。相机应围绕目标位置旋转。就我而言,这是用户定位的网格上的一个点。因为相机通常不需要相对于这一点移动,所以我无法在这里使用枢轴的想法: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,0,0), 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);
它的行为似乎相同。感谢您迄今为止的所有帮助!
还有一件事!问题的一部分是当相机在北极或南极附近表现不佳时。我正在寻找一种“自由漫游”的感觉。