在java中旋转3d矢量

时间:2013-01-07 16:04:38

标签: java android math vector geometry

我从传感器管理器获取了设备的磁性XYZ值。

然而,这些是设备观点的XYZ值。

device's point of view

问题是,我希望那些坐标(磁铁值的三维矢量)向北旋转。我希望在我转动并按住设备时看到相同的XYZ 值。

使用时

SensorManager.getRotationMatrix(R, I, accel, m);
SensorManager.getOrientation(R, v);

我在向量v []中得到设备方向的XYZ。

现在我需要做什么来旋转原始矢量以适应北方?

这是我正在寻找的最终结果:

as seen, i get the same xyz values for any orientation of the device

如图所示,我为设备的任何方向获得相同的xyz值

编辑:

我尝试添加此内容:

Location l=null;
GeomagneticField field = new GeomagneticField((float) l.getLatitude(),(float) l.getLongitude(),(float) l.getAltitude(),l.getTime());

我从field.getX()得到的数据是无效的(也许是因为我使用的是空位...?)。 任何想法,我可以找到一个示例代码来帮助我?

感谢, 佬

2 个答案:

答案 0 :(得分:0)

而不是

SensorManager.getOrientation(R, v);

将为您提供设备的方向,请使用

GeomagneticField::getX();
GeomagneticField::getY();
GeomagneticField::getZ();

这些将为您提供磁场的分量,与设备的方向无关。

答案 1 :(得分:0)

OK!我终于能够转向载体了。

我使用了迈克的建议并尝试了旋转矩阵的东西..

重点是将当前旋转矩阵从SensorManager中取出,并将其与磁性值的xyz矢量相乘(取决于设备方向)。

enter image description here

A是旋转矩阵,xyz是我的磁力值矢量。

这是你在代码中写的方式

SensorManager.getRotationMatrix(R, I, accel, m);
m[0]=Math.round(m[0]);//X
m[1]=Math.round(m[1]);//Y
m[2]=Math.round(m[2]);//Z
v[0]=Math.round((m[0]*R[0] )+(m[1]*R[1])+(m[2]*R[2]));
v[1]=Math.round((m[0]*R[3] )+(m[1]*R[4])+(m[2]*R[5]));
v[2]=Math.round((m[0]*R[6] )+(m[1]*R[7])+(m[2]*R[8]));

其中'm'是从传感器接收的磁性值:

public void onSensorChanged(SensorEvent event) {
    switch(event.sensor.getType()) {
        case Sensor.TYPE_MAGNETIC_FIELD:
             System.arraycopy(event.values, 0, m, 0, 3);
             break;
    }
}