我正在使用threeVR制作360度全景照片。它使用移动设备方向在球体内旋转相机,并允许用户在触摸时手动拖动球体。
但是,当用户松开触摸时,相机会跳回设备旋转。我想修改此行为,以便当用户释放触摸时,相机会保持当前围绕Y轴的旋转(但不是X和Z)。
我不理解四元数的数学,但我尝试修改DeviceOrientationController.js上的方法updateDeviceMove来添加以下代码,它确实适用于Y轴,但是它与Z轴相混淆。
// manuallyMoved is a flag that I set to true on touchend event
// objQuat is the rotation of the camera after user dragged the view
// deviceQuat is the rotation to be applied, obtained from device orientation values
// The code below replaces the line:
// this.object.quaternion.copy( deviceQuat );
if( manuallyMoved ) {
objY = rotation.setFromQuaternion( objQuat, 'YXZ' ).y;
realY = rotation.setFromQuaternion( deviceQuat, 'YXZ' ).y;
manQuat = new THREE.Quaternion().setFromAxisAngle( new THREE.Vector3(0,1,0), (objY - realY) );
deviceQuat.multiply( manQuat );
manuallyMoved = false;
}else{
this.object.quaternion.slerp( deviceQuat, 0.07 );
}
由于代码与Z值混淆,我认为setFromAxisAngle可能不是这样做的。如何修改deviceQuat以应用拖动的Y旋转,但允许相机从那里使用设备方向?
这是使用随机图像的link to my demo。