在 Three.js 中将相机向后和向前移动

13

如何从一个固定点沿着摄像机所面朝的轨迹向前或向后移动摄像机?

我知道有几个控制脚本可以实现这一点,但我需要做一些定制化的东西,而且我无法分解他们的代码以找出如何隔离上述行为。

我看到这个答案,我认为它回答了这个问题,并想出了这段代码:

cameraPosition = camera.position
cameraRotation = new THREE.Vector3(camera.rotation._x, camera.rotation._y, camera.rotation._z)
newCamera = new THREE.Vector3().addVectors(cameraPosition, cameraRotation)
camera.position.set(newCamera.x, newCamera.y, newCamera.z)
camera.updateProjectionMatrix()

但这似乎是将相机移动在一个圆圈中,而不是前后移动。

如有任何帮助,将不胜感激。谢谢!


您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - ampawd
请参见 https://dev59.com/N5jga4cB1Zd3GeqPJmaS#38057216。 - WestLangley
1
请再次阅读我发布的链接。 - WestLangley
@WestLangley 你是对的。很抱歉我之前没有检查过。我以为 camera.translateZ( x )camera.position.z += x; 是一样的。但我错了。谢谢! - bravokiloecho
2个回答

20

要使相机朝着它所面对的方向前进或后退,可以使用

camera.translateZ( - distance );
或者
camera.translateZ( distance );

three.js r.78


4
不出所料,“camera.translateX”和“camera.translateY”分别将相机沿着水平方向和上下方向进行相机相对平移。 - Symbolic
但这也会使相机向下移动,而不仅仅是向前移动。 - Displee

8

以下是如何通过更新 camera.position.z 来实现。使用 W 键向前移动,使用 S 键向后移动。

var camera, scene, renderer, geometry, material, mesh;

init();
animate();

function init() {

    scene = new THREE.Scene();

    camera = new THREE.PerspectiveCamera(50, window.innerWidth / window.innerHeight, 1, 10000);
    camera.position.z = 500;
    scene.add(camera);

    geometry = new THREE.CubeGeometry(200, 200, 200);
    material = new THREE.MeshNormalMaterial();

    mesh = new THREE.Mesh(geometry, material);
    scene.add(mesh);

    renderer = new THREE.WebGLRenderer( { antialias: true } );
    renderer.setSize(window.innerWidth, window.innerHeight);
    
    document.body.appendChild(renderer.domElement);
    document.body.addEventListener( 'keydown', onKeyDown, false );

}

function animate() {

    requestAnimationFrame(animate);
    render();

}

function render() {
    mesh.rotation.x += 0.01;
    mesh.rotation.y += 0.02;

    renderer.render(scene, camera);
}

function onKeyDown(){
switch( event.keyCode ) {
   case 83: // up
   camera.position.z += 50;
   break;
   case 87: // down
   camera.position.z -= 50;
   break;
}
   
}
<script src="https://ajax.googleapis.com/ajax/libs/threejs/r76/three.min.js"></script>


感谢您的回复。不过我想我应该更具体一些......在我的场景中,相机的x、y和z位置已经设置好,并且指向场景的中心。我希望将相机沿着它面对的轨迹移动。我已经修改了您上面的代码以进行演示:https://jsfiddle.net/a9rhtLnk/ - 现在相机可以移动到立方体上方,但我想让它移动进入立方体。 - bravokiloecho
camera.lookAt( mesh.position ); 会将视角对准立方体。 - Stubbies

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接