2013-10-10 5 views
1

Я пытаюсь повернуть модель (рельеф), расположенную по адресу (X,Y,Z)=(0,0,0) моего OpenGL-World. +X is east, -Z is north, +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); 
    ... 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^