将旋转矢量应用于OpenGL相机或"查看矩阵"

时间:2017-06-02 17:07:41

标签: android opengl-es augmented-reality android-sensors gyroscope

我正在构建一个增强现实应用程序,我希望屏幕上的对象相对于手机的方向移动。例如,如果手机保持静止 - 对象保持在屏幕的中心。如果手机在纵向模式下绕其垂直轴向左旋转,则对象将向右移动。这是我在Android中访问的传感器

@Override
public void onSensorChanged(SensorEvent event) {
    if (event.sensor.getType() == Sensor.TYPE_ROTATION_VECTOR) {
        SensorManager.getRotationMatrixFromVector(mRotationMatrix, event.values);
        mGLAssetSurfaceView.getRenderer().setRotationMatrix(mRotationMatrix);
    }
}

这就是我将它应用于我的OpenGL渲染器的方式:

@Override
public void onDrawFrame(GL10 gl) {
    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);

    Matrix.setLookAtM(mViewMatrix, 0, 0, 0, -3, 0f, 0f, 0f, 0f, 1.0f, 0.0f);

    Matrix.multiplyMM(mViewMatrix, 0, mViewMatrix, 0, mRotationMatrix, 0);

    Matrix.multiplyMM(mMVPMatrix, 0, mProjectionMatrix, 0, mViewMatrix, 0);

    // Draw shape
    mSquare.draw(mMVPMatrix);
}

如您所见,我正在计算产品

MVRP

并将其传递到我的顶点着色器中。结果是屏幕中间的方形围绕其自身轴旋转,而不是相对于手机。

1 个答案:

答案 0 :(得分:0)

您可以将正确的变量传递给Matrix.setLookAtM(),而不会乘以旋转矩阵:

cameraLookAtX = cameraX + ( float ) Math.cos( Math.toRadians( yaw ) ) * ( float ) Math.cos( Math.toRadians( pitch ) );
cameraLookAtY = cameraY - ( float ) Math.sin( Math.toRadians( pitch ) );
cameraLookAtZ = cameraZ + ( float ) Math.cos( Math.toRadians( pitch ) ) * ( float ) Math.sin( Math.toRadians( yaw ) );
Matrix.setLookAtM(viewMatrix, 0, cameraX, cameraY, cameraZ, cameraLookAtX, cameraLookAtY, cameraLookAtZ, 0f, 1.0f, 0.0f);

cameraXcameraYcameraZ是相机坐标。 cameraLookAtXcameraLookAtYcameraLookAtZ是相机正在查看的点的坐标。 pitchyaw是相机的欧拉旋转角度。您还可以添加roll并计算setLookAtM()函数的向量。