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);
}
俯仰和航向完美无缺:
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);
}