在 2D 矩形区域下选择 3D 元素(顶点、边、面)的算法

Algorithms for selecting 3D elements (vertices, edges, faces) under a 2D rectangle region

我正在尝试编写自己的 CAD 程序,让用户能够通过在2D 屏幕,然后突出显示 3D 视图下方的任何内容(既忽略背面也不忽略背面)。

这通常是如何完成的?有没有我可以看的开源示例?这通常是什么过程?

当您试图处理超过 100 万个三角形时,这尤其困难。

有很多方法可以做到这一点,这里有两种最常用的方法:

  1. 光线拾取

    初见:

    想法是从相机焦点向鼠标(或光标)方向投射光线,并且光线命中的是 selected。上面的 link 利用了 OpenGL 渲染,您可以在其中非常轻松快速地(几乎免费)完成此操作,并且结果是像素完美的。为了使用 selecting box/polygon,您需要读取其在 CPU 侧的所有像素并将它们转换为实体列表 selected。这稍微慢一些,但仍然可以非常快地完成(无论渲染场景的复杂性如何)。这种方法是 O(1) 但是,如果你在 CPU 上做同样的事情,它会随着复杂性 O(n) 而慢得多,而 n 是实体总数(除非 BVH 或者是八叉树用过的)。 然而,此方法将 select 仅显示可见内容 (因此没有背面或后面的物体)。

  2. 几何测试

    基本上,您的 2D 矩形会将透视 3D 平截头体切成较小的一个,内部或相交的部分应该 selected。您可以使用 CPU 侧的几何图形以测试形​​式(长方体或盒子内的对象)进行计算,如下所示:

    除非使用 BVH 或 Octree,否则复杂度也是 O(n)此方法将select所有对象(甚至不可见的对象)。

此外,我认为这对您来说可能很有趣:

  • simple Drag&Drop in C++

它展示了一个简单的 C++ 应用程序架构,能够在 2D 中放置和移动对象。它是 CAD 类应用程序的基本起点。对于 3D,您只需添加 and or ...

在 CAD/CAM 软件(IIRC AUTOCAD 开始)中 selecting 的另一个提示是,如果你的 selection box 是从左到右,从上到下创建的方式你 select 所有完全在内部或相交的对象,如果 select 离子盒是在相反方向创建的,你 select 只有完全在内部的对象。这种方式可以让编辑更舒适。