2014-10-06 336 views
2

我正在使用android的旋转矩阵在空间中旋转多个点。使用旋转矩阵在空间中旋转点

工作至今

我通过读取SensorManager.getRotationMatrix函数矩阵开始。接下来,我使用this link中给出的解释将旋转矩阵转换为四元数。我这样做是因为我读到欧拉角可能导致Gimbal锁定问题,并且使用3x3矩阵的操作可能是详尽无遗的。 source

问题

现在我想做的是:想象一下手机是参考的起源和给定一组点(预期的LAT /经度坐标转换为XYZ坐标系参见方法波纹管)我想旋转它们,以便检查哪些是在我的视线上。为此我使用的是this SO question,它返回一个X和Y(分别是左和顶)来显示屏幕上的点。它工作正常,但只在朝北时才起作用(因为它不考虑方向,我的投影向量使用南/北作为X,东/西作为Z)。所以我的想法是旋转所有对象。即使初始高度(Y)为0,我也希望能够根据手机的方向来定位点的上/下。

我认为部分解决方案可能在this post。但由于这使用欧拉角度,我不认为这是最好的方法。

结论

所以,如果它真的不如旋转每个点的位置我怎么能存档,使用旋转四元数?否则哪种方法更好?

对不起,如果我在这篇文章中说错了。我不擅长物理学。

代码

//this functions returns a 3d vector (0 for Y since I'm discarding altitude) using 2 coordinates 
public static float[] convLocToVec(LatLng source, LatLng destination) 
{ 
    float[] z = new float[1]; 
    z[0] = 0; 
    Location.distanceBetween(source.latitude, source.longitude, destination 
      .latitude, source.longitude, z); 
    float[] x = new float[1]; 
    Location.distanceBetween(source.latitude, source.longitude, source 
      .latitude, destination.longitude, x); 
    if (source.latitude < destination.latitude) 
     z[0] *= -1; 
    if (source.longitude > destination.longitude) 
     x[0] *= -1; 

    return new float[]{x[0], (float) 0, z[0]}; 
} 

感谢您的帮助,并有一个愉快的一天。


UPDATE 1

根据Wikipedia

计算3×3旋转矩阵R的矩阵积和 原来3×1列的矩阵表示v→。这需要3×(3 乘法+2加法)= 9乘法和6加法, 旋转矢量的最有效的方法。

我真的应该使用旋转矩阵来旋转矢量吗?

回答

0

由于没有人回答我在这里回答自己。

经过一番研究(实际上很多)后,我得出结论是的,它有可能使用四元数旋转矢量但你最好将它转换成旋转矩阵。

  • 旋转矩阵 - 9个乘法和加法6
  • Quartenion - 15乘法和加法15

来源:Performance comparisons

最好是透过Android提供的旋转矩阵。另外,如果您打算使用四元数(例如Sensor.TYPE_ROTATION_VECTOR + SensorManager.getQuaternionFromVector),您可以(也应该)将其转换为旋转矩阵。您可以使用方法SensorManager.getRotationMatrixFromVector将旋转向量转换为矩阵。获得旋转矩阵后,只需将其乘以所需的投影向量即可。你可以使用这个功能:

public float[] multiplyByVector(float[][] A, float[] x) { 
     int m = A.length; 
     int n = A[0].length; 
     if (x.length != n) throw new RuntimeException("Illegal matrix dimensions."); 
     float[] y = new float[m]; 
     for (int i = 0; i < m; i++) 
      for (int j = 0; j < n; j++) 
       y[i] += (A[i][j] * x[j]); 
     return y; 
    } 

虽然我仍然无法正确运行,我会将其标记为答案。

+0

它有一个更好的解决方案。你还在寻找解决方案吗? – 2016-05-09 07:17:32

+0

不,我已经离开了这个项目:)我最终选择了一种不同的方法 – 2016-05-09 07:22:46