1

我遇到了 OpenGL 坐标系的问题。

我有一个使用以下代码创建六边形的小类:

    for(int i = 0; i < 6; ++i) {
        gl.glVertex2d(radius * Math.sin(i/6.0*2*Math.PI)-(radius*(x*1.75)),
                 radius * Math.cos(i/6.0*2*Math.PI)+(radius*(y*1.25)));
    }

注意,所有这些都是在 java 中使用 JOGL 库。

创建六边形时,它们的坐标系为屏幕中心为 0,0,左上角设置为 -1,1

我想把这些坐标转换成屏幕坐标,所以左上角是0,0,中心是windowX/2,-windowY/2。因此,如果窗口为 500 像素 x 500 像素,则中心将为 250,-250。

4

1 回答 1

1

这些坐标(中心在哪里, 左上角)就是所谓的标准化设备坐标。它们通常是像素在投影之后但在视口映射之前所在的中间坐标空间。<0,0> <-1,1>

解释投影和视口映射的图表

现在,关于这个坐标空间的有趣之处在于,如果您使用单位矩阵,Projection并且ModelView您可以完全按原样使用这些坐标。也就是说,您永远不需要知道视口的尺寸来绘制一个完全填充它的六边形。

否则,您应该使用与窗口使用相同尺寸的正交投影矩阵。glOrtho (...)是这样做的传统方式...

glMatrixMode   (GL_PROJECTION);
glLoadIdentity ();
glOrtho        (0.0, 500.0, -500.0, 0.0, -1.0, 1.0);

我很好奇,为什么在这个例子中你希望 Y 坐标的范围是 0 到 -500 而不是 0 到 500?

于 2013-08-25T04:00:07.767 回答