我有2个问题。一个特定的问题是为什么我的代码没有按预期工作,另一个是设计问题。
1(具体问题):我正在尝试将屏幕坐标映射到基于2D图块的引擎中的世界坐标(使用x / y轴,z = 0)。我已经使用了Nehe的教程端口来了解如何实现这一点,但我得到的结果并不像预期的那样。
我有一个名为MouseController的类。每当触发一个鼠标事件时(通过swing的MouseListener),我将MouseEvent传递给我的MouseController。
在我的GLCanvas的绘图函数中,我调用MouseController.processClick(GL)函数,以便能够将当前的gl上下文传递给processClick函数,并获取模型视图,投影矩阵和视口。
当我点击屏幕上呈现的块时,回馈给我的世界坐标几乎没有任何意义。首先,我希望z值为0,但是它的9(这是我的相机设置的高度),而我的x和y值总是非常接近0(偶尔会跳到1-9)轻微的动作,然后回到非常接近0的数字。
任何人都知道为什么会出现这种情况? processClick函数如下:
public void processClick(GL gl) {
int x = e.getX();
int y = e.getY();
if(e.getButton() == MouseEvent.BUTTON1) {
gl.glGetIntegerv(GL.GL_VIEWPORT, viewPort, 0);
gl.glGetDoublev(GL.GL_MODELVIEW_MATRIX, mvMatrix, 0);
gl.glGetDoublev(GL.GL_PROJECTION_MATRIX, prMatrix, 0);
int realy = viewPort[3] - y;
glu.gluUnProject((double)x, (double)realy, 0, mvMatrix, 0, prMatrix, 0, viewPort, 0, wCoord, 0);
System.out.println(x + " " + y);
System.out.println(x + " " + realy);
System.out.println(wCoord[0] + " " + wCoord[1] + " " + wCoord[2]);
}
e = null;
}
当我点击我在世界坐标(4,5,0)处渲染正方形的屏幕时,我从上面的函数得到的示例输出:
878 56
878 636
0.0445182388817236 0.055475957454737095 8.900000001489369
谢谢!
编辑:使用glReadPixels读取深度缓冲区并使用它作为z(返回1)得到的结果是正确的,但是太大了20倍。 / p>
EDIT2:如果我将远裁剪平面设置为与摄像机高度相同的值,它似乎有效(但这不太合适)。
2(设计问题):我觉得在OpenGL画布的绘图功能中处理点击是没有意义的。我似乎要求该函数的GL能够检索gluUnProject运行所必需的矩阵。你们怎么设计这个?理想情况下,我觉得我应该能够将此运行与draw函数完全分开。将gl对象的引用存储到我的MouseController中,并在MouseListener选中它时处理单击。
关于你们如何处理它的输入也会非常感激!
答案 0 :(得分:0)
我决定使用gluOrtho2D来设置我的投影以简化解决这个问题。
唯一“棘手”的事情是将实际的屏幕分辨率传递给gluOrtho2D,可以通过以下方式检索(和存储):
getContentPane().getSize()
来自我使用的JFrame。
在面板上设置首选尺寸然后打包框架达到了接近的效果,但面板本身仍然略微偏离。