Подтвердить что ты не робот

Как перемещать объект вперед в Three.js?

Есть ли способ переместить объект вперед в Three.js?

Возможно, мне нужно преобразовать rot.x, y, z в вектор и обработать его. Но я начинаю, и я не знаю, как это сделать.

4b9b3361

Ответ 1

У Object3D есть несколько удобных методов для этого.

object.translateZ( 10 );

Ответ 2

Пожалуйста, используйте приведенный выше ответ @mrdoob, создателя ThreeJS:

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;

Больше вариантов:

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();

подробности размещены здесь https://gamedev.stackexchange.com/questions/7490/translate-object-in-world-space-usings-its-local-rotation

Ответ 3

Камера - это точка в пространстве. "Вперед" - это еще одна точка в пространстве. так что вы можете просто использовать координаты второй точки и приблизить местоположение камеры к "прямому" положению.

однако вам также может понадобиться повернуть налево и направо, что может включать полярные координаты.

отрегулируйте эти значения для вашего удобства:

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;

эта функция инициализирует сцену:

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();

}

движение игрока останавливается, когда игрок нажимает клавишу вверх.

function key_up(event){
    playerIsMovingForward = 0;
    playerIsMovingBackwards = 0;
    playerIsRotatingLeft = 0;
    playerIsRotatingRight = 0;
    playerGoesUp = 0;
    playerGoesDown = 0;
}

когда игрок движется, мы обновляем позицию:

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);

    }

}

Мы предполагаем, что вы имели в виду "использование ключей 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;
    }


}

игрок будет двигаться только так быстро, как его браузер. так что, может быть, настроить этот код?

function animate() {
    requestAnimationFrame( animate );

    updatePlayer();



    renderer.render( scene, camera );
}

это код, который перемещает камеру в положение объекта 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 );    

}

движение вперед обычно включает в себя поворот влево и вправо, вот код, который делает это, он также использует полярные координаты, чтобы переместить точку относительно камеры (которая является центром "круга" на заданное количество градусов (в радиан)

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();

Надеюсь, это поможет.

Ответ 4

Другой вариант - использовать метод/функцию Vector3.

   position.set(x, y, z);