javascript – Three.js围绕物体旋转相机(可能会移动)

我有一个摄像头在场景中以几种不同的方式移动.相机应围绕目标位置旋转.在我的情况下,这是用户定位的网格上的一点.因为摄像机通常不需要相对于这一点移动,所以我无法在这里使用枢纽的想法: 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示例.

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...