我有一个嵌入芯片的加速度计和陀螺仪,从中我得到x,y,z轴(来自加速度计),俯仰,滚转和偏航(来自陀螺仪)。使用这些值,我必须旋转3D图像。 glRotatef(Angle,Xvector,Yvector,Zvector)
如何从俯仰,滚转和偏航中找到角度?这方面的任何等式?
答案 0 :(得分:2)
从陀螺仪接收的那些旋转值不应被视为关于不同轴的单独旋转,而是将时间差视为复合旋转。您的问题是您希望找到差分旋转矩阵dR的形式,差分分量可以按任意顺序乘以产生该矩阵
dR = dR_x * dR_y * dR_z
= dR_y * dR_x * dR_z
= dR_y * dR_z * dR_x
= dR_z * dR_x * dR_y
= dR_z * dR_y * dR_x
最简单的方法是计算每个排列,并将它们的平均矩阵设为dR'并应用正交归一化。
然后只使用这个矩阵。忘掉glRotate,你不需要它,无论如何它都会从以后的OpenGL版本中删除。
答案 1 :(得分:0)
您对android accelerator_sensor的俯仰和偏航角的回答是:
双角= Math.atan2(zVal,yVal)/(Math.PI / 180)//用于音调
double angle = Math.atan2(xVal,yVal)/(Math.PI / 180)//对于偏航角
他们已经过测试。
private SensorManager sensorManager;
TextView x;
TextView y;
TextView z;
TextView ang;
String sx, sy, sz;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.l1);
x = (TextView) findViewById (R.id.textView2);
y = (TextView) findViewById (R.id.textView3);
z = (TextView) findViewById (R.id.textView4);
ang = (TextView) findViewById(R.id.textView5);
sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
sensorManager.registerListener(this, sensorManager.getDefaultSensor
(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);
}
@Override
public void onAccuracyChanged(Sensor arg0, int arg1) {
}
@Override
public void onSensorChanged(SensorEvent event) {
if(event.sensor.getType() == Sensor.TYPE_ACCELEROMETER){
float xVal = event.values[0];
float yVal = event.values[1];
float zVal = event.values[2];
sx = "X Value : <font color = '#800080'> " + xVal + "</font>";
sy = "Y Value : <font color = '#800080'> " + yVal + "</font>";
sz = "Z Value : <font color = '#800080'> " + zVal + "</font>";
x.setText(Html.fromHtml(sx));
y.setText(Html.fromHtml(sy));
z.setText(Html.fromHtml(sz));
double angle = Math.atan2(zVal, xVal)/(Math.PI/180);
ang.setText(String.valueOf(angle));
}
}