CAD程序的数据结构。一次数据鼠标拾取渲染

Data structure for CAD program. Mouse picking and rendering with one data

我尝试实现我的小型 CAD,并想知道如何为贝塞尔立方曲面基元组织数据。我的基元,例如一个盒子,将包含六个立方体 Bezie 块,为了方便,它们通过自己的数据相互构建。任何补丁都有 16 个点。我的基元将为任何迭代(选择点)缝合:例如,补丁边缘上的任何点都将与相邻补丁的相应点共享自己的位置。我可以删除重复的点,但为了渲染和更新基元,我需要保持数据不变,同时我需要强大的鼠标拾取算法来拾取边缘上的这些点,并让一个点与相邻补丁的相应点一起移动。 我想我有两个选择:

  1. 将数据组织为 std::multimap 或其他方式,其中一些点将通过键链接,但在这里我会遇到搜索点的问题。
  2. 改进采摘算法,提供采摘2-3个点为一个点,但我认为这是一个不好的解决方案。

解决这个问题的常用方法是什么?感谢您的任何建议。

一种常见且相对简单的方法是指针或基于索引的数据结构。后一个例子:

std::vector<Vector3> vertices;
struct Patch
{
    // Zero-based indices of the 16 control points in the vertices vector
    uint32_t indices[4][4];
}
std::vector<Patch> patches;

一个缺点是擦除顶点很昂贵,因为补丁需要固定调整这些索引。另一个缺点是枚举 link 到特定顶点的补丁很昂贵,但如果你需要经常这样做,你可以为此构建和维护一个单独的索引,例如std::unordered_multimap<uint32_t, uint32_t> lookupPatches;

如果您在 GPU 上镶嵌这些贝塞尔面片,这有好处,上传顶点(顶点缓冲区)和面片(索引缓冲区)非常有效。例如。对于 D3d11,它是 Map、memcpy、Unmap。