Элементы управления камерой противоположны тому, что они должны быть. Почему?

Я создаю играбельный лабиринт в Three.js. Все объекты — пол, потолок и стены — размещены в пределах положительных осей X и Z. Камера размещена так:

camera = new THREE.PerspectiveCamera(45,
                                         window.innerWidth / window.innerHeight,
                                         0.1,
                                         1000
    );
    camera.position.set(0, 0.25, 0);

    // The camera is placed pointing to the nearest open path from the
    // initial position. Check mazeGenerator.js for the reference of
    // "coordinates".
    if(grid[1][0] == coordinates.W)
    {
        camera.lookAt(new THREE.Vector3(1, 0.25, 0));
    }
    else
    {
        camera.lookAt(new THREE.Vector3(0, 0.25, 1));
    }

и движется так:

function keyboardCheck()
{
    var movementSpeed = 0.02;
    var rotationSpeed = 0.03;

    if(keyboard.pressed('w') || keyboard.pressed('up'))
    {
        camera.translateZ(-movementSpeed);
    }

    if(keyboard.pressed('a') || keyboard.pressed('left'))
    {
        camera.rotateY(rotationSpeed);
    }

    if(keyboard.pressed('d') || keyboard.pressed('right'))
    {
        camera.rotateY(-rotationSpeed);
    }
}

Если я размещаю камеру без функции lookAt, кажется, что она смотрит на [0, 0, 0], но, конечно же, я хотел немного помочь игроку, направив камеру на ближайший открытый путь.

Чтобы заставить его двигаться вперед, я должен уменьшить Z, потому что в противном случае, когда вы нажимаете клавишу «движение вперед», он движется назад. Это наводит меня на мысль, что хотя я говорю камере смотреть в определенном направлении, ось Z объекта противоположна оси Z мира.

Сам вопрос: почему так происходит?

Заранее большое спасибо.


person MikelAlejoBR    schedule 21.05.2017    source источник


Ответы (1)


Камера смотрит вниз по отрицательной оси Z, поэтому, чтобы двигаться вперед, сделайте следующее:

camera.translateZ( - distance );

Считается, что все остальные объекты смотрят в направлении их положительной оси z, поэтому для перемещения других объектов вперед вы должны использовать

object.translateZ( distance );

три.js р.85

person WestLangley    schedule 21.05.2017