在三维CAD 软件和3D游戏中,都有目标的拣选操作。通常有两种方式来实现这个功能:一是通过手工计算从屏幕发出的射线与场景内的物体求交,二是使用Vulkan/OpenGL的拾取机制(Selection Mode)。 即使是自己实现三维选择操作,也有多种方式。
简单的拾取操作分为两类:点选和框选。点选非常简单,就是求解一条射线和场景内物体的相交。框选则需要按照投影模式分一下:平行投影模式下视景体是长方体,透视投影模式下视景体是一个平截头体(frustum)。两者的计算难度则相差较大。这些计算,本质上都是碰撞检测,和游戏中子弹射出后击中物体所需要的计算原理是相同的。
点选时,我们需要根据相机的position和近平面上被选择的点构造一条射线。我们原来的项目中,试图把这条射线构造为一个很细的长方体,以图以此解决点选时可允许误差问题。事实证明这种方式行不通。还是简单的采用第三方lib。
框选时,我们需构造cuboid或frustum来对场景中已有的triangle、cuboid、sphere或任意形状的物体做相交检测。这里必须要对已有的物体做包围盒了,包围盒能减少一两个数量级的计算量。如果物体没有旋转,采用最简单的OBB即可。用上lib,我们很快就能完成开发任务。
我推荐的一个C++算法lib是 Geometric Tools,其作者也是Geometric Tools for Computer Graphics一书的作者。代码接口很简单明了。
关于OpenGL/Vulkan拾取,
计算几何实践2.2:3D窗口的拾取操作
最新推荐文章于 2024-07-11 15:19:27 发布
2018-02-25