У меня есть код для моего класса 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);
}
Точным эквивалентом вашего 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);
}
Других решений пока нет …