Генерация 3D-призмы из любого 2D-полигона - PullRequest
3 голосов
/ 21 февраля 2011

Я создаю 2D спрайт-игру в Unity, которая является средой разработки 3D-игр. Я ограничил весь перевод объектов на плоскость XY и поворот на ось Z.

Моя проблема в том, что сетки, которые используются для обнаружения столкновений между объектами, все еще должны быть в 3D. Мне нужно обнаруживать столкновения между объектом игрока (капсульным коллайдером) и спрайтом (объем столкновения которого определяется полигональной призмой).

В настоящее время я пишу редактор уровней, и мне нужно позволить пользователю определить область столкновения для любой данной плитки. На изображении ниже пользователь щелкает точки P1, P2, P3, P4 в этом порядке.

enter image description here

Очевидно, что точки соединяются в четырехугольник. Это та область столкновения, которую я хочу, однако я должен затем преобразовать ее в трехмерную сетку. По сути, мне нужно сгенерировать выдавливание многоугольника, затем назначить обмотку вершины, треугольники и т. Д. Положение вершин не является проблемой для выяснения, поскольку это всего лишь перевод многоугольника вниз по оси z.

enter image description here

У меня проблемы с созданием алгоритма назначения порядка намотки вершин, тем более что сетка должна состоять только из треугольников.

Очевидно, что структура, которую я иллюстрировал, не важна, многоугольник может быть любой 2-й формы и всегда должен будет образовывать призму. Кто-нибудь знает какие-либо методы для этого?

Большое спасибо всем за ваше время.

Ответы [ 2 ]

1 голос
/ 01 марта 2011

Для создания экструдированных стен:

Для каждой вершины a (с координатами a x , a y ) в вашем многоугольнике: - вызвать следующую вершину 'b' (с координатами b x , b y ) - создать вытянутый прямоугольник, соответствующий линии от 'a' до 'b': - Прямоугольник имеет вершины (a x , a y , z 0 ), (a x , a y , z 1 ), (b x , b y , z 0 ), (b x , B * * у тысячи тридцать три , г 1 * * одна тысяча тридцать шесть) - Этот прямоугольник можно создать из двух треугольников: - (a x , a y , z 0 ), (a x , a y , z 1 ), (b x , b y , z 0 ) и (a x , a y , z 1 ), (b x , b y , z 0 ), (b х * 1 068 *, B у , г * +1071 * 1 * * тысяча семьдесят два)

Если вы хотите вместо этого создать треугольную полосу, это еще проще. Для каждой вершины a просто добавьте (a x , a y , z 0 ) и (a x , a у * * тысяча восемьдесят пять, г * 1 086 * 1 * * тысяча восемьдесят-семь). Любую вершину, которую вы обработали первой, также необходимо будет обработать снова после зацикливания всех остальных вершин.

Чтобы создать заглушки:

Этот шаг, вероятно, не нужен для целей столкновения. Но здесь есть одна простая техника: http://www.siggraph.org/education/materials/HyperGraph/scanline/outprims/polygon1.htm Каждый полученный треугольник должен быть добавлен на глубину z 0 и z 1 .

1 голос
/ 21 февраля 2011

Простой алгоритм, который приходит на ум, выглядит примерно так:

extrudedNormal = faceNormal.multiplyScale(sizeOfExtrusion);//multiply the face normal by the extrusion amt. = move along normal
for each(vertex in face){
   vPrime = vertex.clone();//copy the position of each vertex to a new object to be modified later
   vPrime.addSelf(extrudedNormal);//add translation in the direction of the normal, with the amt. used in the 
 }

Итак, идея проста:

  • клонируйте лицо в нормальное положение и двигайте его в том же направлениипо амт.Вы хотите вытянуть с помощью
  • клонировать вершины грани и переместить их, используя перемещенную (вытянутую) нормальную позицию

Более подробный пример с множеством функций см. в Процедурное моделирование образцов Unity .Они также включают хороший образец экструзии Mesh (см. ExtrudedMeshTrail.js, который использует MeshExtrusion.cs).

Goodluck!

...