OpenGL中的拾取(Picking)

本文介绍了OpenGL中的几何拾取技术,通过屏幕点击生成射线并求交于场景物体,详细阐述了从屏幕坐标到NDC空间、再到投影面坐标的变换过程,并讨论了如何在不同空间进行射线与物体的相交测试,以及利用空间数据结构提高求交效率的方法。
摘要由CSDN通过智能技术生成

OpenGL本身支持基于图像空间的拾取,这里指的是几何拾取,即由屏幕点击触发一条射线,然后和场景中的物体求交,进而判断是否拾取到物体。现在先把OpenGL的投影矩阵和视口变换矩阵列出来:

OpenGL的投影矩阵:

OpenGL Perspective Projection Matrix

OpenGL的视口变换矩阵:

假设鼠标点击屏幕(X,Y)位置,现在把它逆变换到NDC空间,假设其坐标为(Xn,Yn),结合视口变换矩阵可以求得:

Xn = ( X - (Vr + Vl)/2 ) / (Vr-Vl)/2 = ( X - VP_Center_X ) / Half_VP_Width

Yn = ( Y - (Vt + Vb)/2 ) / (Vt-Vb)/2 = ( Y - VP_Center_Y ) / Half_VP_Height

上面的参数分别代表视口的中心以及视口的宽度和高度。

接下来要把NDC坐标(Xn,Yn)变换到投影面坐标P(Xp,Yp)以构造拾取射线,现在假设在视图空间中有某个点(Xe,Ye,Ze)刚好投影到P点,则根据投影矩阵可得到下式:

Xn = -2n/(r-l)Xe/Ze - (r+l) / (r-l) 

OpenGL可编程管线(OpenGL Programmable Pipeline)是一种用于图形渲染的编程框架,通过编写顶点/片元着色器程序来实现对图形渲染过程的控制。而拾取Picking)是指通过特定的手段选择或者捕捉到场景的一个或多个物体。 在OpenGL可编程管线,实现拾取可以通过以下步骤完成: 1. 为需要拾取的物体设置唯一的标识符(ID):在渲染场景时,为每个物体分配一个唯一的ID,可以通过OpenGL提供的函数生成一个一致的ID。 2. 渲染场景:正常渲染整个场景,使用顶点和片元着色器进行图形渲染,但是需要使用ID来标识每个物体。 3. 读取选择像素:通过获取鼠标位置对应的像素颜色,获取用户点击(或者鼠标悬停)的位置的像素颜色。 4. 解析像素颜色:将获取到的像素颜色转换为对应的ID。 5. 处理拾取结果:根据解析得到的ID,找到对应的物体,对其进行进一步的处理。 需要注意的是,拾取过程必须保证物体的ID是唯一的,并且ID应该与物体渲染时使用的颜色没有冲突。此外,为了提高效率,可以利用一些空间划分的方法(如包围盒)来快速排除不需要的物体。 总之,OpenGL可编程管线提供了一种灵活的方式来实现图形渲染的控制,而拾取则是通过对特定物体设置唯一的标识符,并通过像素颜色解析来选择或捕获到场景的物体。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值