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

标签 c++ bezier cad

我尝试实现我的小型 CAD,并想知道如何为贝塞尔立方曲面基元组织数据。我的基元,例如一个盒子,将包含六个立方体 Bezie block ,为了方便,它们通过自己的数据相互构建。任何补丁都有 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;

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

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

关于c++ - CAD程序的数据结构。一次数据鼠标拾取渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46028778/

相关文章:

c++ - 为什么我的程序表现异常

c++ - 在VS2017中编译错误C2027,但使用小对象优化的Clang则不然

c++ - 使用 C 语言通过贝塞尔曲线平滑粗糙多边形的算法

c# - 使用 devDept Eyeshot 查找两个 3D 形状之间的差异

opengl - CAD中C2曲面是什么,C2是什么意思?

c++ - 堆栈帧是否在范围内分配和释放?

c++ - 我可以使用 STL 容器管理不完整的类对象吗?

math - 给定一个具有固定端点的三次贝塞尔曲线,当给定一个要检查的 y 位置时,如何找到沿它的点的 x 位置?

svg - 在 Raphael.js 中获取两点之间的子路径,而不是位置

Clojure:如何构建桌面 UI