此视频将显示我目前的情况,目前我无法在线找到任何答案。
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);
}
返回" / 2 + 0.5f "因为我对块的偏移是必需的(如果我删除0.5f,偏移将在中心而不是角落)
答案 0 :(得分:0)
我接触到我说,基于视频的错误来自于你面向正z方向(或任何你的背方向)。我的猜测是你没有考虑到面向的方向,因为我在你的代码中看到你只是在光标位置添加一个0.5F的常量。
因此,当你面向后方时,它会增加0.5,这使得它在墙后面(因为背面是负Z)。一个简单的检查是天气前向矢量的Z分量是正的还是负的,并根据它确定添加到光标的因子,然后对X做同样的事情。
取决于你如何实现你的相机(IE:如果你使用了欧拉角(rx,ry,rz)或者你使用的是四元数/前向矢量),你做检查的方式会有所不同,请随时问我根据您的系统提供的示例(如果需要)。
希望这有帮助!PS:如果你正在使用角度,你可以检查y轴旋转值的范围并确定你面向的方向,从而加上或减去天气,或者你可以计算前向矢量根据您的角度,然后检查组件的for符号。