我正在尝试开发一个可以跟踪星星的应用程序。为此,我需要知道用户将手机指向的恒星的方位角和仰角。经过一些研究,我认为使用位置矢量来获取此类信息。我想我想出了如何使用旋转矢量获取方位角,但是我对如何获取仰角感到困惑。我能够找到这个已回答的问题:
Should i use Accelerometer or Gyroscope to measure angle of the z-axis
它引用了使用点积,我对此有所了解,但是我不确定如何使用旋转矢量来实现。所以我的问题是我是否可以使用当前代码正确获取方位角,并且stackflow链接中的已回答问题是否是使用旋转矢量获取仰角的正确方法?仅适用于加速度计。
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
Log.d(TAG, "onSensorChagnged X" + sensorEvent.values[0]);
Log.d(TAG, "onSensorChagnged Y" + sensorEvent.values[1]);
Log.d(TAG, "onSensorChagnged Z" + sensorEvent.values[2]);
if(sensorEvent.sensor.getType()== Sensor.TYPE_ROTATION_VECTOR) {
float [] orientation = new float[3];
float [] rMat = new float[9];
sensorManager.getRotationMatrixFromVector(rMat, sensorEvent.values);
mAzimuth = (int) (Math.toDegrees(SensorManager.getOrientation(rMat, orientation)[0]) + 360) % 360;
Log.d(TAG, "Azimuth Rotation" + mAzimuth);
} else if (sensorEvent.sensor.getType()==Sensor.TYPE_ACCELEROMETER && sensorEvent.sensor.getType()== Sensor.TYPE_MAGNETIC_FIELD &&
sensorEvent.sensor.getType() == Sensor.TYPE_GRAVITY){
float [] gData = new float[3];
float [] mData = new float[3];
float [] rMat = new float[9];
float [] iMat = new float[9];
float [] orientation = new float[3];
switch (sensorEvent.sensor.getType()){
case Sensor.TYPE_ACCELEROMETER:
gData = sensorEvent.values.clone();
break;
case Sensor.TYPE_GRAVITY:
gData = sensorEvent.values.clone();
break;
case Sensor.TYPE_MAGNETIC_FIELD:
mData = sensorEvent.values.clone();
break;
default: return;
}
if (SensorManager.getRotationMatrix(rMat,iMat,gData,mData)){
mAzimuth = (int) (Math.toDegrees(SensorManager.getOrientation(rMat, orientation)[0]) + 360) % 360;
Log.d(TAG, "Azimuth Tri" + mAzimuth);
}
}
}