Chcę wygenerować trójwymiarowy tor wyścigowy wokół splajnu, który opisuje jego kształt. Oto przykładowy film .
Ścieżka powinna być niekończącym się tunelem, który rozciąga się wzdłuż trójwymiarowego splajnu, z pewnymi przeszkodami. Moim najlepszym pomysłem do tej pory było wyciągnięcie kształtu okręgu wzdłuż splajnu.
Chciałbym również uzyskać wskazówki dotyczące zarządzania geometrią, tj. Tworzenia jej z operacji wyciągnięcia po profilach, zarządzania „cyklem życia” pamięci, kolizji i teksturowania.
opengl
3d
racing
procedural
Valentin Galea
źródło
źródło
Odpowiedzi:
Nie jestem pewien, w jakim języku pracujesz, ale tutaj znajduje się przykład procedury ekstruzji siatki dla Unity3D:
http://unity3d.com/support/resources/example-projects/procedural-examples
Jestem pewien, że możesz spojrzeć na kod i przerobić go w swojej sytuacji.
EDYCJA: Pracuję nad grą, która wykorzystuje proceduralny system szyny wytłaczanej, taki jak ten, który zaczynasz, ale jest w C # w Unity3d. Dam ci przegląd tego, jak tworzę moje wytłoczenie szyny na podstawie sześciennej ścieżki Beziera, więc chociaż siatka szyny jest generowana proceduralnie, jest oparta na ścieżce Beziera, którą zdefiniowałem wcześniej w edytorze. To byłoby jak edytor poziomów w przypadku twojej gry, w moim przypadku projektuje ona stoły do pinballu. Poniżej znajduje się przykład tego, jak to robię:
1.) Zbuduj / znajdź i zaimplementuj klasę ścieżki Beziera. Otrzymasz dane źródłowe do wyciągnięcia siatki. Jest jeden w C #, który można przenieść do c ++.
http://forum.unity3d.com/threads/32954-Waypoints-and-constant-variable-speed-problems?p=213942
2.) Po utworzeniu ścieżki Beziera próbkowane są punkty danych z tej ścieżki. Można to zrobić za pomocą metody Interp dla klasy podanej powyżej. Otrzymasz listę / tablicę punktów Vector3 wzdłuż ścieżki Beziera.
3.) Utwórz klasę pomocnika do konwersji danych ścieżki Vector3 Beziera z kroku 2. W tym przypadku mam prostą klasę o nazwie ExtrudedTrailSection, jak zdefiniowano poniżej:
4.) Iteruj przez przykładowe dane Vector3 i przekonwertuj na tablicę ExtrudedTrailSections dostarczającą przykładowe dane i macierz podstawową, która byłaby miejscem głównym wyciągniętej siatki.
Matrix4x4 worldToLocal = rootTransform.worldToLocalMatrix;
6.) Teraz masz tablicę Matrix4x4 [] i możesz wyciągnąć siatkę, ale najpierw potrzebujemy siatki referencyjnej, z której można wyciągnąć. Mam klasę użytkową, która utworzy okrągłą powierzchnię siatki, którą dostarczymy do metody wytłaczania siatki.
7.) Znajdź centrum tych danych:
8.) Teraz, gdy mamy dane krawędzi i środka dla promieniowej siatki powierzchni, możesz zbudować obiekt siatki na podstawie swoich danych. Końcowy wierzchołek siatki jest obliczonym przez nas punktem środkowym. Ostateczna siatka jest tylko powierzchnią dostarczaną do metody wytłaczania siatki, którą podałem jako przykład w proceduralnej klasie wytłaczania siatki pakietu Unity. Ponownie, to jest moja metoda i oczywiście musiałbyś wprowadzić te dane do OpenGL. Jeśli masz bibliotekę narzędziową 3D, której używasz lub możesz napisać własną klasę siatki, prawdopodobnie lepiej byłoby wygenerować ostateczną wyciągniętą siatkę, ponieważ dane te nie są tak naprawdę potrzebne OpenGL do renderowania. Ta siatka powierzchni jest po prostu używana jako odniesienie dla wyciągnięcia siatki.
9.) Znajdź zewnętrzne krawędzie okrągłej siatki zgodnie z potrzebami metody wytłaczania siatki. Ponownie ten kod jest dostarczany w pakiecie jedności.
10.) Wprowadź wszystkie te dane do metody wytłaczania siatki.
Ostateczne wyjście w moim przypadku wygląda tak ...
Powodzenia, twoja gra wygląda naprawdę fajnie! Daj mi znać, jeśli to wymyślisz?
Głaskanie pod brodę
źródło