如何围绕指定轴旋转X或旋转Z视图矩阵?

时间:2020-07-08 05:50:42

标签: opengl matrix lwjgl

我想旋转视图矩阵(我认为这代表了摄像机的位置)。

我已经成功使用Matrix4f#rotateY绕着Y轴旋转了视图矩阵。

但是,关于rotateX,这需要目标位置位于世界(0,0,0)的中心,我想围绕指定位置旋转视图矩阵。

我试图像下面那样旋转矩阵:

fun Matrix4f.orbitBy(modelCenter: Vector3f, angleY: Float, angleX: Float, focalLength: Float) {
    // Setup both camera's view matrices
    val modelCenterCp = Vector3f(modelCenter)
    val recenter = Matrix4f().translate(modelCenterCp.mul(-1.0f)) //not needed if world origin
    val rotation = Matrix4f()
            .rotateY(angleY)
            .rotateX(angleX)
    val moveBack = Matrix4f().translate(modelCenter) //not needed if world origin
    val transfer = moveBack.mul(rotation).mul(recenter) //order from right to left

    val eye = Vector3f(0f, modelCenter.y, -focalLength).mulProject(transfer)
    val up = Vector3f(0f, 1f, 0f)
    this.setLookAt(eye, modelCenter, up)
} 

但是,这会使渲染模型两次。 这是绕指定轴旋转视图矩阵的正确方法吗?

编辑

  • 我已经根据Draykoon D的回答与Kotlin一起安装了相机,谢谢
  • 我正在将JOML用作操作矩阵的库
from("imap://admin@mymailserver.com?password=...")
    .process(myEmailProcessor)

1 个答案:

答案 0 :(得分:2)

它在您的示例中有效,因为我想您的目标等于世界原点。 如果要绕世界原点旋转,则不需要平移部分。如果在某个点附近,它将变成强制性的。

在计算视图矩阵时,我想使用的是在相机中保留3个值:

  • 相机位置(眼睛)
  • 相机目标(中心)
  • 相机upVector(向上)

如果要绕目标点旋转,则需要在眼睛和upVector上进行旋转,一旦完成,您就可以使用mat4 lookAt(eye, center, up)

重新计算viewMatrix
void orbitBy(float yaw, vec3 rotationCenter) {
     mat4 recenter = translate(mat4(1.0), -rotationCenter); //not needed if world origin
     mat4 rotation = rotateY(mat4(1.0), yaw); //can be replaced by glm::eulerAngleZXY(yaw, pitch, roll) ...
     mat4 moveBack = translate(mat4(1.0, rotationCenter)); //not needed if world origin
     mat4 transfo = moveBack * rotation * recenter; //order from right to left
     m_eye = transfo * m_eye;
     m_up = transfo * m_up; 
     m_viewMatrix = lookAt(m_eye, m_center, m_up);
}

我更喜欢这种方法,因为它为您提供了更简单的值,这对于调试非常有帮助

相关问题