目前,我正在尝试使用方向传感器的值(使用 getRotation() 方法)旋转3D立方体。但是,在Android设备超过某些限制时,会出现一些意外的行为。例如,如果我让设备“竖起来”,则“翻滚”的值就会变得疯狂。
另外,我也遇到了类似于所谓的万向节锁定现象。唯一的区别是,在将传感器值应用于3D旋转之前,我就已经遇到了这个问题。当我尝试仅围绕“俯仰”轴旋转设备以更改“俯仰”值时,“偏航”值也会根据俯仰的旋转而改变。这对我来说完全不合理。
能否有人帮帮我? 我已经被这个问题困扰了一个月。
目前,我正在尝试使用方向传感器的值(使用 getRotation() 方法)旋转3D立方体。但是,在Android设备超过某些限制时,会出现一些意外的行为。例如,如果我让设备“竖起来”,则“翻滚”的值就会变得疯狂。
另外,我也遇到了类似于所谓的万向节锁定现象。唯一的区别是,在将传感器值应用于3D旋转之前,我就已经遇到了这个问题。当我尝试仅围绕“俯仰”轴旋转设备以更改“俯仰”值时,“偏航”值也会根据俯仰的旋转而改变。这对我来说完全不合理。
能否有人帮帮我? 我已经被这个问题困扰了一个月。
这是一个基本的例子,它将返回重力向量。请注意,您可以更改传感器类型和采样速度,更多细节在这里
SensorManager sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
Sensor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
sensorManager.registerListener(new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent event) {
float x = event.values[0];
float y = event.values[1];
float z = event.values[2];
double total = Math.sqrt(x * x + y * y + z * z);
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
}, sensor, SensorManager.SENSOR_DELAY_FASTEST);
使用四元数计算Yaw、Pitch和Roll并不能解决任何问题。万向锁问题(在接近俯仰角度为+/-90时,细微的变化/噪声会使得偏航和横滚 -- 实际上是在北极的偏航-横滚 -- 反应异常)依旧存在。
然而,如果您使用Yaw、Pitch和Roll值来旋转一个三维对象,则不会在万向锁位置附近表现出任何奇怪的行为。只是Yaw和Roll中的模糊性会出现,并且Yaw和Roll的大变化并不意味着实际方向会出现问题 -- 只是在俯仰角接近90度时,方向对Yaw-Roll的大变化不敏感。
但是,也请注意手机和HTML5浏览器未按照Android规范正确实现Yaw、Pitch和Roll。以下是一个很好的博客供参考:
http://www.sensorplatforms.com/understanding-orientation-conventions-mobile-platforms/