CAD程序的数据结构.鼠标拾取和渲染一个数据



我尝试实现我的小CAD,并想知道如何组织bezier立方表面原始图的数据。例如,我的原始框将包含六个立方贝齐补丁,为了方便起见,它可以通过自己的数据相互构造。任何补丁都有16分。我的primitieves将针对任何迭代(选择点)缝制:例如,补丁边缘上的任何点都将与邻居补丁的通讯点共享自己的位置。我可以删除重复的点,但是对于渲染和更新pripitieve,我需要保持数据未受到的数据,同时我需要强大的鼠标选择算法,该算法在边缘上选择该点,并让一个点与邻居补丁的相应点一起移动一个点。我想我有两个选择:

  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;

一个缺点,擦除顶点是昂贵的,因为需要固定补丁来调整这些指数。另一个缺点是枚举链接到特定顶点的补丁是昂贵的,但是如果您需要经常这样做,则可以构建&amp;为此保持单独的索引,例如std::unordered_multimap<uint32_t, uint32_t> lookupPatches;

如果您在GPU上进行这些Bézier补丁,则具有上升空间,上传两个顶点(顶点缓冲区)和补丁程序(索引缓冲区)非常有效。例如。对于D3D11,它的地图,memcpy,Unmap。

相关内容

最新更新