Как перейти от GLM к JOML (Математические библиотеки OpenGL)

У меня есть код для моего класса C ++ Transform, который должен предоставить пользователю класса Model View Matrix

код-листинг 1:

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;
}

Я уже сделал часть кода, используя JOML (для LWJGL3), но я застрял с другими частями (прокомментировал)

код-листинг 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);
}

0

Решение

Точным эквивалентом вашего GLM-кода был бы этот Java-код с использованием JOML:

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

В отличие от C / C ++, в Java (пока) нет встроенного в сам язык выделения стека (если только он не оптимизирован HotSpot при JIT-обработке байт-кода). Поэтому предпочитайте иметь параметр «dest» / destination / out вместо создания нового экземпляра Matrix4f (или изменения parentTransformationMatrix матрица, как вы сделали выше, потому что вызов mul будет изменять его, а не создавать новый Matrix4f).

Итак, мы заканчиваем с:

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]