2017-09-16 3 views
-1

Ich habe einen Code für mein C gehen ++ Transform-Klasse, die den Benutzer der Klasse eine Modellansicht MatrixWie von GLM zu JOML (OpenGL Mathematik Bibliotheken)

Code-Listing 1 geben soll:

glm::mat4 Transform::GetModel(glm::vec3 pos, glm::vec3 rot, glm::vec3 scale, glm::mat4 parentTransformationMatrix){ 
    glm::mat4 posMat = glm::translate(pos); 
    glm::mat4 scaleMat = glm::scale(scale); 
    glm::mat4 rotX  = glm::rotate(rot.x, glm::vec3(1.0, 0.0, 0.0)); 
    glm::mat4 rotY  = glm::rotate(rot.y, glm::vec3(0.0, 1.0, 0.0)); 
    glm::mat4 rotZ  = glm::rotate(rot.z, glm::vec3(0.0, 0.0, 1.0)); 
    glm::mat4 rotMat = rotX * rotY * rotZ; 

    return parentTransformationMatrix * posMat * rotMat * scaleMat; 
} 

ich habe einen Teil des Codes mit JOML (für LWJGL3) schon, aber ich bin fest mit anderen Teilen (kommentiert)

Code-Listing 2:

public Matrix4f GetModel(Vector3f pos, Vector3f rot, Vector3f scale, Matrix4f parentTransformationMatrix){ 
    Matrix4f posMat ;// = translate(pos); 
    Matrix4f scaleMat ;// = scale(scale); 
    Matrix4f rotX  ;// = rotate(rot.x, Vector3f(1.0, 0.0, 0.0)); 
    Matrix4f rotY  ;// = rotate(rot.y, Vector3f(0.0, 1.0, 0.0)); 
    Matrix4f rotZ  ;// = rotate(rot.z, Vector3f(0.0, 0.0, 1.0)); 
    Matrix4f rotMat = rotX.mul(rotY).mul(rotZ); 

    return parentTransformationMatrix.mul(posMat).mul(rotMat).mul(scaleMat); 
} 
+1

Es gibt Operationen wie 'translate',' rotateX' ... - siehe [Klasse Matrix4f] (https://joml-ci.github.io/JOML /apidocs/org/joml/Matrix4f.html) – Rabbid76

Antwort

1

Die genaue Entsprechung Ihres GLM-Code würde diesen Java-Code mit JOML sein:

public Matrix4f GetModel(Vector3f pos, Vector3f rot, Vector3f scale, Matrix4f parent) { 
    return new Matrix4f(parent).translate(pos).scale(scale).rotateXYZ(rot); 
} 

Im Gegensatz zu C/C++, Java ist (noch) nicht haben Stack Zuweisung in die Sprache selbst gebaut (es sei denn, optimiert durch HotSpot, wenn der Bytecode JIT '). Also bevorzugen Sie einen "dest"/Ziel/out-Parameter gegenüber dem Erstellen einer neuen Matrix4f-Instanz (oder Ändern der parentTransformationMatrix Matrix wie oben, weil Aufruf mul wird es ändern und nicht eine neue Matrix4f erstellen).

So landen wir mit:

public Matrix4f GetModel(Vector3f pos, Vector3f rot, Vector3f scale, Matrix4f parent, Matrix4f dest) { 
    return parent.translate(pos, dest).scale(scale).rotateXYZ(rot); 
} 
Verwandte Themen