Indexberechnung bei einer "Schale"

Ich habe eine Art Schale als Mesh im 3D gemacht. Die Vertics sind schon gut, die berechne ich so:


for(float y = 0.0f; y < 2.0f; y+=0.1f){
			for(int i = 0; i < 360; i+= 5){
				coords.add((float) Math.cos(i)*r);
				coords.add(y);
				coords.add((float) Math.sin(i)*r);
			}
			r = (float) Math.pow(x, 1.0f/5.0f)*3;
			x+=0.01f;
		}

Nur will ich diese Schale nun als Schale anzeigen und die Indexe für Dreiecke berechnen, ich hab mir das so gedacht, aber das funktioniert verständlicherweise nicht:


for(int i = 0; i < 1440; i++){
			ind.add(i);
			ind.add(i+1);
			//72 weil eine "Ebene" 72 Punkte hat(360/5) um eben die Punkte in der Ebene eins drüber zu bekommen
			ind.add(i+72);
			
			ind.add(i+72);
			ind.add(i+1);
			ind.add(i+72+1);
		}

[ot]
Nicht die erhoffte Antwort, nur ein Hinweis: Bei allem, was über einen Würfel, eine Kugel oder einen Zylinder hinausgeht, würde ich dazu raten, das in einem 3D-Modellierungstool zu erstellen, als OBJ zu exportieren, und im Programm zu laden. Andernfalls kann/muss man sich überlegen, wie man sowas allgemeiner löst. Da kommt man um eine Klasse für Meshes kaum drumrum. Händisch irgendwelche Koordinaten und Indizes zusammenzufrickeln ist sehr Fehleranfällig[/ot]

Das einzige Spiel das ich kenne welches sich seine Meshes per Algorithmen zusammenrechnet ist .kkrieger, ein First Person Shooter das gerade mal 96kb misst!

Vorteil ist dass das Spiel weniger Speicherplatz verbraucht.
.kkrieger verwendet dabei Basiskörper wie Zylinder, Kugeln, Würfel, etc… und modelliert diese on-the-run um.

Wenn du in die Richtung gehen willst solltest du dir vielleicht mal das Prinzip dahinter anschauen.
Auch lesenswert ist das Prinzip hinter dem Spore-Editor der sehr ähnlich funktioniert. Auch dort verwendet man Basisgeometrien die gedehnt, gestreckt und mithilfe eines Skelettmodells umgeformt werden und zusammengesteckt um eine kompliziertere Gesammtgeometrie zu bilden.

Ansonsten stellt der großteil aller Multimediaanwendungen ihre 3D Daten mithilfe von Modellierungssoftware zur Verfügung wie Marco13 bereits sagte.

Nun, man kann da sehr weit gehen: https://de.wikipedia.org/wiki/Generative_Modelling_Language Aber … das wäre wohl auch OT…

Welches Programm zum Modellieren würdet ihr empfehlen? Ich habe schon so was mit Blender versucht, aber das war total kompliziert und ich weiß nicht, wie aus ich diesen .blend Dateien die Vertics und Indexe und Textur Koordinaten rausziehen kann.

Ähm, dein i in der ersten Schleife ist Grad, aber Math.sin und Math.cos brauchen Bogenmaß a.k.a. Radiant…

Blender ist in der Tat etwas kompliziert - am Anfang - ich nutze es um meine Modelle für 3D Drucker zu entwickeln

Da wird sicher auf der Seite von Blender eine entsprechende Beschreibung der Datei sein. Im Zweifel den entsprechenden Code betrachten und daraus schlau werden. Alternativ „File“ → „Export“ → „Wavefront (.obj)“

Lieber nicht. Da wird vieles drin sein, was man nicht braucht.

Besser.

Obj ist gut dokumentiert.
Dafür einen Loader zu finden im Internet oder eine Anleitung wie man einen selber schreibt ist nicht schwer.
Es bietet sich auch an eine eigene Dateistruktur zu basteln, man kann dann leider nicht von jedem Computer aus die Dateiendung importieren oder laden was nachteilig ist während obj bereits von eigentlich fast jedem Modellierprogramm geladen/gespeichert werden kann.

Aber ja, Blender ist die beste kostenlose Software.
Die offiziellen Tutorials sollte man mal durchgegangen sein.
Es gibt noch andere Software aber ich war bei keiner mit dem Ergebniss zu frieden, obwohl sie einfacher zu bedienen waren. Häufig waren die Texturen nicht korrekt ausgelegt, es gab Fragmente an den Ecken, probleme beim import und allgemein einfach schlechte Qualität.
Blender dagegen hat mit professioneller Leistung geglänzt, großem support und einer vielzahl an Funktionen.

[QUOTE=TMII]Obj ist gut dokumentiert.
Dafür einen Loader zu finden im Internet oder eine Anleitung wie man einen selber schreibt ist nicht schwer.[/QUOTE]

