0

我正在构建一个增强现实应用程序,我希望屏幕上的对象相对于手机的方向移动。例如,如果手机保持不动 - 对象停留在屏幕中央。如果手机在纵向模式下绕其垂直轴向左旋转,则该物体向右移动。这是我在访问Android的将旋转矢量应用于OpenGL相机或“查看矩阵”

@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

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

回答

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是摄像机坐标。 cameraLookAtX,cameraLookAtYcameraLookAtZ是相机正在查看的点的坐标。 pitchyaw是相机的欧拉旋转角度。您还可以添加roll并计算setLookAtM()函数的向量。