three.js / web-vr-boilerplate / polyfill - HMD到受控对象:轴重新映射不会重新映射旋转顺序/规则

时间:2015-10-18 16:56:37

标签: three.js polyfills webvr

我正在使用你的webvr-boilerplate并尝试将其映射到人脸网格。

我的方式是:

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;

更新2015年10月28日:

简化并在实现一些额外的调试后不是钳位问题..

重申的问题是:

将VR控件映射到具有HMD / Cardboard的不同轴配置的对象,并保持正确的旋转规则。 对象轴示例: * x - up * y - 深度 * z - side

直接交换轮换 object .rotation.x = object .rotation.z结果表明,在更新控件后,向侧面旋转会在45º之后产生不希望的旋转。

每个轴的旋转规则不同:

  • x旋转直到PI,之后反转信号并继续沿着相同的方向变化;
  • y旋转直到PI / 2并且反转方向(增加时,开始减少)
  • z等于x。

更改了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,纸板等)没有类似的路线。 也许旋转顺序和映射可供用户使用会很好。 感谢

Example - 在js控制台中尝试设置swappedAxis = true并旋转颈部。

1 个答案:

答案 0 :(得分:3)

您遇到的主要问题是gimbal lock,因为您正在使用Euler旋转。使用四元数来避免此问题。

此外,网格上的轴似乎被翻转,因此您必须考虑到这一点。

不要设置旋转的组件,只需设置四元数:

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