Java OpenGL屏幕使用gluUnProject +设计讨论进行世界转换

时间:2012-03-07 10:20:29

标签: java opengl mouse-coordinates

我有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选中它时处理单击。

关于你们如何处理它的输入也会非常感激!

1 个答案:

答案 0 :(得分:0)

我决定使用gluOrtho2D来设置我的投影以简化解决这个问题。

唯一“棘手”的事情是将实际的屏幕分辨率传递给gluOrtho2D,可以通过以下方式检索(和存储):

getContentPane().getSize()

来自我使用的JFrame。

在面板上设置首选尺寸然后打包框架达到了接近的效果,但面板本身仍然略微偏离。