2011-12-26 3 views
4

Я хочу, чтобы датчики Android работали с opengl, чтобы повернуть камеру opengl в любую точку, на которую указывает телефон.Android-датчики для OpenGL

Чтобы уточнить: если игрок смотрит на восток, я бы хотел, чтобы точки камеры opengl находились на востоке тоже по игре; если игрок указывает на небо, я хотел бы указать камеру opengl на небо и так далее.

Я пробовал использовать getRotationMatrix и загружать матрицу на opengl, но он работает только в направлении вверх-вниз, если я поворачиваю ячейку по бокам, нет никакой разницы. Вот то, что я сделал до сих пор (приложение находится в ландшафтном режиме):

public void onSensorChanged(SensorEvent evt) { 
    int type=evt.sensor.getType(); 
    float alpha = 0.8f; 

    //Smoothing the sensor data a bit 
    if (type == Sensor.TYPE_MAGNETIC_FIELD) { 
     geomag[0]=geomag[0]*alpha+evt.values[0]*(1-alpha); 
     geomag[1]=geomag[1]*alpha+evt.values[1]*(1-alpha); 
     geomag[2]=geomag[2]*alpha+evt.values[2]*(1-alpha); 
    } else if (type == Sensor.TYPE_ACCELEROMETER) { 
     gravity[0]= gravity[0]*alpha+evt.values[0]*(1-alpha); 
     gravity[1]= gravity[1]*alpha+evt.values[1]*(1-alpha); 
     gravity[2]= gravity[2]*alpha+evt.values[2]*(1-alpha); 
    } 

    if ((type==Sensor.TYPE_MAGNETIC_FIELD) || (type==Sensor.TYPE_ACCELEROMETER)) { 
     rotationMatrix = new float[16]; 
     SensorManager.getRotationMatrix(rotationMatrix, null, gravity, geomag); 
     SensorManager.remapCoordinateSystem( 
     rotationMatrix, 
     SensorManager.AXIS_Y, 
     SensorManager.AXIS_MINUS_X, 
     rotationMatrix); 
    if (AOGLRenderer.rotationmatrix==null) AOGLRenderer.rotationmatrix = new float[16]; 
    AOGLRenderer.rotationmatrix = rotationMatrix; 
    }  
    } 

и в коде OPENGL:

 gl.glClear(GL10.GL_COLOR_BUFFER_BIT | // OpenGL docs. 
         GL10.GL_DEPTH_BUFFER_BIT); 
    gl.glLoadIdentity(); 
    if (rotationmatrix!=null) gl.glLoadMatrixf(rotationmatrix, 0); 
    gl.glPushMatrix(); 
    gl.glTranslatef(0, 0, -70); 
    g.draw(gl); 
    gl.glPopMatrix(); 
    alpha+=2f; 
    gl.glTranslatef(0, -15, 0); 
    c.draw(gl); 

Я хотел бы, что кто-то, кто на самом деле он мог поделиться их код! Я бы очень признателен! Спасибо вам всем!

ответ

0

Вы поставляете null для матрицы наклона - это неверно.

SensorManager.getRotationMatrix(rotationMatrix, null, gravity, geomag); 

Есть много примеров о том, как использовать SensorManager-х getRotationMatrix(...).

float[] R = new float[16]; 
float[] I = new float[16]; 

if (SensorManager.getRotationMatrix(R, I, accelerometerValues, geomagneticValues)) { 
    float[] anglesInRadians = new float[3]; 
    SensorManager.getOrientation(R, anglesInRadians); 
    ... 
} 

Также «вращать камеру в OPENGL, чтобы там, где телефон указывает на» весьма неоднозначен. Например, если вы имели в виду какой-то подход с расширенной реальностью, тогда вы должны сопоставлять AXIS_X с AXIS_Z. Обратите внимание, что переназначение может даже не понадобиться, например. когда вы уже фиксируете свою активность в ландшафтном режиме. Подробнее here.

Некоторые примеры кодов, включающие данные датчиков и OpenGL ES:

+0

Спасибо за ответ! но на самом деле не получилось. То, что я имел в виду, - это сделать то же самое, что показано в этом видео: http://www.youtube.com/watch?v=wfRjZrnPBXY – rdnobrega

0

Вот как я сделал то же самое (мой App также в альбомной ориентации). Во-первых я получаю значения ориентации (аналоговая к тому, что вы делаете):

final float pi = (float) Math.PI; 
final float rad2deg = 180/pi; 
public static float x; //pitch 
public static float y; //roll 
public static float z; //azimuth  
float[] gravity = new float[3]; 
float[] geomag = new float[3]; 
float[] inOrientMatrix = new float[16]; 
float[] outOrientMatrix= new float[16]; 
float orientation[] = new float[3]; 
public static GLSurfaceView glView; 

// (...) 

public void onSensorChanged(SensorEvent event) { 
switch (event.sensor.getType()){ 
     case Sensor.TYPE_ACCELEROMETER: gravity = event.values.clone(); 
     break; 
     case Sensor.TYPE_MAGNETIC_FIELD: geomag = event.values.clone(); 
     break; 
     } 
if (gravity != null && geomag != null){ 
if (SensorManager.getRotationMatrix(inOrientMatrix, null, gravity, geomag)){ 
     SensorManager.remapCoordinateSystem(inOrientMatrix, SensorManager.AXIS_X, SensorManager.AXIS_Z, outOrientMatrix); 
     SensorManager.getOrientation(outOrientMatrix, orientation); 
     x = orientation[1]*rad2deg; //pitch 
     y = orientation[0]*rad2deg; //azimuth 
     z = orientation[2]*rad2deg; //roll 
     glView.requestRender(); 
} 

Тогда в моем оказанные в onDrawFrame (GL10 ГЛ) я:

gl.glLoadIdentity(); 
GLU.gluLookAt(gl, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f);  
gl.glRotatef(MainActivity.x, 1.0f, 0.0f, 0.0f); 
gl.glRotatef(MainActivity.y, 0.0f, 1.0f, 0.0f); 
gl.glRotatef(MainActivity.z, 0.0f, 0.0f, 1.0f); 
//in case you have transformation, eg. the position of the object, you can do them here 
//gl.Translatef(0.0f, 0.0f, -DISTANCE NORTH); 
//gl.Translatef(0.0f, DISTANCE EAST, 0.0f); 
gl.glPushMatrix(); 
//object draw 

Другими словами, я поворачиваю весь мир вокруг меня. Лучше всего было бы изменить направление камеры с помощью glLookAt, при этом глаз, расположенный на (0,0,0) и (0,1,0), был вектором вверх, но я просто не мог получить свой center_view x , y, z правильно.

Надеюсь, это поможет ...

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