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

标签 javascript three.js webgl

我有一个相机在场景中以几种不同的方式移动。相机应围绕目标位置旋转。在我的例子中,这是用户瞄准的网格上的一个点。因为相机通常不需要相对于这一点移动,所以我无法在这里使用枢轴的想法: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 的情况下使用上面的代码,我们会围绕该点旋转,但不会查看该点。我的理解是我的方法应该像相机本身旋转一样旋转相机的 View ,但相机只旋转了少量。谁能帮助我了解问题出在哪里?

编辑:清理了原始帖子和代码,希望能澄清我的问题。

我的想法是我可以平移到原点(我的目标位置),旋转我想要的量,然后平移回起始位置。因为旋转,我期望在一个新的位置看原点。

事实上,我现在在没有使用翻译矩阵的情况下进行测试,所以矩阵乘法线是:

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.OrbitControlsTHREE.TrackballControls。请参阅 three.js 示例。

关于javascript - Three.js 围绕物体旋转相机(可能会移动),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15030078/

相关文章:

javascript - 重叠范围输入。单击具有最接近值的更改输入

javascript - 如何在 three.js 中随机化网格上面的大小?

javascript - Sprite 未加载 - Three.JS

opengl-es - WebGL - gl.useProgram() 是一个昂贵的调用吗?

azure - 如何在服务器端运行 WebGL 和 JavaScript?

javascript - 在 jQuery 中处理快速点击

javascript - 如何找到支持HTML5和CSS3的智能电视?

javascript - 如何检测指令中的用户交互

javascript - Three.js 当渲染器位于 div 而不是整个窗口时如何获取准确的世界坐标

javascript - Javascript 中的 gluProject 等效项