面部清单代表什么?

时间:2016-11-01 20:40:15

标签: graphics 3d mesh

我知道在网格表示中,通常使用三个列表:

顶点列表,所有顶点,这很容易理解

正常列表,我想每个表面的法线?

面部列表,我不知道它的作用,我也不知道如何计算它。

例如,这是一个描述我在网上发现的三棱柱的网格。

double vertices[][] = {{0,1,-1},
           {-0.5,0,-1},
           {0.5,0,-1},
           {0,1,-3},
           {-0.5,0,-3},
           {0.5,0,-3},
          };

int faces[][] = {{0,1,2}, //front
         {3,5,4}, //back
         {1,4,5,2},//base
         {0,3,4,1}, //left side
         {0,2,5,3} //right side
        };

double normals[][] = { {0,0,1}, //front face
           {0,0,-1}, //back face
           {0,-1,0}, //base
                   {-2.0/Math.sqrt(5),1.0/Math.sqrt(5),0}, //left
                   {2.0/Math.sqrt(5),1.0/Math.sqrt(5),0} //right
             };

为什么底座,左右两侧有4个元素,但前后只有3个元素?如何手动计算它们?

2 个答案:

答案 0 :(得分:1)

通常,faces存储顶点数组中每个三角形的索引。所以第一个面是由顶点[0],顶点[1],顶点[2]组成的三角形。第二个由顶点[3],顶点[4],顶点[5]等组成。

答案 1 :(得分:0)

对于三角形网格,面是由3个顶点定义的三角形。通常,网格由n个顶点和m个面的列表组成。例如:

顶点:

Point_0 = {0,0,0}
Point_1 = {2,0,0}
Point_3 = {0,2,0}
Point_4 = {0,3,0}
...
Point_n = {30,0,0}

面孔:

Face_0 = {Point_1, Point_4, Point_5}
Face_1 = {Point_2, Point_4, Point_7}
...
Face_m = {Point_1, Point_2, Point_n}

为简洁起见,您可以将Face_0定义为一组索引:{1,4,5}。

此外,法线向量被计算为面的顶点之间的叉积。按照惯例,法向量的方向指向网格外部。例如:

normal_face_0 = CrossProcuct ( (Point_4 - Point_1) ,   (Point_5 - Point_4) )

在你的情况下,在面部定义中看到四个索引是很奇怪的。通常,阵列中应该只有3个项目。你确定这不是一个错误吗?