如何在Three.js中移动对象?

eqi*_*roo 24 javascript three.js

有没有办法在Three.js中移动一个对象?

也许我应该将rotation.x,y,z转换为向量,并处理它.但我是初学者,我不知道该怎么做.

mrd*_*oob 47

Object3D有一些方便的方法.

object.translateZ( 10 );
Run Code Online (Sandbox Code Playgroud)

  • @mrdoob是否有可能使threejs的文档更精细? (6认同)
  • @eqiproo camera.translateZ(10); (3认同)
  • 不要挑剔,但我不会认为translateZ()"移动",但更多的传送.当用3D对象描述时移动通常意味着可以看到对象以指定的方向或方式.这个方法确实改变了对象的位置:) (3认同)
  • @Ian Steffy如果你以某种速率用小增量重复translateZ,对象将会出现移动. (3认同)

www*_*.tk 7

请使用ThreeJS的创建者@mrdoob的上述答案:

object.translateZ( delta );

===老答案===

适用于旧版ThreeJS的教程:http://www.aerotwist.com/tutorials/getting-started-with-three-js/

// set position of YOUR_OBJECT
YOUR_OBJECT.position.x = 10;
YOUR_OBJECT.position.y = 50;
YOUR_OBJECT.position.z = 130;
Run Code Online (Sandbox Code Playgroud)

更多的选择:

var STEP = 10;
var newCubeMatrix = cube.matrix;        
newCubeMatrix.identity();
//newCubeMatrix.multiplySelf(THREE.Matrix4.rotationYMatrix(cube.rotation.y));
newCubeMatrix.multiplySelf(THREE.Matrix4.translationMatrix(cube.position.x, cube.position.y, cube.position.z + STEP));
cube.updateMatrix();
Run Code Online (Sandbox Code Playgroud)

这里发布的详细信息https://gamedev.stackexchange.com/questions/7490/translate-object-in-world-space-usings-its-local-rotation

  • @Tyguy7 谢谢你检查这个,那是 6 年前的事了,哈哈。刚刚更新了答案,这样观众就不会偏离事实。 (2认同)

Fel*_*des 5

相机是空间中的一个点。“前进”是空间中的另一个点。所以你可以简单地使用第二个点的坐标,并使相机位置更接近“前进”位置。

但是,您可能还需要向左和向右转,这可能涉及极坐标。

为方便起见调整这些值:

var scene;
var camera;
var playerDirection = 0;//angles 0 - 2pi
var dVector;
var angularSpeed = 0.01;
var playerSpeed = 0.075;
var playerBackwardsSpeed = playerSpeed * 0.4;
Run Code Online (Sandbox Code Playgroud)

此函数将初始化场景:

function init(){
    scene = new THREE.Scene();
    camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 );

    renderer = new THREE.WebGLRenderer();
    renderer.setSize( window.innerWidth, window.innerHeight );
    document.body.appendChild( renderer.domElement );

    camera.position.z = 5;

    dVector = new THREE.Vector3( 0, 0, 0 ) ;
    camera.lookAt( dVector );

    animate();

}
Run Code Online (Sandbox Code Playgroud)

当玩家按下向上键时,玩家的移动停止。

function key_up(event){
    playerIsMovingForward = 0;
    playerIsMovingBackwards = 0;
    playerIsRotatingLeft = 0;
    playerIsRotatingRight = 0;
    playerGoesUp = 0;
    playerGoesDown = 0;
}
Run Code Online (Sandbox Code Playgroud)

当玩家移动时,我们更新位置:

function updatePlayer(){
    if(playerIsRotatingLeft){ // rotate left
        playerDirection -= angularSpeed;
    }
    if(playerIsRotatingRight){ // rotate right
        playerDirection += angularSpeed;
    }
    if(playerIsRotatingRight || playerIsRotatingLeft){
        setPlayerDirection();

    }
    if(playerIsMovingForward){ // go forward
        moveForward(playerSpeed);

    }
    if(playerIsMovingBackwards){ // go backwards
        moveForward(-playerBackwardsSpeed);

    }

}
Run Code Online (Sandbox Code Playgroud)

我们假设您的意思是“使用 WASD 键”

function key_down(event){
    var W = 87;
    var S = 83;
    var A = 65;
    var D = 68;
    var minus = 189;
    var plus = 187;

    var k = event.keyCode;
    console.log(k);
    if(k == A){ // rotate left
        playerIsRotatingLeft = 1;
    }
    if(k == D){ // rotate right
        playerIsRotatingRight = 1;
    }
    if(k == W){ // go forward
        playerIsMovingForward = 1;
    }
    if(k == S){ // go back 
        playerIsMovingBackwards = 1;
    }


}
Run Code Online (Sandbox Code Playgroud)

玩家的移动速度只会与他的浏览器一样快。所以也许调整这个代码?

function animate() {
    requestAnimationFrame( animate );

    updatePlayer();



    renderer.render( scene, camera );
}
Run Code Online (Sandbox Code Playgroud)

这是将相机移动到 dVector 对象的位置并重新定位方向矢量 (dVector) 的代码,以便它始终位于相机的前方。

function moveForward(speed){
    var delta_x = speed * Math.cos(playerDirection);
    var delta_z = speed * Math.sin(playerDirection);
    var new_x = camera.position.x + delta_x;
    var new_z = camera.position.z + delta_z;
    camera.position.x = new_x;
    camera.position.z = new_z;

    var new_dx = dVector.x + delta_x;
    var new_dz = dVector.z + delta_z;
    dVector.x = new_dx;
    dVector.z = new_dz;
    camera.lookAt( dVector );    

}
Run Code Online (Sandbox Code Playgroud)

向前移动通常涉及向左和向右转动,这里有一些代码可以做到这一点,它还使用极坐标来移动相对于相机的点(这是“圆”的中心给定的度数(在弧度)

function setPlayerDirection(){
    //direction changed.
    var delta_x = playerSpeed * Math.cos(playerDirection);
    var delta_z = playerSpeed * Math.sin(playerDirection);

    var new_dx = camera.position.x + delta_x;
    var new_dz = camera.position.z + delta_z;
    dVector.x = new_dx;
    dVector.z = new_dz;
    console.log(dVector);
    camera.lookAt( dVector ); 
}

animate();
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助。