我想旋转视图矩阵(我认为这代表了摄像机的位置)。
我已经成功使用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)
}
但是,这会使渲染模型两次。 这是绕指定轴旋转视图矩阵的正确方法吗?
编辑
from("imap://admin@mymailserver.com?password=...")
.process(myEmailProcessor)
答案 0 :(得分:2)
它在您的示例中有效,因为我想您的目标等于世界原点。 如果要绕世界原点旋转,则不需要平移部分。如果在某个点附近,它将变成强制性的。
在计算视图矩阵时,我想使用的是在相机中保留3个值:
如果要绕目标点旋转,则需要在眼睛和upVector上进行旋转,一旦完成,您就可以使用mat4 lookAt(eye, center, up)
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);
}
我更喜欢这种方法,因为它为您提供了更简单的值,这对于调试非常有帮助