LWJGL 采摘 - Select 悬停时的特定块( gluUnProject() )
LWJGL Picking - Select Certain Block When Hovering ( gluUnProject() )
这个视频会展示我目前的情况,我目前在网上找不到任何答案。
https://www.youtube.com/watch?v=O8Mh-1Emoc8&feature=youtu.be
我的代码:
public Vector3D pickBlock() {
glDisable(GL_TEXTURE);
IntBuffer viewport = BufferUtils.createIntBuffer(16);
FloatBuffer modelview = BufferUtils.createFloatBuffer(16);
FloatBuffer projection = BufferUtils.createFloatBuffer(16);
FloatBuffer winZ = BufferUtils.createFloatBuffer(1);
float winX, winY;
FloatBuffer position = BufferUtils.createFloatBuffer(3);
glGetFloat(GL_MODELVIEW_MATRIX, modelview);
glGetFloat(GL_PROJECTION_MATRIX, projection);
glGetInteger(GL_VIEWPORT, viewport);
winX = (float)Display.getWidth() / 2;
winY = (float)viewport.get(3) - (float)Display.getHeight() / 2;
glReadPixels(Display.getWidth() / 2, (int)winY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, winZ);
gluUnProject(winX, winY, winZ.get(), modelview, projection, viewport, position);
glEnable(GL_TEXTURE);
return new Vector3D(position.get(0) / 2 + 0.5f, position.get(1) / 2 + 0.5f, position.get(2) / 2 + 0.5f);
}
它 returns "/ 2 + 0.5f" 因为我对块的偏移量需要它(如果我删除了 0.5f,偏移量将在中心而不是角落)
根据视频,我认为错误来自于您面向正 z 方向(或任何您的后向)。我的猜测是你没有考虑面向方向,正如我在你的代码中看到的那样,你只是在光标的位置添加了一个常量 0.5F。
因此,当你面向后方时,它会增加 0.5,使其位于墙后(因为后方是负 Z)。一个简单的检查是天气前向向量的 Z 分量是正还是负,并根据它决定添加到光标的因子,然后对 X 执行相同的操作。
根据您实现相机的方式(即:如果您使用欧拉角(rx、ry、rz)或者如果您使用四元数/前向向量),您进行检查的方式会有所不同,请随意如果需要,请根据您的系统向我索取示例。
希望对您有所帮助!
PS:如果您使用的是角度,您可以检查 y 轴旋转值的范围并确定您面对的方向,从而确定要加减的天气,或者您可以根据你的角度计算前向矢量,然后检查分量的for符号。
这个视频会展示我目前的情况,我目前在网上找不到任何答案。
https://www.youtube.com/watch?v=O8Mh-1Emoc8&feature=youtu.be
我的代码:
public Vector3D pickBlock() {
glDisable(GL_TEXTURE);
IntBuffer viewport = BufferUtils.createIntBuffer(16);
FloatBuffer modelview = BufferUtils.createFloatBuffer(16);
FloatBuffer projection = BufferUtils.createFloatBuffer(16);
FloatBuffer winZ = BufferUtils.createFloatBuffer(1);
float winX, winY;
FloatBuffer position = BufferUtils.createFloatBuffer(3);
glGetFloat(GL_MODELVIEW_MATRIX, modelview);
glGetFloat(GL_PROJECTION_MATRIX, projection);
glGetInteger(GL_VIEWPORT, viewport);
winX = (float)Display.getWidth() / 2;
winY = (float)viewport.get(3) - (float)Display.getHeight() / 2;
glReadPixels(Display.getWidth() / 2, (int)winY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, winZ);
gluUnProject(winX, winY, winZ.get(), modelview, projection, viewport, position);
glEnable(GL_TEXTURE);
return new Vector3D(position.get(0) / 2 + 0.5f, position.get(1) / 2 + 0.5f, position.get(2) / 2 + 0.5f);
}
它 returns "/ 2 + 0.5f" 因为我对块的偏移量需要它(如果我删除了 0.5f,偏移量将在中心而不是角落)
根据视频,我认为错误来自于您面向正 z 方向(或任何您的后向)。我的猜测是你没有考虑面向方向,正如我在你的代码中看到的那样,你只是在光标的位置添加了一个常量 0.5F。
因此,当你面向后方时,它会增加 0.5,使其位于墙后(因为后方是负 Z)。一个简单的检查是天气前向向量的 Z 分量是正还是负,并根据它决定添加到光标的因子,然后对 X 执行相同的操作。
根据您实现相机的方式(即:如果您使用欧拉角(rx、ry、rz)或者如果您使用四元数/前向向量),您进行检查的方式会有所不同,请随意如果需要,请根据您的系统向我索取示例。
希望对您有所帮助!
PS:如果您使用的是角度,您可以检查 y 轴旋转值的范围并确定您面对的方向,从而确定要加减的天气,或者您可以根据你的角度计算前向矢量,然后检查分量的for符号。