在我的应用中,我试图通过我从Device Orientation API获得的轮播旋转对象组。
在某些时候,我想校准物体的旋转,使其看起来与我的相机方向相同。 (有旋转值(0,0,0)!)
但是因为我通过
设置对象旋转var euler = new THREE.Euler(x, y, z, 'ZXY'); // angles come from Device Orientation
this.object.setRotationFromEuler(euler);
我的对象始终采用我的设备的绝对旋转。为了校准这个,我想在我的小组上设置一个轮换,然后应用'旋转矩阵到组。有效地将它的旋转值x,y,z设置为0,这样我可以再次使用绝对值设置它们,但组应该相对于校准旋转旋转。
之前我曾尝试this,但由于我的小组没有几何形状,所以它不会起作用。我是否必须遍历每个子对象并将旋转应用于每个几何体,或者是否有任何方法可以将旋转状态设置为' base'对于一个团体?
我能想到的唯一其他解决方案是将当前旋转值保存在校准请求中并始终相对于那些旋转,但如果有这样的方法会很好。
答案 0 :(得分:1)
有三种方式可以想到。
一个 - 正如您已经说过的那样 - 您可以将校准旋转应用于组中的所有几何图形,但在这种情况下听起来不正确,因为您没有自己校准模型。
您还提到了下一个,即在将模型应用到模型之前,使用一些校准偏移调整设备方向值。这可能是最简单的选项,并允许您在将值输入模型之前添加其他内容,如衰减和传感器融合(在加速时预测运动)和类似的事情。
我能想到的最后一种方法是使用另一个组作为校准参考,并在执行校准时更新它的旋转。这看起来像这样:
var reference = new THREE.Group();
var model = new THREE.Group();
// your model goes here
model.add(new THREE.Mesh(
new THREE.BoxGeometry(1,1,1),
new THREE.MeshStandardMaterial()
));
reference.add(model);
scene.add(reference);
// (not shown) model-rotation will always be updated with
// unmodified device-orientation data.
// for calibration, set rotation of the reference-group to the
// inverse of the current global rotation of the model.
// That way the overall rotation of the model should be zero for the
// current value from device-orientation (using the world/global rotation
// makes this repeatable regardless of previous calibration-values)
function onCalibration() {
reference.quaternion
.copy(model.getWorldQuaternion())
.inverse();
}