计算机图形学中有哪些3d拾取的演算法,尽可能多几种,谢谢!


三维拾取(picking)在图形学里主要是指用户对三维场景做交互时,从二维屏幕坐标找出点击中的三维物体,其主要可分为两类:基于光栅化的方法、几何演算法。

基于光栅化的方法中,通常是在光栅过程中,把物体的标识符(identity,例如每个物体唯一的颜色)渲染至一个渲染目标,然后再回读缓存中的数据。理论上可以把场景独立渲染至所需位置的 1x1 渲染目标便可,但这样需要再跑一次大部分渲染管道(例如提交 drawcall 和光栅化开销)。所以通常是直接在渲染场景时同时渲染此数据。在一些平台上可使用 stencil 去存储此数据。其优点是像素级精确,也可处理含不透明度材质的情况。

几何方法就是把二维屏幕坐标,利用摄像机的视锥,转换成三维射线(3D ray,即 [公式] ),然后和场景做相交测试,并找出最接近( [公式] 为最小)的物体。为了加速性能,需要场景管理的数据结构去快速找到潜在相交的物体,然后再做细致的(如逐三角形)的细致检测。其优点是和屏幕分办率无关,可在CPU上实现(也可利用GPU光线追踪)。但缺点是实现相对光栅化复杂,如果要考虑透明材质还需CPU方的纹理采样。


这问题比你想像的要复杂很多

http://www.realtimerendering.com/intersections.html


本人水平比较菜,不怎么会用专业术语,不扯理论,只谈工程。

  1. 在渲染流程走光栅化的时候,给每个顶点加一个标志位,例如,场景中有一个椅子,一个桌子。在把顶点信息传入显卡中时,除了xyz信息再增添一个int信息,比如桌子是0,椅子是1。那么,通过渲染管线的各个流程后,这个信息还仍然是保留的,最后的fragment/pixel阶段就可以读出当前像素所拾取的几何体了。
  2. 在渲染流程走光线追踪或者光栅化时,把场景组织成一颗八叉树或者BVH树,然后从像素发射射线,随后遍历场景中的图元,求交,最后找到深度值最近的图元即可。
  3. 事实上在走光栅化的时候,会有大量的图元是被遮挡住的,可以在进行视锥体剔除的时候就直接顺便把拾取给完成了。

-----------------------------------------------------------------


一般来说是两类

一类是利用射线拾取 也就是从滑鼠点向平面内的方向发一条射线 通过几何计算相交行找出射线相交的三角面 点等信息 这类一般是CPU拾取 大场景下费CPU 所以要配合八叉树 bvh树等数据结构优化拾取效率

第二类是GPU拾取,一般做法是给每个mesh一种颜色 然后绘制一遍,滑鼠点所在的位置readPixel读取像素颜色 反推对应的mesh 好处是演算法简单 但是会增加drawcall 费GPU


物理方式简单就打条射线,判断相交

渲染方式,就是屏幕空间打射线判断颜色

物理引擎很成熟了


你可以参考下机器人抓取领域的一些总结:Tom Hardy:机器人抓取汇总|涉及目标检测、分割、姿态识别、抓取点检测、路径规划


一开口就知道老南邮了


推荐阅读:
相关文章