我有一个摄像头在场景中以几种不同的方式移动.相机应围绕目标位置旋转.在我的情况下,这是用户定位的网格上的一点.因为摄像机通常不需要相对于这一点移动,所以我无法在这里使用枢纽的想法:
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);
它似乎是一样的行为.感谢所有帮助到目前为止!
还有一件事!问题的一部分是,当相机的行为非常接近北极或南极.我正在寻找一种“自由漫游”的感觉.
解决方法
将以下内容放在渲染循环中:
camera.position.x = target.position.x + radius * Math.cos( constant * elapsedTime ); camera.position.z = target.position.z + radius * Math.sin( constant * elapsedTime ); camera.lookAt( target.position ); renderer.render( scene,camera );
或者,您可以使用THREE.OrbitControls或THREE.TrackballControls.请参阅three.js示例.