首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从GLM到JOML (OpenGL数学图书馆)

如何从GLM到JOML (OpenGL数学图书馆)
EN

Stack Overflow用户
提问于 2017-09-16 15:26:46
回答 1查看 1.8K关注 0票数 0

我有一个C++转换类的代码,它应该给类的用户一个模型视图矩阵

代码-清单1:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-17 17:53:21

与GLM代码完全等价的是使用JOML的Java代码:

代码语言:javascript
复制
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矩阵,调用mul将修改它而不是创建新的Matrix4f),更喜欢使用“dest”/destination参数。

所以我们最后得到了:

代码语言:javascript
复制
public Matrix4f GetModel(Vector3f pos, Vector3f rot, Vector3f scale, Matrix4f parent, Matrix4f dest) {
  return parent.translate(pos, dest)
               .scale(scale)
               .rotateXYZ(rot);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46255469

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档