2013-10-10 137 views
1

我想旋转位于我的OpenGL-World的(X,Y,Z)=(0,0,0)的模型(地形)。 +X是东,-Z是北,+Y是高度。查看正在寻找-Y,因为设备欧拉角是(0°,0°,0°)而设备躺在桌子上指向北方。为OpenGL ES2模型旋转切换设备轴旋转矩阵

的问题

我需要切换我的设备的轴来测量角度device -y更改为device z

目前围绕device x-axis工程轮换(结果在World X-axis左右轮换)。

但左右旋转device y导致周围World Y而不是World -Z和旋转的旋转围绕device z以旋转周围World Z代替World Y

现在我已经没有想法如何解决这个问题了。任何人都可以给我一个提示吗?

(OpenGL)       (Device) 

^+Y-axis      ^+z-axis         
    *        *         
    *        *         
    *        * ^+y-axis (North)    
    *        * *        
    *        * *         
    *        * *         
    ************> + X-axis   ************> +x-axis      
    *                 
*                  
v +Z-axis (Minus North)  

我试过到目前为止:

  • 使用从欧拉角SensorManager.getOrientation开关角工作正常,但我进入万向节锁定密齿90度到。所以我正在寻找另一个解决方案(SensorManager旋转矩阵或四元数)。
  • SensorManager.remapCoordinateSystem几乎在每一个可能的星座 - >没有帮助
  • 更改的cols /从SensorManager.getRotationMatrix我旋转矩阵的行 - >没有帮助

回答

1

好吧,我已经找到了一个非常简单的解决方案使用四元数。 轴在最后切换。

参见:

现在我仍然不知道如何启用以上90度桨距角(在肖像模式) 。有任何想法吗?

活动:

private SensorManager sensorManager; 
private Sensor rotationSensor; 

public void onCreate(Bundle savedInstanceState) { 
    ... 
    rotationSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR); 
    ... 
} 

// Register/unregister SensorManager Listener at onResume()/onPause() ! 

public void onSensorChanged(SensorEvent event) { 

    if (event.sensor.getType() == Sensor.TYPE_ROTATION_VECTOR) { 
    // Set rotation vector 
    MyRenderer.setOrientationVector(event.values); 
    } 

} 

MyRenderer:

float[] orientationVector = new float[3]; 

public void setOrientationVector (float[] vector) { 

    // Rotation vector to quaternion 
    float[] quat = new float[4]; 
    SensorManager.getQuaternionFromVector(quat, vector); 
    // Switch quaternion from [w,x,y,z] to [x,y,z,w] 
    float[] switchedQuat = new float[] {quat[1], quat[2], quat[3], quat[0]}; 

    // Quaternion to rotation matrix 
    float[] rotationMatrix = new float[16]; 
    SensorManager.getRotationMatrixFromVector(rotationMatrix, switchedQuat); 

    // Rotation matrix to orientation vector 
    SensorManager.getOrientation(rotationMatrix, orientationVector); 

} 

public void onDrawFrame(GL10 unused) { 
    ... 
    // Rotate model matrix (note the axes beeing switched!) 
    Matrix.rotateM(modelMatrix, 0, 
    (float) (orientationVector[1] * 180/Math.PI), 1, 0, 0); 

    Matrix.rotateM(modelMatrix, 0, 
    (float) (orientationVector[0] * 180/Math.PI), 0, 1, 0); 

    Matrix.rotateM(modelMatrix, 0, 
    (float) (orientationVector[2] * 180/Math.PI), 0, 0, 1); 
    ... 
}