【问题标题】:Algorithms for selecting 3D elements (vertices, edges, faces) under a 2D rectangle region用于在 2D 矩形区域下选择 3D 元素(顶点、边、面)的算法
【发布时间】:2021-04-06 19:42:51
【问题描述】:

我正在尝试编写自己的 CAD 程序,我让用户能够通过在 2D 屏幕上绘制一个框或多边形来选择感兴趣的顶点/边/面(三角形),然后突出显示 3D 视图下方的任何内容(既忽略背面,也不忽略背面)。

这通常是怎么做的?有没有我可以看的开源示例?这通常是什么过程?

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

【问题讨论】:

  • 如果您的渲染器允许,则可以为每个要检测的元素分配一个唯一的颜色(尽管限制为 2400 万)并在与显示但不可见。光标位置会立即告诉您它位于哪个元素上。

标签: algorithm 3d rendering


【解决方案1】:

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

  1. 光线拾取

    初见:

    这个想法是将光线从相机焦点投射到鼠标(或光标)方向,然后选择光线击中的方向。上面的链接利用了 OpenGL 渲染,您可以非常轻松快速地完成此操作(几乎免费),结果是像素完美。为了使用选择框/多边形,您需要在 CPU 端读取其所有像素并将它们转换为所选实体列表。这会稍微慢一些,但仍然可以非常快地完成(不管渲染场景的复杂性如何)。这种方法是O(1),但是如果你在CPU上做同样的事情,那么复杂度会慢得多O(n),而n是实体总数(除非使用BVH或Octree)。 但是,此方法将仅选择可见的内容(因此没有背面或后面的对象)。

  2. 几何测试

    基本上,您的 2D 矩形会将透视 3D 平截头体切成更小的一个,并且应该选择内部或相交的部分。您可以使用 CPU 端的几何体以测试的形式(长方体或盒子内的对象)来计算它,如下所示:

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

另外我认为这对你来说可能会很有趣:

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

在 CAD/CAM 软件(IIRC AUTOCAD 开始)中进行选择的另一个提示是,如果您的选择框是从左到右和从上到下的方式创建的,则您选择完全在内部或相交的所有对象,如果选择框是在相反的方向创建的,您只选择完全在里面的东西。这种方式可以进行更舒适的编辑。

【讨论】:

    猜你喜欢
    • 2011-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多