Я хочу создать трехмерную гоночную трассу вокруг сплайна, которая описывает его форму. Вот иллюстративное видео .
Трасса должна представлять собой бесконечный туннель, проходящий вдоль трехмерного сплайна, с некоторыми препятствиями. Моя лучшая идея до сих пор заключалась в том, чтобы поднять форму круга вдоль сплайна.
Я также хотел бы получить несколько советов о том, как управлять геометрией, то есть как создавать ее из операции loft, управлять ее «жизненным циклом» в памяти, столкновениях и текстурировании.
opengl
3d
racing
procedural
Валентин Галеа
источник
источник
Ответы:
Я не уверен, на каком языке вы работаете, но здесь есть пример процедурного вытягивания сетки для Unity3D:
http://unity3d.com/support/resources/example-projects/procedural-examples
Я уверен, что вы могли бы посмотреть на код и переработать его для вашей ситуации.
РЕДАКТИРОВАТЬ: я работаю над игрой, которая использует процедурную систему экструдированного рельса, как та, которую вы запускаете, но она в C # в Unity3d. Я дам вам обзор того, как я создаю свою экструзию рельса на основе пути Кубического Безье, поэтому, хотя сетка рельса генерируется процедурно, она основана на пути Безье, который я заранее определяю в редакторе. Это было бы похоже на редактор уровней в случае с вашей игрой, в моем случае это дизайн столов для пинбола. Ниже приведен пример того, как я это делаю:
1.) Построить / найти и реализовать класс пути Безье. Это даст вам исходные данные для вашего вытягивания сетки. В C # есть один, который вы можете портировать на c ++.
http://forum.unity3d.com/threads/32954-Waypoints-and-constant-variable-speed-problems?p=213942
2.) После создания пути Безье точки данных этого пути отбираются. Это можно сделать с помощью метода Interp в классе, указанном выше. Это даст вам список / массив точек Vector3 вдоль пути Безье.
3.) Создайте вспомогательный класс для преобразования данных пути Vector3 Bezier из шага 2. В этом случае у меня есть простой класс ExtrudedTrailSection, как определено ниже:
4.) Выполните итерацию по вашим образцам данных Vector3 и преобразуйте их в массив ExtrudedTrailSections, предоставив ему образцы данных и базовую матрицу, которая будет корневым местоположением вашей экструдированной сетки.
Matrix4x4 worldToLocal = rootTransform.worldToLocalMatrix;
6.) Теперь у вас есть массив Matrix4x4 [], и вы можете выдавливать сетку, но сначала нам понадобится эталонная сетка для вытягивания. У меня есть служебный класс, который создаст круглую грань сетки, которую мы предоставим методу экструзии сетки.
7.) Найдите центр этих данных:
8.) Теперь, когда у нас есть данные ребра и центра для радиальной грани, вы можете построить объект сетки, используя ваши данные. Последняя вершина в сетке - это центральная точка, которую мы вычислили. Конечная сетка - это просто грань, которая передается методу экструзии сетки, который я привел в качестве примера в классе процедурной экструзии сетки пакета Unity. Опять же, это мой метод, и, очевидно, вам придется передавать эти данные в OpenGL. Если у вас есть библиотека утилит 3d, которую вы используете или можете написать свой собственный класс меша, вероятно, будет лучше сгенерировать окончательный экструдированный меш, так как эти данные на самом деле не нужны opengl для рендеринга. Эта лицевая сетка просто используется в качестве эталона для экструзии сетки.
9.) Найдите внешние края круглой сетки в соответствии с методом экструзии сетки. Опять же, этот код предоставляется в пакете Unity.
10.) Введите все эти данные в метод Mesh Extrusion.
Окончательный вывод в моем случае выглядит следующим образом ..
Удачи, ваша игра выглядит действительно круто! Дайте мне знать, если вы поймете это?
цыпленок
источник