OpenGL:如何旋转(滚动)相机?

OpenGL : How to rotate (roll) the camera?

俯仰和航向完美无缺:

fun onDrawFrame(pitch: Float, roll: Float, heading: Float) {
    val lookAtX = cos(pitch) * cos(heading)
    val lookAtY = -sin(pitch)
    val lookAtZ = cos(pitch) * sin(heading)

    val upX = 0.0F
    val upY = 1.0F
    val upZ = 0.0F

    Matrix.setLookAtM(cameraPositionMatrix, 0, 0.0F, 0.0F, 0.0F, lookAtX.toFloat(), lookAtY.toFloat(), lookAtZ.toFloat(), upX.toFloat(), upY.toFloat(), upZ.toFloat())

    ...
}

但是如何旋转(滚动)相机?我想我需要根据围绕“视线”的滚动角度旋转 UP 矢量,但它比我想象的要复杂。

有谁知道绕轴B(Xb, Yb, Zb)C( Xc, Yc, Zc)?

这个问题涉及 setLookAtM (OpenGL ES) 和 gluLookAt (OpenGL)

你想要的可以通过 Rx * Ry * Rz * T 轻松实现,其中 Rx/y/z 是各自的旋转矩阵,分别绕 x、y 或 z 轴旋转,然后是(负)相机平移,在您的情况下只是 (0, 0, 0).

可以手动计算它,方法是手动计算三角函数并手动计算方向和向上矢量以进行观察,但也有通过 rotateM 的路线,有效地实现相同的目标:

fun onDrawFrame(pitch: Float, roll: Float, heading: Float) {
  Matrix.setIdentityM(cameraPositionMatrix, 0)
  Matrix.rotateM(cameraPositionMatrix, 0, pitch, 1, 0, 0);
  Matrix.rotateM(cameraPositionMatrix, 0, heading, 0, 1, 0);
  Matrix.rotateM(cameraPositionMatrix, 0, roll, 0, 0, 1);
}