Android:将设备旋转映射到3d场景对象旋转

时间:2017-03-25 10:09:23

标签: matrix vector rotation android-sensors quaternions

我的目标是使用智能手机旋转3d场景中的对象。基本上我想将手机的旋转映射到一个3d对象。 3d软件可以使用旋转功能旋转对象,旋转功能将轴和角度(旋转矢量)作为参数。另一种选择是使用旋转矩阵。

我尝试使用android旋转矢量传感器来获得四元数并将θ(旋转角度),x,y和z(旋转轴的坐标)隔离出来。它的工作原理但问题是这个传感器给出的四元数对应于从当前手机位置到参考(基于磁北)的旋转。我需要的是获得能够从t0的位置到t1的位置的四元数。我得到的是如何从t0的位置到参考,从t1的位置到参考。

然后可以使用引用计算从位置1到位置2的四元数吗?也许我的策略并不好,所以不要犹豫提出正确的做法"。 提前致谢

修改

大家好,我尝试使用两个连续的四元数。让我们称他们为q1和q2。在t = 1时,我在位置1处,而q1表示到地球参考的旋转。在t = 2时,I' m在位置2处,q2表示到同一地球参考的旋转。我计算了-q2 * q1的组合。它的工作原理但问题是旋转被映射到设备坐标系。我需要的是映射到真实世界坐标系。谁知道怎么做?感谢

修改

我想我可以命名我需要的东西:如何在现实世界中以单位四元数的形式获得我的Android设备的旋转?因此,我的实施将对此起作用。先谢谢你们!

修改

好的,我有点干了。我使用了从getRotationMatrix()获得的旋转矩阵R,并将我的四元数与反转的R矩阵相乘。结果就是我想要的,当我在空间中旋转设备时,软件中的3d对象完全模仿旋转。但是仍有一个问题,这只适用于我用我的设备面向一个特定方向的时候,我猜它是参考(x到东,y到磁北和z向上)。我目前正在试图解决这个问题。如果有人能给我见解他欢迎你!

修改

再次嗨我世界! (空虚荒凉的孤独世界......)我想我明白了。我想使用一个初始的四元数值让我们把它称为旋转到手机Qi的初始位置。一旦我得到它我将它组合到当前的四元数值并从中获取旋转矩阵以映射到现实世界初始位置(而不是北方)。

我唯一的问题是,我不知道如何只使用第一个值作为我尝试的常量:

@Override
public void onSensorChanged(SensorEvent event) {
    if (this.initialQ==null) {
        this.initialQ=event.values; 
        this.conjInitQ=conjugate(this.initialQ);
    }
  Log.v(TAG,String.valueOf(initialQ[0])+String.valueOf(initialQ[1])+String.valueOf(initialQ[2])+String.valueOf(initialQ[3])); 

然而,日志打印的价值在不断变化,有人可以解释为什么吗?提前致谢

0 个答案:

没有答案