CPU
Lieutenant
- Registriert
- Jan. 2006
- Beiträge
- 704
Hallo,
aus Interesse und Zeitvertreib habe ich mir einen kleinen "3D-Renderer" gebaut. Man kann damit Punkte in einem Raum zeichnen lassen und das Modell mit der Maus rotieren. Sehr schön. Allerdings habe ich mit den Flächen (Faces) ein Problem. Ich schildere mal mein Vorgehen:
Für Vielecke mit drei Ecken ist das alles kein Problem, man verbindet die Punkte einfach und füllt den Zwischenraum:
Wenn man jedoch vier Punkte (oder mehr) hat und die Reihenfolge nicht bekannt ist und man einfach blauäugig die Punkte verbindet (man kommentiere dazu oben noch die Zeile "a.lineTo(q[3].x, q[3].y);" aus), dann kann z.B. so etwas heraus kommen:
Also musste ich mir etwas einfallen lassen, wie ich die Punkte erst ordne und dann nacheinander zeichne. Alles weitere habe ich dann im 2D-Raum überlegt und gelöst, da ja die 3D-Punkte in dieser Phase, in der das Problem auftritt, bereits auf 2D-Punkte abgebildet sind.
Ich habe mir überlegt den Mittelpunkt der vier Punkte zu berechnen (X- und Y-Koordinaten aufsummieren und durch Anzahl Punkte teilen) und dann diesen zu klonen und die Y-Koordinate null zu setzen (so dass dieser Punkt dann auf der gleichen X-Korrdinate sitzt und eine vertikale Linie bildet). Und dann berechne ich einfach nur den Winkel zwischen diesem "Vektor" (Mittelpunkt -> veränderter Mittelpunkt) und dem Vektor auf den aktuell betrachteten Punkt (Mittelpunkt -> betrachteter Punkt). Somit bekomme ich für jeden Punkt einen Winkel. Und wenn ich die jetzt aufsteigend sortiere "gehe" ich einmal im Urzeigersinn die Punkte ab und habe meine Sortierung:
Schön. Ich dachte ich wäre fertig, aber dann kam folgendes: ich habe mal ein komplexeres 3D-Modell aus Blender reingeladen und das hat erstaunlicherweise auf Anhieb funktionert (also musste da etwas nicht stimmen :-)).
Sehet selber das Problem in den unteren zwei Bildern:
Man kann deutlich erkennen, dass dort mit (wirklich) leicht verändertem Blickwinkel sich die Reihenfolge der Punkte ändert und somit die Form der Fläche sich verändert und das Bild dann "flackert", wenn man es denn bewegt.
So und hier bin ich nun und frage mich, was ich tun kann und ob man überhaupt etwas machen kann? Habt Ihr irgendwelche Einfälle?
Viele Grüße,
CPU
P.S.: Bitte nicht verwirren lassen - das 3D-Modell ist noch etwas bunt ;-)
aus Interesse und Zeitvertreib habe ich mir einen kleinen "3D-Renderer" gebaut. Man kann damit Punkte in einem Raum zeichnen lassen und das Modell mit der Maus rotieren. Sehr schön. Allerdings habe ich mit den Flächen (Faces) ein Problem. Ich schildere mal mein Vorgehen:
Für Vielecke mit drei Ecken ist das alles kein Problem, man verbindet die Punkte einfach und füllt den Zwischenraum:
Code:
// q enthalte die Punkte
a.beginPath();
a.moveTo(q[0].x, q[0].y);
a.lineTo(q[1].x, q[1].y);
a.lineTo(q[2].x, q[2].y);
/* a.lineTo(q[3].x, q[3].y); */
a.closePath();
a.fill();
Wenn man jedoch vier Punkte (oder mehr) hat und die Reihenfolge nicht bekannt ist und man einfach blauäugig die Punkte verbindet (man kommentiere dazu oben noch die Zeile "a.lineTo(q[3].x, q[3].y);" aus), dann kann z.B. so etwas heraus kommen:
Also musste ich mir etwas einfallen lassen, wie ich die Punkte erst ordne und dann nacheinander zeichne. Alles weitere habe ich dann im 2D-Raum überlegt und gelöst, da ja die 3D-Punkte in dieser Phase, in der das Problem auftritt, bereits auf 2D-Punkte abgebildet sind.
Ich habe mir überlegt den Mittelpunkt der vier Punkte zu berechnen (X- und Y-Koordinaten aufsummieren und durch Anzahl Punkte teilen) und dann diesen zu klonen und die Y-Koordinate null zu setzen (so dass dieser Punkt dann auf der gleichen X-Korrdinate sitzt und eine vertikale Linie bildet). Und dann berechne ich einfach nur den Winkel zwischen diesem "Vektor" (Mittelpunkt -> veränderter Mittelpunkt) und dem Vektor auf den aktuell betrachteten Punkt (Mittelpunkt -> betrachteter Punkt). Somit bekomme ich für jeden Punkt einen Winkel. Und wenn ich die jetzt aufsteigend sortiere "gehe" ich einmal im Urzeigersinn die Punkte ab und habe meine Sortierung:
Schön. Ich dachte ich wäre fertig, aber dann kam folgendes: ich habe mal ein komplexeres 3D-Modell aus Blender reingeladen und das hat erstaunlicherweise auf Anhieb funktionert (also musste da etwas nicht stimmen :-)).
Sehet selber das Problem in den unteren zwei Bildern:
Man kann deutlich erkennen, dass dort mit (wirklich) leicht verändertem Blickwinkel sich die Reihenfolge der Punkte ändert und somit die Form der Fläche sich verändert und das Bild dann "flackert", wenn man es denn bewegt.
So und hier bin ich nun und frage mich, was ich tun kann und ob man überhaupt etwas machen kann? Habt Ihr irgendwelche Einfälle?
Viele Grüße,
CPU
P.S.: Bitte nicht verwirren lassen - das 3D-Modell ist noch etwas bunt ;-)