gpt4 book ai didi

3d - 将模型从 .PLY 文件加载到半边数据结构中

转载 作者:行者123 更新时间:2023-12-04 07:09:46 28 4
gpt4 key购买 nike

我正在尝试构建一个 .PLY 解析器,以将存储为 .ply 文件的 3d 模型加载到半边数据结构网格中。

抱歉问了这么大的问题,我很冗长,我想确保我列出了所有的细节。因此,我将立即重申我的最终目标,以便用户可以在阅读要遵循的巨大文本块之前看到我想要什么。

1) 从 .PLY 文件的顶点和面列表中内存半边的好的散列是什么

或者

2)是否有更好的方法来从 .PLY 文件中的数据填充我的半边结构?

.PLY 文件列出顶点,然后是网格的面。显而易见的解决方案是先填充顶点表,然后使用面列表生成边表。问题是每条边都有一个伙伴边,因此对于四边形网格,加载的第一个四边形将需要 8 个半边。这最初不是问题,只需为面部创建四个半边并反转每条边以使其伙伴半边。这里的问题是,这会创建 4 个与 4 个不同面相关联的悬垂半边。

所以有两种攻击方法:首先为人脸生成所有边,然后尝试配对伙伴边。我真的不喜欢这种方法,它在编程上似乎效率较低,因为它会涉及大量的搜索和排序。

第二:按照第一个说明进行:从指定的第一个面开始并生成创建多边形所需的边,并且在创建边时也会创建它们的孪生。但是,我们将记住边列表,因此所有边都将散列到一个表中。然后,当我们为其他面生成边时,如果已经生成了一条边(因为它是先前加载的面的伙伴边),我们将简单地从表中抓取指针。

这就是我被困的地方。我需要一个智能散列函数来记住我的边缘列表。需要尽量减少碰撞以提高效率。我现在想到的方案是根据创建它们的两个顶点命名*边,IE 边 01 和 10 是双胞胎。最坏的情况是创建一个哈希表,其中所有顶点都可能被连接,最终大小为 2^n,其中 n = 顶点数,这是完全 Not Acceptable 。我的目标是使散列尽可能接近实际边缘的数量(= 每面边缘数量的总和),同时仍然最大限度地减少碰撞。

*注意:由于半边强制执行“仅逆时针”绘制方案,因此不可能发生名称冲突。通过根据绘制边的两个顶点命名边,我们确保所有名称对于单个半边都是唯一的。

最佳答案

I'm very verbose



您可能想对此有所了解。

获得边的一种简单方法是通过它的两个顶点的索引。为了使其唯一,首先采用较小的索引,然后采用较大的索引。像这样的东西:
uint hash(const Vertex& v1, const Vertex& v2)
{
int i1 = v1.index;
int i2 = v2.index;
if (i1 > i2)
swap(i1, i2);
return (i1 | (i2 << 16));
}

在这个哈希表指向的实际数据中,您可能想要跟踪您已经看到的哪一对以及您期望的哪一对(相反的)。

关于3d - 将模型从 .PLY 文件加载到半边数据结构中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/556095/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com