three.js / web-vr-boilerplate / polyfill - HMD для контролируемого объекта: переназначение осей не переназначает также порядок/правила вращения

Я использую ваш шаблон webvr и пытаюсь сопоставить его с сеткой человеческого лица.

Как я это делаю:

1) прикрепить камеру к глазной кости

основной скрипт js:

//add camera to eye
mesh.skeleton.bones[ 22 ].add(camera);

//resets camera rotation
camera.rotation.set(0,0,0);

//looks at mesh up direction to face front
camera.lookAt( mesh.up );

//moves camera to middle of eyes 
camera.position.set(10,10,0);

2) изменить webvr-manager.js, чтобы обновить положение и вращение кости шеи (передается как аргумент при инициализации), а в index.php я поменяю местами ось, чтобы она соответствовала осью HMD с осью кости:

webvr-manager.js:

if ( state.orientation !== null ) {

     object.quaternion.copy( state.orientation );

 }

if ( state.position !== null ) {

     object.position.copy( state.position ).multiplyScalar( scope.scale );

 }

основной скрипт js:

 /* INSIDE UPDATE CYCLE */

// mesh.rotation.y+=0.1;
controls.update();

//resets bone position to default
mesh.skeleton.bones[ neckVRControlBone ].position.set(neckInitPosition.x,neckInitPosition.y,neckInitPosition.z) ;


//ROTATION SWAP
mesh.skeleton.bones[ neckVRControlBone ].rotation.x = pivot.rotation.y;

mesh.skeleton.bones[ neckVRControlBone ].rotation.y = - pivot.rotation.z;

mesh.skeleton.bones[ neckVRControlBone ].rotation.z = - tempRotation;

ОБНОВЛЕНИЕ 28.10.2015:

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

Переформулированная проблема:

Чтобы сопоставить элементы управления VR с объектом, который имеет другую конфигурацию осей HMD/Cardboard и сохранить правильные правила вращения. Пример оси объекта: * x - вверх * y - глубина * z - сторона

Замена поворотов всего на object .rotation.x = object .rotation.z приводит к тому, что после обновления элементов управления поворот в сторону приводит к нежелательному повороту после 45º.

Правила вращения для каждой оси разные:

  • x вращается до PI, после чего инвертирует сигнал и продолжает изменяться в том же направлении, в котором он был;
  • y вращается до PI/2 и после инвертирует направление (при увеличении начинает уменьшаться)
  • г равно х.

Изменено webvr-polyfill.js и исправлено для клавиатуры/мыши следующим образом:

MouseKeyboardPositionSensorVRDevice.prototype.getState = function() {
   // this.euler.set(this.phi, this.theta, 0, 'YXZ');
   this.euler.set( this.theta , 0, - this.phi, 'YXZ');

Но никоим образом не похожая линейка на другие контроллеры (HMD, картон и т.п.). Может быть, было бы неплохо, чтобы порядок вращения и сопоставление были доступны пользователю. Спасибо

Пример — попробуйте установить swappedAxis = true в консоли js и повернуть шею.


person Rui d'Orey    schedule 18.10.2015    source источник
comment
пример не работает   -  person wizztjh    schedule 28.10.2015
comment
в чем проблема? Я использовал полифил webvr. Нет ограничений на вращение VR HMD.   -  person wizztjh    schedule 28.10.2015
comment
Ты прав. существует только ограничение на просмотр вверх/вниз с помощью мыши/клавиатуры. но после дополнительной отладки я понял, что проблема в другом. Я обновил свой вопрос!   -  person Rui d'Orey    schedule 28.10.2015


Ответы (1)


Основная проблема, с которой вы сталкиваетесь, это карданная блокировка, потому что вы используете эйлеровы вращения. Используйте кватернионы, чтобы избежать этой проблемы.

Кроме того, оси вашей сетки кажутся перевернутыми, так что вы должны учитывать это.

Вместо установки компонентов вращения просто установите кватернион:

mesh.skeleton.bones[neckVRControlBone].quaternion.set(
    pivot.quaternion.y,
    -pivot.quaternion.z,
    -pivot.quaternion.x,
    pivot.quaternion.w
);
person brianpeiris    schedule 08.11.2015