… sollten die Studierenden im X3D-Praktikum ein Phantasie-Fortbewegungsmittel konstruieren. Ein Team überlegte sich den Sphere Glider, eine Art Kugel, in deren Innern sich eine Plattform bewegt. Diese Plattform haben die Studis mit einem Wok verglichen. Aber wie baut man einen Wok in X3D? Mit den typischen Primitiven geht das eher nicht. Also muss ein Mesh her, z.B. mit dem IndexedFaceSet-Element. Nur wie bekommt man die Koordinaten der Gitterpunkte, ohne sich einen Knoten in die Hirnwindungen zu denken? Meine – zugegebenermaßen leichtfertige – Antwort war: „Natürlich mit Tabellenkalkulation a la Excel.“

Kugelkoordinaten ermitteln

Wer Kugelsegmente modellieren will, sollte sich etwas mit Trigonometrie auskennen. Sinus und Cosinus im Einheitskreis wurden in der Schule eigentlich hinlänglich behandelt und auch das Stichwort Polarkoordinaten sollte bei Abiturient_innen nicht zu Angstschweiß führen: Für einen Kreis mit dem Radius r ergeben sich die Koordinaten eines Kreispunktes bei gegebenem Winkel φ mit Hilfe der genannten Winkelfunktionen zu:

x = r * cos(φ), y = r * sin(φ)

Halt! Wir sind ja im 3D-Raum. Die y-Koordinate entspricht da der Vertikalen. Wir brauchen aber horizontale Schnitte durch eine Kugel. Die Kreispunkte müssen also mit den x– und z-Koordinaten beschrieben werden, in Abhängigkeit von φ, dem so genannten Azimutwinkel.

x = r * cos(φ), z = r * sin(φ)

Die y-Koordinate kennzeichnet die Stelle, wo wir die Kugel zerschneiden. Wir werden dazu einen weiteren Winkel θ benutzen. Dieser wird auch als Polarwinkel bezeichnet. Mit Hilfe dieses Winkels können wir dann den Radius rθ der kreisrunden Schnittfläche bestimmen, wobei r der Radius der Ausgangskugel ist:

rθ = r * cos(θ)

Zur Modellierung werden wir eine Anzahl N von Stützstellen verwenden, deren Koordinaten auf Basis entsprechender Winkelwerte für φ zu ermittelt sin. Der Vollkreis (Bogenmaß 2* π) muss also in N Teile zerlegt werden. Die einzelnen Winkel ergeben sich dann iterativ:

φi = i * 2π/N

Nun können wir die Koordinaten der Stützstellen für jede der einzelnen Schnittflächen bestimmen. In der Programmiererei würde man das mit zwei ineinander geschachtelten Schleifen realisieren. In Excel & Co. bastelt man sich statt dessen eine Tabelle mit den entsprechenden Indexwerten i für jede Schnittfläche θ.

xi, θ = rθ * cos(φ), yi, θ = r * sin(θ), zi, θ = rθ * sin(φ)

Koordinatenangaben für X3D-Quelltext vorbereiten

Dezimalzahlen verwenden ein Trennzeichen, um den ganzzahligen Anteil vom gebrochenen Anteil zu trennen. Die meisten Menschen bezeichnen dieses Trennzeichen als Dezimalpunkt und schreiben auch einen Punkt. Das gilt uneingeschränkt für praktisch alle Programmiersprachen und auch für X3D. MS Excel hingegen spricht von Dezimaltrennzeichen und verwendet ein Komma. Zur Vorbereitung der Koordinaten für den X3D-Quelltext müssen wir die in MS Excel ermittelten Zahlenwerte in Text umwandeln und die Kommas durch Punkte ersetzen. Das erweist sich jedoch schwieriger als gedacht: man bestimmt zunächst den ganzzahligen Anteil, hängt dann händisch ein Komma dran und ergänzt das schließlich durch den Nachkomma-Anteil. Dabei dürfen führende Nullen im Nachkomma-Anteil nicht vergessen werden, denn 0.123 unterscheidet sich deutlich von 0.0123. Die Ergebnisse müssen dann lediglich verkettet werden, wobei zwischen die einzelnen Koordinatenwerte ein Leerzeichen und am Ende jedes Koordinaten-Tripels ein Komma einzufügen ist.

Die Techies werden sich natürlich nicht soviel Aufwand machen und gleich die einzelnen Koordinatenwerte verketten. Sie wissen, dass man in jedem besseren Editor ein globales Suchen-und-Ersetzen von Kommas durch Punkte im Handumdrehen hinbekommt. Das abschließende Anhängen eines Kommas ans Ende jeder Zeile stellt dort auch kein Problem dar.

Koordinaten-Index für das FaceSet generieren

Die Bedingung für die Faces eines IndexedFaceSets ist, dass es sich dabei um planare, d.h. nicht gekrümmte, und sich nicht selbst schneidende Polygone handelt. Solche Polygone erhält man, in dem man korrespondierende Punkte auf unterschiedlichen Schnittflächen als Eckpunkt eines Polygons verwendet.

Besonders einfach ist das für den untersten Teil des Woks. Hier bilden jeweils zwei benachbarte Punkte der ersten Schnittfläche zusammen mit dem Basispunkt ein Dreieck.

Die höher gelegenen Teile der Wok-Wand ergeben sich als Vierecke aus den miteinander korrespondierenden Punkten zweier Schnittflächen. Beispiel: Punkt 1 auf Ebene 1, Punkt 1 auf Ebene 2, Punkt 2 auf Ebene 2, Punkt 2 auf Ebene 1.

Natürlich verwendet das IndexFaceSet-Element keine mehrdimensionalen Indizes. Dementsprechend sind die einzelnen Koordinatenwerte fortlaufend durchzunummerieren. Der Koordinatenindex lässt sich mit ein wenig Überlegen dann leicht als Textverkettung realisieren (Leerzeichen zwischen den einzelnen Indizes und „-1“ am Ende eines Faces nicht vergessen!).

Copy &Paste … & … Smile

Die verketteten Inhalte können dann per Copy&Paste direkt in den vorbereiteten X3D-Quellcode eingefügt werden. Speichern und Anzeigen sollten dann zum gewünschten Ergebnis führen:

Dateien zum Selberprobieren und weiterführende Links



Leave a Reply

Zur Werkzeugleiste springen