Построение индексного буфера из списка точек - PullRequest
0 голосов
/ 23 января 2019

У меня есть список точек в 2d пространстве, и мне нужно построить из них вершину и индексный буфер (я использую Unity).Я не могу понять, как обрабатывать точки в правильном порядке, чтобы сделать это.

Приведенная ниже звезда является примером, мой ввод гарантированно действителен, но неизвестен во время компиляции.

mesh0 = new Mesh();

// vertices for a star shape
List<Vector3> vertices0 = new List<Vector3>();
List<int> triangles0 = new List<int>();

vertices0.Add(new Vector3(150, 0, 0));
vertices0.Add(new Vector3(121, -90, 0));
vertices0.Add(new Vector3(198, -35, 0));
vertices0.Add(new Vector3(102, -35, 0));
vertices0.Add(new Vector3(179, -90, 0));

// this bit is wrong
for(int i = 0; i < vertices0.Count - 1; i++) {
    triangles0.Add(i);
    triangles0.Add(i + 1);
    triangles0.Add(i + 2);
}
mesh0.SetVertices(vertices);
mesh0.SetTriangles(triangles, 0);

Я бы ожидал, что треугольники в этом случае будут [0, 1, 2, 2, 3, 4, 0, 4, 3], чтобудет допустимым индексным буфером для визуализации формы звезды.Кто-нибудь может указать мне правильное направление?

1 Ответ

0 голосов
/ 23 января 2019

Ваш массив треугольников будет

0, 1, 2
1, 2, 3
2, 3, 4
3, 4, 5

5 отбрасывает вас, но у вас также есть только 4 треугольника.

В этом случае вам нужно обернуть треугольники

Я бы предложил переформатировать генерацию вашего треугольника так:

for(int i = 0; i < vertices0.Count; i++) 
{
     triangles0.Add(i);
     triangles0.Add((i + 1) % vertices0.Count);
     triangles0.Add((i + 2) % vertices0.Count);
}

Оператор модуля здесь «обернет» ваши значения, если они больше, чем число.Я также удалил -1 из числа вершин, потому что вы на самом деле не добавляли 5-й треугольник

Это все равно не делает звезду, хотя она образует пятиугольник и выдает следующие треугольники:

0,1,2
1,2,3
2,3,4
3,4,0
4,0,1

У него также есть много перекрывающихся треугольников, но я уверен, что вы можете модифицировать его, чтобы делать то, что вы хотите отсюда

...