所以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)转换为裁剪区域中的相应位置?
答案 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坐标时,就得到上面给出的等式。