gpt4 book ai didi

java - 如何从 GLM 到 JOML(OpenGL 数学库)

转载 作者:行者123 更新时间:2023-11-28 05:00:04 25 4
gpt4 key购买 nike

我有一个 C++ Transform 类的代码,它应该为类的用户提供一个模型 View 矩阵

代码 list 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)编写了部分代码,但我仍然坚持使用其他部分(已注释)

代码 list 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 代码完全等价的是使用 JOML 的 Java 代码:

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

与 C/C++ 不同,Java(还)没有将堆栈分配内置到语言本身中(除非在 JIT 字节码时由 HotSpot 优化)。因此,比起创建新的 Matrix4f 实例(或像上面那样修改 parentTransformationMatrix 矩阵,更喜欢使用“dest”/destination/out 参数,因为调用 mul 会修改它并且不创建新的 Matrix4f)。

所以我们最终得到:

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

关于java - 如何从 GLM 到 JOML(OpenGL 数学库),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46255469/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com