我正在构建一个增强现实应用程序,我希望屏幕上的对象相对于手机的方向移动。例如,如果手机保持静止 - 对象保持在屏幕的中心。如果手机在纵向模式下绕其垂直轴向左旋转,则对象将向右移动。这是我在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
并将其传递到我的顶点着色器中。结果是屏幕中间的方形围绕其自身轴旋转,而不是相对于手机。
答案 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);
cameraX
,cameraY
和cameraZ
是相机坐标。 cameraLookAtX
,cameraLookAtY
和cameraLookAtZ
是相机正在查看的点的坐标。 pitch
和yaw
是相机的欧拉旋转角度。您还可以添加roll
并计算setLookAtM()
函数的向量。