我知道在网格表示中,通常使用三个列表:
顶点列表,所有顶点,这很容易理解
正常列表,我想每个表面的法线?
面部列表,我不知道它的作用,我也不知道如何计算它。
例如,这是一个描述我在网上发现的三棱柱的网格。
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个元素?如何手动计算它们?
答案 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个项目。你确定这不是一个错误吗?