java - Java LWJGL OpenGL 3 将 3d 点转换为 2d 点
问题描述
我正在尝试在 LWJGL 3 中将 3d 矢量转换为 2d 矢量。目标是在 3d 世界中移动时在 2d 屏幕上呈现名称标签。
这是我在 LWJGL 2 上使用的:
public static Vector2d to2D(double x, double y, double z) {
FloatBuffer screenCoords = BufferUtils.createFloatBuffer(3);
IntBuffer viewport = BufferUtils.createIntBuffer(16);
FloatBuffer modelView = BufferUtils.createFloatBuffer(16);
FloatBuffer projection = BufferUtils.createFloatBuffer(16);
GL11.glGetFloat(GL11.GL_MODELVIEW_MATRIX, modelView);
GL11.glGetFloat(GL11.GL_PROJECTION_MATRIX, projection);
GL11.glGetInteger(GL11.GL_VIEWPORT, viewport);
boolean result = GLU.gluProject((float) x, (float) y, (float) z, modelView, projection, viewport, screenCoords);
if (result) {
return new Vector2d(screenCoords.get(0), Display.getHeight() - screenCoords.get(1));
}
return null;
}
在 LWJGL 2 中,使用现在已删除的 GLU.gluProject() 是可行的,在新的 LWJGL 版本中还有其他选择吗?
解决方案
您可以使用JOML(也可作为 LWJGL 3 插件下载)及其Matrix4f.project()
方法。以下是您显示的 LWJGL3 + JOML 代码片段的功能端口:
import java.nio.*;
import org.joml.*;
import org.lwjgl.opengl.GL11;
import org.lwjgl.system.MemoryStack;
public class Snippet {
public static Vector2d to2D(double x, double y, double z, int displayHeight) {
Vector3f screenCoords = new Vector3f();
int[] viewport = new int[4];
try (MemoryStack stack = MemoryStack.stackPush()) {
FloatBuffer modelView = stack.mallocFloat(16);
FloatBuffer projection = stack.mallocFloat(16);
GL11.glGetFloatv(GL11.GL_MODELVIEW_MATRIX, modelView);
GL11.glGetFloatv(GL11.GL_PROJECTION_MATRIX, projection);
GL11.glGetIntegerv(GL11.GL_VIEWPORT, viewport);
new Matrix4f(projection)
.mul(new Matrix4f(modelView))
.project((float) x, (float) y, (float) z, viewport, screenCoords);
}
return new Vector2d(screenCoords.x, displayHeight - screenCoords.y);
}
}
除了移植之外,我还遵循了 LWJGL 3 中有关本机内存管理的最佳实践:https ://blog.lwjgl.org/memory-management-in-lwjgl-3/#strategy5
推荐阅读
- python - 如何通过一个提交按钮只用一个表单文档完成三个功能?
- html - HTML表格根据条件更改文本颜色
- c# - 旋转后找到形状的左上角
- python - 我的程序一直在循环,我不知道为什么
- javascript - TypeErr:无法读取未定义的属性“角色”
- dolphindb - 根据某个债券代码查找其所有日期的数据,我应该如何设计数据库?
- javascript - 使用特定时间范围的 If/Else 条件
- reactjs - Typescript 部署问题(本地部署没有问题)
- node.js - 事件未定义nodejs
- reactjs - React Web App 中私人发布的 AWS Sumerian 场景不包括聊天机器人功能(Polly 和 Lex)