OpenGL屏幕到世界的坐标转换

时间:2016-10-16 08:00:03

标签: opengl coordinates

所以opengl的默认2d剪切区域是-1.0到右边1.0,而buttom -1.0到前面1.0

我为opengl程序创建的窗口宽度为640像素,高度为480像素。左上角像素是(0,0),右按钮像素是(640,480)

当我单击并拖动并释放鼠标按钮时,我还编写了一个函数来检索坐标(当我点击时,它是(x1,y1),当我释放它时(x2,y2))

那么我应该怎么做才能将(x1,y1)和(x2,y2)转换为裁剪区域中的相应位置?

2 个答案:

答案 0 :(得分:1)

@BDL给出的答案可能会让你足够接近你需要的东西,但计算结果并不正确。

除法必须是每个坐标方向上的像素数,因为在坐标范围内确实有640/480像素。

要考虑的一个微妙细节是,当您从鼠标输入获得给定位置时,这些将是像素的整数坐标。如果您只是根据窗口大小应用缩放,则生成的OpenGL坐标将映射到像素的左/下边缘。但你最想要的是像素的中心。要将其精确地转换为OpenGL坐标空间,您只需对输入值应用0.5偏移,将值从边缘移动到像素的中心。

例如,最左边的像素将具有x坐标0,最右边的639.在应用0.5偏移之后,这两个像素的中心是0.5和639.5。应用此校正,您还可以看到它们现在距离0和640区域的相应边缘的距离均为0.5,从而使整个事物对称。

所以正确的计算是:

float xClip = ((xPix + 0.5f) / 640.0f) * 2.0f - 1.0f;
float yClip = 1.0f - ((yPix + 0.5f) / 480.0f) * 2.0f;

或略微简化:

float xClip = (xPix + 0.5f) / 320.0f - 1.0f;
float yClip = 1.0f - (yPix + 0.5f) / 240.0f;

这会考虑y反演。

答案 1 :(得分:0)

我假设最右边的像素是639(否则你的窗口将是641像素大)。

转换很简单,我们只需要一个线性映射。要将点P从像素坐标变换到剪切坐标,可以使用以下公式

                        319.5
 P_clip = (P_pixel / [        ]) - 1.0
                        239.5

让我们一步一步地了解x坐标。首先,我们通过除以窗口宽度

将[0,639]范围转换为[0,1]范围
P_01 = P_pixel_x / 639

然后我们通过乘以2并减去1

从[0,1]转换为[-1,1]
P_clip_x = P_01 * 2 - 1

当一个人将这两个计算结合起来并将其扩展到y坐标时,就得到上面给出的等式。

相关问题