Что представляет собой список лиц?

Я знаю, что в сеточном представлении обычно используются три списка:

Список вершин, все вершины, это легко понять

Список нормалей, нормали для каждой поверхности, я думаю?

И список лиц, я понятия не имею, что он делает, и не знаю, как его рассчитать.

Например, это сетка, описывающая треугольную призму, которую я нашел в Интернете.

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? Как их рассчитать вручную?


person SuperMurloc    schedule 01.11.2016    source источник


Ответы (2)


Обычно в грани хранятся индексы каждого треугольника в массиве вершин. Итак, первая грань - это треугольник, состоящий из вершин [0], вершин [1], вершин [2]. Второй состоит из вершин [3], вершин [4], вершин [5] и так далее.

person BDL    schedule 01.11.2016
comment
Спасибо за ваше объяснение. Я не уверен, что здесь означает слово «индексы» и какие операции мне следует делать. Можете привести более подробный пример? - person SuperMurloc; 02.11.2016

Для треугольных сеток грань - это треугольник, образованный 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 элемента. Вы уверены, что это не ошибка?

person Nic    schedule 02.11.2016