用于 OpenGL 的 Android 传感器

标签 android opengl-es matrix

我想让 android 传感器与 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);

我希望真正做到这一点的人可以分享他们的代码!我真的很感激!谢谢大家!

最佳答案

您为倾斜矩阵提供了 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。请注意,重新映射甚至可能不是必需的,例如当您已经将 Activity 固定为横向模式时。更多详情 here .

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

关于用于 OpenGL 的 Android 传感器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8632520/

相关文章:

android - 我可以在 Android Studio 中运行没有 HAXM 的模拟器吗?

opengl-es - OpenGL ES 2 : Are vertex and fragment shaders necessary for simple drawing?

android - E/ExoPlayerImplInternal:从本地存储播放.MP4文件时出现源错误

android - 自定义 Android 复选框

java - 在Android中用手指旋转3D对象

matlab - 在matlab中进行三角矩阵向量乘法的最快方法?

c - 如何创建一个循环来连续获取浮点输入?

python - 为每个操作创建一个线程还是为各种操作创建一些线程?

android - 错误的 xml 或 android 兼容性问题?

ios - 如何解决 iOS 中的 GLKView 视口(viewport)问题