2013-09-06 6 views
1

Я пытаюсь использовать геймпад для поворота камеры в Three.js, используя элементы управления стилем от первого лица.Порядок вращения камеры с тремя .js

Браузер обнаруживает геймпад и распознает его вход, но порядок вращения камеры неправильный. Когда я вращаюсь на локальной оси Y камеры, он учитывает также местное вращение X, что нежелательно.

Кажется, у меня такая же проблема, как this guy, но его проблема была решена с помощью three.js R54 и я m, используя r60. Он установил camera.eulerOrder = "YXZ";, чтобы заставить его работать, но текущий эквивалент camera.rotation.order = "YXZ";, похоже, не работает для меня.

Я знаю о встроенном классе «FirstPersonControls» от Three.js, но он не подходит для меня, так как он не принимает вход контроллера, и было бы бесполезно, если бы он помог другим элементам управления без движения там позже , Я также знаю о gamepad.js и не заинтересован в его использовании.

Может ли кто-нибудь помочь?

Мой поворот Код:

function pollGamepad() 
{ 
    gamepad = navigator.webkitGetGamepads()[0]; 

    //Rotation 
    if(gamepad.axes[3] > 0.20) 
    { 
     camera.rotateX(-gamepad.axes[3] * 0.02); 
    } 
    if(gamepad.axes[3] < -0.20) 
    { 
     camera.rotateX(-gamepad.axes[3] * 0.02); 
    } 

    if(gamepad.axes[2] < -0.20) 
    { 
     camera.rotateY(-gamepad.axes[2] * 0.02); 
    } 
    if(gamepad.axes[2] > 0.20) 
    { 
     camera.rotateY(-gamepad.axes[2] * 0.02); 
    } 
} 

ответ

1

Подход, который PointerLockControls использует это, чтобы создать иерархию объектов: yawObject содержит pitchObject содержит camera. Тогда движение горизонтальной мыши (или джойстика) изменит Y-поворот объекта рыскания, движение вертикальной мыши (или джойстика) изменит X-поворот объекта основного тона, а поворот камеры останется фиксированным по умолчанию (0, 0, -1). Это просто вручную имитирует заказы Euler YXZ, но это может сработать лучше для вас. Это создает некоторую неловкость, если вам нужно получить общее вращение.

В пользовательском контроллере, который я написал недавно, я получил тот же результат, что и камера, до одного родительского объекта и установив порядок Эйлера родительского объекта в YXZ. Я не помню, почему это работало лучше, чем устанавливать его прямо на камеру, но так оно и было.

+0

Спасибо Icemonster, это очень помогло. – user23709

+0

Я просто поместил свою камеру внутри родительского объекта и применил весь перевод и рывок к этому, любой шаг затем применяется к самой камере, и это, кажется, работает очень хорошо, сохраняя все просто. – user23709

0

Я столкнулся с этой проблемой сам, и я придумал простое решение. Всегда инвертируйте поворот камеры до нуля до выполнения поворота y. Затем верните x вращение. Итак:

// Rotate camera Fps style 
function rotateCamera(dx,dy){ 
    //store previous x rotation 
    var x = camera.rotation.x; 

    //reset camera's x rotation. 
    camera.rotateX(-x); 

    //rotate camera on y axis 
    camera.rotateY(dy); 

    //check if we are trying to look to high or too low 
    if (Math.abs(dx + x) > Math.Pi/2 - 0.05) { 
     camera.rotateX(x); 
    else 
     camera.rotateX(x+dx); 

    //reset z rotation. Floating point operations might change z rotation during the above operations. 
    camera.rotation.z = 0; 
} 
Смежные вопросы