安卓传感器用于OpenGL

4

我希望能够让安卓传感器与OpenGL配合使用,以便将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);

我希望有人能分享他们实际编写的代码!我非常感激!谢谢大家!

2个回答

0

这是我完成同样任务的方法(我的应用程序也处于横屏模式)。首先,我获取方向数值(类似于您的方法):

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) 方法中,我这样做:
 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值。
希望这可以帮助...

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。请注意,重新映射可能并不是必要的,例如当你已经将你的活动固定为横屏模式时。更多细节在这里

一些涉及传感器数据和OpenGL ES的示例代码:


谢谢回答!但是并没有真正解决我的问题。我的意思是要完成这个视频中展示的相同操作:http://www.youtube.com/watch?v=wfRjZrnPBXY - rdnobrega

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接