three.js / web-vr-boilerplate / polyfill - HMD 受控 object:Axis 重新映射不重新映射也旋转 order/rules
three.js / web-vr-boilerplate / polyfill - HMD to controlled object:Axis re-mapping does not re-map also rotation order/rules
我正在使用您的 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 - 向上
* y - 深度
* z - 边
仅通过交换旋转
object .rotation.x = object .rotation.z
结果是,在更新控件后,旋转到侧面会在 45º 后进行不希望的旋转。
每个轴的旋转规则不同:
- x 旋转直到 PI,然后反转信号并继续沿相同方向变化;
- y 旋转直到 PI/2 然后反转方向(增加时开始减少)
- z 等于 x。
更改了 webvr-polyfill.js
并修复了 keyboard/mouse 的问题:
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
并旋转颈部。
您 运行 遇到的主要问题是 gimbal lock 因为您使用的是欧拉旋转。使用四元数来避免这个问题。
此外,您的网格上的轴似乎翻转了,因此您必须考虑到这一点。
不用设置旋转分量,只设置四元数:
mesh.skeleton.bones[neckVRControlBone].quaternion.set(
pivot.quaternion.y,
-pivot.quaternion.z,
-pivot.quaternion.x,
pivot.quaternion.w
);
我正在使用您的 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 - 向上 * y - 深度 * z - 边
仅通过交换旋转
object .rotation.x = object .rotation.z
结果是,在更新控件后,旋转到侧面会在 45º 后进行不希望的旋转。
每个轴的旋转规则不同:
- x 旋转直到 PI,然后反转信号并继续沿相同方向变化;
- y 旋转直到 PI/2 然后反转方向(增加时开始减少)
- z 等于 x。
更改了 webvr-polyfill.js
并修复了 keyboard/mouse 的问题:
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
并旋转颈部。
您 运行 遇到的主要问题是 gimbal lock 因为您使用的是欧拉旋转。使用四元数来避免这个问题。
此外,您的网格上的轴似乎翻转了,因此您必须考虑到这一点。
不用设置旋转分量,只设置四元数:
mesh.skeleton.bones[neckVRControlBone].quaternion.set(
pivot.quaternion.y,
-pivot.quaternion.z,
-pivot.quaternion.x,
pivot.quaternion.w
);