OpenGl\JOML: 缩放矩阵时防止不必要的平移
OpenGl\JOML: Preventing unwanted translation when scaling a matrix
我正在尝试使用 LWJGL 3 和 JOML 将 3D 对象放在 HUD 上。我只是有一个小问题,当我缩放对象时,它会移动。我想防止这种情况发生。
在此图像中,我的对象设置为 (0,0) 的位置(Z 始终设置为 0),比例为 100(所有比例均除以 100,因此比例的实际值为1 当应用于矩阵时。执行此操作的代码如下所示)。
https://i.imgur.com/f8wH7cm.png
然后当我将比例更改为 50(应用于矩阵时为 0.5),显示如下:
https://i.imgur.com/SXWM8nE.png
我希望对象仍然位于屏幕的左上角。
这是我给出真实比例和位置的代码(屏幕尺寸为 1080 x 720)
public Vector3f getTruePos(){
return new Vector3f(((position.x/1080) - 0.5), ((position.y/720) + (0.5)), 0);
}
public float getTrueScale(){
return scale/100;
}
这是我渲染对象的代码。
public void renderHUD(List<UIObject> objects){
hudShaderProgram.bind();
for(UIObject object : objects){
Mesh mesh = object.getMesh();
hudShaderProgram.setUniform("projection", transformation.getOrthoProjectionMatrix());
hudShaderProgram.setUniform("model", transformation.buildModelViewMatrixUI(object));
mesh.render();
}
hudShaderProgram.unbind();
}
下面是处理对象转换的代码:
public Matrix4f buildModelViewMatrixUI(UIObject gameItem) {
Quaternionf rotation = gameItem.getRotation();
Matrix4f modelMatrix = new Matrix4f();
modelMatrix.translationRotateScale(gameItem.getTruePos().x, gameItem.getTruePos().y, 0, rotation.x, rotation.y, rotation.z, rotation.w, gameItem.getTrueScale(),
gameItem.getTrueScale(), gameItem.getTrueScale());
return modelMatrix;
}
然后getOrthoProjectionMatrix()
returns这样设置的值:
transformation.updateProjectionMatrix(FOV, window.getWidth(), window.getHeight(), Z_NEAR, Z_FAR);
public Matrix4f updateOrthoProjectionMatrix(float left, float right, float bottom, float top, float zNear, float zFar) {
orthoProjMatrix.identity();
orthoProjMatrix.setOrtho(left, right, bottom, top, zNear, zFar);
return orthoProjMatrix;
}
我不确定我需要做什么才能实现我的愿望。任何帮助将不胜感激。
可在此处找到上述片段的完整代码:
The UIObject class
The Rendering Class
The Transformation class
如果这还不够,请告诉我,我很乐意提供更多。
我设法解决了这个问题。我真的只需要更新我的正投影矩阵。
public Matrix4f buildOrtho(float left, float right, float bottom, float top){
Matrix4f orthoProjMatrix = new Matrix4f();
orthoProjMatrix.setOrtho(left, right, bottom, top, -100, 1000);
return orthoProjMatrix;
}
然后我将渲染方法更改为:
public void renderHUD(Window window, List<UIObject> objects){
hudShaderProgram.bind();
Matrix4f orthoProjection = transformation.buildOrtho(0, window.getWidth(), window.getHeight(), 0);
for(UIObject object : objects){
Mesh mesh = object.getMesh();
hudShaderProgram.setUniform("ortho", orthoProjection);
hudShaderProgram.setUniform("model", transformation.buildModelViewMatrixUI(object));
mesh.render();
}
hudShaderProgram.unbind();
}
此外,由于我现在使用的是正确的正射投影,因此我不再需要 getTrueScale()
和 getTruePositon()
方法。
我正在尝试使用 LWJGL 3 和 JOML 将 3D 对象放在 HUD 上。我只是有一个小问题,当我缩放对象时,它会移动。我想防止这种情况发生。
在此图像中,我的对象设置为 (0,0) 的位置(Z 始终设置为 0),比例为 100(所有比例均除以 100,因此比例的实际值为1 当应用于矩阵时。执行此操作的代码如下所示)。 https://i.imgur.com/f8wH7cm.png
然后当我将比例更改为 50(应用于矩阵时为 0.5),显示如下:
https://i.imgur.com/SXWM8nE.png
我希望对象仍然位于屏幕的左上角。
这是我给出真实比例和位置的代码(屏幕尺寸为 1080 x 720)
public Vector3f getTruePos(){
return new Vector3f(((position.x/1080) - 0.5), ((position.y/720) + (0.5)), 0);
}
public float getTrueScale(){
return scale/100;
}
这是我渲染对象的代码。
public void renderHUD(List<UIObject> objects){
hudShaderProgram.bind();
for(UIObject object : objects){
Mesh mesh = object.getMesh();
hudShaderProgram.setUniform("projection", transformation.getOrthoProjectionMatrix());
hudShaderProgram.setUniform("model", transformation.buildModelViewMatrixUI(object));
mesh.render();
}
hudShaderProgram.unbind();
}
下面是处理对象转换的代码:
public Matrix4f buildModelViewMatrixUI(UIObject gameItem) {
Quaternionf rotation = gameItem.getRotation();
Matrix4f modelMatrix = new Matrix4f();
modelMatrix.translationRotateScale(gameItem.getTruePos().x, gameItem.getTruePos().y, 0, rotation.x, rotation.y, rotation.z, rotation.w, gameItem.getTrueScale(),
gameItem.getTrueScale(), gameItem.getTrueScale());
return modelMatrix;
}
然后getOrthoProjectionMatrix()
returns这样设置的值:
transformation.updateProjectionMatrix(FOV, window.getWidth(), window.getHeight(), Z_NEAR, Z_FAR);
public Matrix4f updateOrthoProjectionMatrix(float left, float right, float bottom, float top, float zNear, float zFar) {
orthoProjMatrix.identity();
orthoProjMatrix.setOrtho(left, right, bottom, top, zNear, zFar);
return orthoProjMatrix;
}
我不确定我需要做什么才能实现我的愿望。任何帮助将不胜感激。
可在此处找到上述片段的完整代码:
The UIObject class
The Rendering Class
The Transformation class
如果这还不够,请告诉我,我很乐意提供更多。
我设法解决了这个问题。我真的只需要更新我的正投影矩阵。
public Matrix4f buildOrtho(float left, float right, float bottom, float top){
Matrix4f orthoProjMatrix = new Matrix4f();
orthoProjMatrix.setOrtho(left, right, bottom, top, -100, 1000);
return orthoProjMatrix;
}
然后我将渲染方法更改为:
public void renderHUD(Window window, List<UIObject> objects){
hudShaderProgram.bind();
Matrix4f orthoProjection = transformation.buildOrtho(0, window.getWidth(), window.getHeight(), 0);
for(UIObject object : objects){
Mesh mesh = object.getMesh();
hudShaderProgram.setUniform("ortho", orthoProjection);
hudShaderProgram.setUniform("model", transformation.buildModelViewMatrixUI(object));
mesh.render();
}
hudShaderProgram.unbind();
}
此外,由于我现在使用的是正确的正射投影,因此我不再需要 getTrueScale()
和 getTruePositon()
方法。