Könnte jemand bitte erklären, wie es möglich wäre, Kugelscheitelpunkte, Indizes und Texturkoordinaten zu erstellen? Es gibt einen überraschenden Mangel an Dokumentation, und es ist etwas, das ich lernen möchte.
Ich habe das Offensichtliche ausprobiert, gegoogelt, auf gamedev.net nachgesehen usw. Allerdings deckt nichts die Generationen von sphärischen Punkten ab, indiziert sie und texturiert sie.
rendering
geometry
procedural-generation
judeclarke
quelle
quelle
Antworten:
Es gibt zwei allgemeine Ansätze:
Die äußerste linke Sphäre wird als UV-Sphäre und die äußerste rechte als Icosphäre bezeichnet.
GLUT verwendet in der Regel den UV-Ansatz: Sehen Sie sich die Funktion
glutSolidSphere()
im Freeglut-Quellcode an .Hier ist ein ausgezeichneter Artikel zum Erstellen einer Icosphere: http://blog.andreaskahler.com/2009/06/creating-icosphere-mesh-in-code.html
Das könnte Sie auch interessieren: http://kiwi.atmos.colostate.edu/BUGS/geodesic/text.html Es beschreibt einen Ansatz zum Organisieren der Gesichter in Zonen.
http://vterrain.org/Textures/spherical.html enthält eine hervorragende Beschreibung, wie Sie sie möglicherweise texturieren möchten.
quelle
Es gibt zwei Möglichkeiten:
Wandeln Sie Theta und Phi in sphärischen Koordinaten, erzeugen Sie Gesichter und Tris
Erstellen Sie ein Ikosaeder und unterteilen Sie die Flächen rekursiv, bis die gewünschte Tessellation erreicht ist.
Kugel mit sphärischen Koordinaten gehen
Für den ersten Weg benutzt man einfach ein doppeltes Nest, um Theta und Phi zu laufen. Während Sie Theta und Phi laufen, drehen Sie Dreiecke, um Ihre Kugel zu erzeugen.
Der Code dafür sieht ungefähr so aus:
Beachten Sie daher, dass es wichtig ist, die obere und die untere Kappe nur mit Tris und nicht mit Quads zu wickeln.
Ikosaedrische Kugel
Um ein Ikosaeder zu verwenden, erzeugen Sie einfach die Punkte des Ikosaeders und wickeln dann Dreiecke daraus auf. Die Eckpunkte eines Ikosaeders, das am Ursprung sitzt, sind:
Sie müssen dann nur ein Diagramm eines Ikosaeders und Windflächen von diesen Vert betrachten. Ich habe bereits Code, der das hier macht .
quelle
Wenn die Punkte müssen nicht lokal einheitlich sein, sollte aber global einheitlich sein, und haben keine festen Muster zu folgen, können Sie eine Variante des Dart-Wurf - Algorithmus verwenden zu verteilen n Punkte auf einer Kugel mit dem Radius r , im Durchschnitt dist Punkte auseinander. Diese Werte sind dann ungefähr:
Im einfachsten Fall können Sie dann Punkte gleichmäßig zufällig auswählen, indem Sie aus (0, 1) zwei gleichmäßig verteilte Variablen u und v auswählen und daraus die Polarkoordinaten nach den Formeln θ = 2 × π × u und ϕ = Bogen berechnen cos (2 × v - 1); Anschließend werden alle Punkte verworfen, die zu nahe an den bereits ausgewählten Punkten liegen. Für einen etwas komplexeren und wesentlich leistungsfähigeren Algorithmus siehe " Dart Throwing on Surfaces " von Cline, Jeschke, White, Razdan und Wonka.
Nachdem Sie Ihre ersten vier Punkte ausgewählt haben (vorausgesetzt, keine drei davon sind degeneriert , das heißt, sie liegen nicht auf demselben großen Kreis, aber das ist höchst unwahrscheinlich), können Sie vier Gesichter zwischen ihnen erstellen und jedes Mal ein neues hinzufügen Neuer Punkt, Sie können das Gesicht, zu dem es gehört, entsprechend in drei Untergesichter aufteilen.
Zu Texturierungszwecken können Sie die Punkte dann einer Würfelkarte zuordnen.
quelle