0

这是COpenGl Control类,到目前为止,我一直在使用它来在 MFC 中完成我的项目。
我已经在这个类上写了很多导航函数,比如pan, zoom tool, fixed zoom in,fixed zoom out等等,并且我已经设法在上面渲染了一个图像。
在所有这些导航任务中,我都使用了鼠标事件和 opengl 窗口坐标来实现。
现在在项目的一个部分(它处理在 shapefiles 的帮助下注册 tiff 图像)我需要使用世界坐标:
例如,假设我放大图像并单击一个点,我需要知道哪个像素我正在缩放的​​图像不是 opengl 窗口的像素。
或者假设,我放大在 opengl 中呈现的 shapefile,然后单击一个点,我需要知道我单击的点的坐标是什么,例如 (65696.5577,43995.3245) 米。

我怎样才能在opengl中实现这样的目标?

  • 当我单击opengl窗口没有窗口坐标时,如何获取渲染形状的世界坐标?
4

1 回答 1

0

我见过很多方法。

  • 如果您只对单击的对象感兴趣,则有些人已经完成了渲染过程,其中每个对象都被渲染为唯一的颜色,并且单击了鼠标下方的像素。不能推荐,因为这可能不可靠,并且抗锯齿之类的东西会破坏它。如果每帧都这样做,性能不会那么高,因为 GPU 驱动程序必须等到它完成绘制,停下来把图像交给你,然后继续。
  • 如果您手头有变换矩阵,则可以将鼠标光标位置转换为规范化的设备坐标(-1:左/下,0:屏幕中间,1:右/上 - 尽管我可能混淆了上/下那里)并使用 -1 和 1 的 Z 反转变换,让您获得可以执行碰撞的射线的起点和终点。如果您使用一些统一的网格类或有一种方法可以迭代场景中的所有三角形,这很容易。
  • 作为上述两种方法的混合,从深度缓冲区中获取深度,并且(您需要对其进行线性化)使用它在光线上的近点和远点之间进行插值。
  • 遍历场景中的每个三角形,将它们转换为标准化的设备坐标,然后转换为屏幕空间,(加一,乘以屏幕宽度/高度,除以二)然后对屏幕空间中的三角形进行三角点检查。如果您在找到鼠标悬停的三角形时保留了世界空间坐标,请找到重心坐标并与每个顶点的位置相乘。
于 2013-09-15T08:31:13.197 回答