2017-09-23 371 views
0

我一直在使用帶JOML的LWJGL作爲創建3D遊戲引擎的手段。 由於我一直鬆散地遵循Jeffrey的教程(YouTube),所以我遇到了一個問題,但我一直使用JOML庫而不是他創建的迷你數學庫。我已經做了變換類,它已經從傑弗裏的數學庫複製,並且我已經轉換爲使用JOML:JOML(帶LWJGL) - 從rx,ry和rz值獲取旋轉矩陣?

import org.joml.Matrix4f; 
import org.joml.Vector3f; 

public class Transform { 
    public static Matrix4f getPerspectiveProjection(float fov, int width, int height, float zNear, float zFar) { 
     return new Matrix4f().setPerspective(fov, width/height, zNear, zFar); 
    } 

    public static Matrix4f getTransformation(Vector3f translation, float rx, float ry, float rz, float scale) { 
     Matrix4f translationMatrix = new Matrix4f().setTranslation(translation); 

     // The first problem: 
     Matrix4f rotationMatrix = new Matrix4f().getRotation(rx, ry, rz); 

     Matrix4f scaleMatrix = new Matrix4f().initScale(scale); 

     return translationMatrix.mul(rotationMatrix.mul(scaleMatrix)); 
    } 

    public static Matrix4f getViewMatrix(Camera camera) { 
     Vector3f pos = camera.getPosition(); 

     Matrix4f translationMatrix = new Matrix4f().setTranslation(-pos.x, -pos.y, -pos.z); 
     Matrix4f rotationMatrix = new Matrix4f().initRotation(camera.getForward(), camera.getUp()); 

     return rotationMatrix.mul(translationMatrix); 
    } 
} 

從JOML文檔,所有我能找到的是使用Matrix4f.getRotationAxisAngle4f

的問題的關鍵是,我怎麼翻譯RXRY,並RZ角度爲AxisAngle4f

回答

0

請仔細和仔細閱讀JOML方法的JavaDocs。 Matrix4f.getRotation()檢索(仿射)矩陣的旋轉部分並將該旋轉轉換爲表示相同旋轉的軸角。該方法不從創建/構建從三個歐拉角的旋轉矩陣。

因此,要非常精確地陳述/改寫您的問題: 「如何建立表示給定三個歐拉角(即分別圍繞X,Y和Z軸的角度)的3D旋轉的仿射4×4矩陣,應用旋轉按照X的順序,然後是Y,然後是Z?「

答案是:Matrix4f.rotationXYZ()或乘數後Matrix4f.rotateXYZ()。 如果您需要不同的旋轉順序,您還可以查看其他「旋轉」旋轉YXZ/ZYX和rotateYXZ/ZYX方法,或者甚至在給定旋轉軸和角度的情況下應用三個調用Matrix4f.rotate()

我建議你也參考GitHub項目的Wiki和GitHub上的joml-lwjgl3-demos項目的源代碼。