说明
我有一个网格及其所有顶点面信息(顶点索引,顶点位置,面索引等),我想渲染此网格的子部分。例如,如果我有手形网格,我只想渲染其中一个手指。
我有每个子部分相关顶点的信息,这意味着我知道要渲染的手指的顶点索引,顶点位置等。但是,我不知道哪个面与手指有关。所以,我需要找到相关的面部索引来渲染子部分。
问题:
如何在整个面部索引集中找到子部分的关联索引?我可以使用详尽的搜索算法但是,我希望有一种更好的方法,一种已知的算法来做到这一点。
更多信息:
class Vertex
{
Vertex(float _x, float _y, float _z)
{
x = _x; y = _y; z = _z;
}
float x, y, z; // Positions
};
class Face
{
Face(int _v1, int _v2, int _v3)
{
vertIndex1 = _v1; vertIndex2 = _v2; vertIndex3 = _v3;
}
int vertIndex1, vertIndex2, vertIndex3; // Vertex indices
};
三角形方形网格的示例用法:
某些向量,例如std::vector<Vertex> verts
和std::vector<Face> faces
。我有Vertex
v1(0,0,0),v2(1,0,0),v3(0,1,0)和v4(1,1,0)。所以对应的Face
对象是f1(0,1,2)和f2(0,3,4),其中0,1,2和4是Vertex
中verts
个对象的索引向量。如您所见,顶点可以位于不同的Face
s。
现在,假设我有一个手形网格,其中verts.size()
为6000,faces.size()
为12000.但是,我只想渲染小手指而我只有一套小指的顶点指数,如(345,369,541,...)。
所以,我知道我需要使用哪些顶点,我知道整个面部信息,我想找到仅适用于这些给定顶点的面部索引。
答案 0 :(得分:1)
如果我在评论中描述的简单O(m + n) - 时间,O(n) - 空间算法太慢,那么你可以做很多事情,但我建议以下简单的技巧每当(a)宽度或高度或时,快速找到所有相关面,包含所有子零件顶点的边界框的深度为&#34;小&#34; ,(b)大部分面孔都不太宽&#34;:
预计算6个面列表,每个维度2个(x,y,z):一个通过增加该维度中的最小顶点坐标进行排序,另一个通过增加该方向上的最大顶点坐标进行排序。从给定的子部件顶点列表中,找到3个维度中每个维度的最小和最大位置(所以6个数字,mx,my,mz,Mx,My,Mz)。在由mx的最小顶点x co-ord排序的面部列表中进行二进制搜索,然后再对Mx进行二进制搜索,分别给出列表i和j内的位置。我们只需要实际测试i .. j范围内的面,因为根据定义,每个其他面都至少有一个顶点,其中x co-ord超出范围mx .. Mx(如果它的最小x co-ord是&lt; mx ,它在该范围之外至少有一个顶点;如果它的最小x顶点是> Mx,那么所有3个顶点都在该范围之外)。记住j-i,并对其他5个排序列表做类似的操作,跟踪具有最小j-i值的列表。最后,在最小的可能列表中测试所有面孔&#34;艰难的方式&#34;。