Eigenwerbung: javagl.de - Utilities :smiley: (Ja, ist schon alt, heute würde ich einiges anders machen, und ggf. ziehe ich das mal irgendwann in einer aufgeräumteren Version auf GitHub rüber, aber… ich hatte irgendwann einfach gedacht: Einen OBJ-Loader will ich nie wieder schreiben… Und deswegen… Tja. Ein paar Utility-Funktionen, die in Richtung GL gehen, gibt’s auch, z.B. float v[] = getVertexCoordsOf(obj), aber … nicht zuuu sehr drauf verlassen, dass das alles einen Umzug nach GitHub in genau dieser Form überstehen wird…)

Ok, ich habs jetzt soweit, dass ich beliebige .obj Dateien laden kann. Vor lauter Freude darüber habe ich mir aus dem Internet eine .3ds Datei von GLaDOS(nur zum rumspielen) geholt, und sie importiert und dann wieder als .obj Datei exportiert. Nur kann ich sie nicht laden. Es ist bei den .obj Dateien, der Objekte, die ich in Blender erstellt habe die Indexe von Vertex und Normal duch ein // getrennt werden(z.B. 5//1), aber bei dem Importierten sind sie nur mit / getrennt, deswegen kann ich sie nicht mit derselben Methode laden, wieso ist das denn so, das ist doch irgendwie komisch!

Also nach der Dokumentation von Obj können Einträge entweder mit „/“, „//“ oder mit garnichts getrennt werden.
Die ersten Beiden Möglichkeiten scheinen sich bis auf das äußerliche nicht logisch zu unterscheiden.

Verwende in meinen Projekten mein eigenes raw-bit format weil Obj halt ein über 25Jahre altes Format ist aber wie gesagt ist portability damit ausgeschlossen und das Format kann auch wieder verloren gehen.
Deshalb bin ich dafür sicherlich keine so gute Quelle.

Aber wie gesagt so steht es in der Doku zu dem Format.
Eines meiner alten Projekte mit obj verwendet nur „/“ :confused:

Aber kann ich nicht Blender einfach beim Exportieren mitteilen, dass es mit // getrennt werden soll. Ich will ja, dass alle Objekte gleich geladen werden können

[OT]mal so ne frage, werden bei blender eigentlich die normalen mit exportiert bei obj?
Bei cinema4d bekomme ich das irgendwie nicht hin… bzw es gibt da ein kostenpflichtiges plugin…
weiß da jemand zufällig was?[/OT]

[OT]
Ja, beim exportieren in Blender kann man einen Hacken bei “Write Normals” setzten.
[/OT]

Diese „Trennung“ ist keine Trennung oder Exportoption (zumindest nicht direkt). Hinter dem „f“ stehen die Indizes der Vertexinformationen für dieses Dreieck. „Vertexinformationen“ sind hier

  • Positionen
  • Texturen
  • Normalen

D.h. eine Zeile wie
f 1/10/43 4/3/19 …
bedeutet, dass der erste Vertex gebildet wird aus

  • Position 1
  • Texturkoordinate 10
  • Normale 43

    (entsprechend der „v“, „vt“ und „vn“-Listen, die vorher angegeben waren).

Wenn dort nur
f 1//43 4//19 …
steht, dann bedeutet das schlicht, dass es keine Texturkoordinaten gibt, sondern nur Positionen+Normalen

Das ganze ist ein bißchen frickelig. Abgesehen von der 1-basierten Indizierung in OBJ (d.h. der erste Vertex hat index 1, nicht index 0, wie in arrays) gibt es dort mehrere Index-Sets für die Vertexinformationen. Das ist bei OpenGL üblicherweise anders: Dort gibt es nur EINEN Satz von indizes. Deswegen gibt es in manchen Libs sowas wie ObjUtils (www.javagl.de Utilities API Documentation) :smiley:

Aha, das erklärt das. Ich habe jetzt mit Blender was erstellt, mit Textur(wenn ich auf rebder gehe, wird sie auch angezeigt), nur werden sie irgendwie nicht mitexportiert: zwischen den / ist keine Zahl und es gibt keine Koordinaten mit dem Präfix vt. Muss ich noch irgendwas tun, damit ich die Textur Koordinaten mit in die obj Datei kriege?

Mit Blender direkt kenne ich mich nicht aus, aber allgemein ist das Texture Mapping ein Prozess mit vieeeeelen (!) Freiheitsgraden - wenn man nicht eine einfache Lösung verwendet, wie etwa bei der Schale (sic) hier unten: http://www.blender.org/manual/render/blender_render/textures/mapping/uv.html

Mein Problem ist ja nicht, die Texturen in Blender draufzumappen, sondern dass die Texturkoordinaten nicht in die .obj Datei geschrieben werden.

schau mal ob du hier was findest…
Extensions:2.6/Py/Scripts/Import-Export/Wavefront OBJ - BlenderWiki