我有一个C++转换类的代码,它应该给类的用户一个模型视图矩阵
代码-清单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);
}发布于 2017-09-17 17:53:21
与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矩阵,调用mul将修改它而不是创建新的Matrix4f),更喜欢使用“dest”/destination参数。
所以我们最后得到了:
public Matrix4f GetModel(Vector3f pos, Vector3f rot, Vector3f scale, Matrix4f parent, Matrix4f dest) {
return parent.translate(pos, dest)
.scale(scale)
.rotateXYZ(rot);
}https://stackoverflow.com/questions/46255469
复制相似问题