Ich versuche gerade, eine einfache kleine Wireframe-3D-Engine
zusammenzubasteln.
Das will mir aber nicht so recht gelingen.
Zum Schluss soll es moeglich sein, von einem beliebigen Punkt in eine
beliebige Richtung blicken zu koennen, am Besten noch mit Tiefendingsda
(sorry, mir faellt das Wort gerade nicht ein), also dass weiter entfernte
Objekte kleiner gezeichnet werden.
Ich habe schon verschiedene Sachen ausprobiert...
Verschieben und drehen des gesamten Koordinatensystems,
Setzen eines Blickpunktes und Berechnung aller anderen Punkte relativ dazu
usw...
Aber entscheidende Probleme habe ich nicht loesen koennen :
In der Standard-Ansicht wird umgerechnet mit : x+cos(45)*y,z+sin(45)*y
Dies habe ich einfach mit allen dreien gemacht, also
w(x)=0°;w(y)=45°;w(z)=90°.
Hierbei funktioniert natürlich das rotieren nicht, da die Ebenen in
wirklichkeit immer im Winkel von 90° zueinander stehen.
Ich habe auch schon daran gedacht, den Monitor als Ebene zu denken und
alle Punkte relativ zu dieser zu berechnen, aber ich glaube, das wird auch
nicht so unbedingt funktionieren.
Ich habe schon mehrere Quellcodes gefunden, aber "volloptimiert"
(Spaghetticode) und ohne Erlaeuterung.
Kann mich vielleicht jemand in die Theorie "einweisen" ?
THX
Benjamin Lukner
B...@gmx.de
Bennie.home.pages.de
> Ich versuche gerade, eine einfache kleine Wireframe-3D-Engine
> zusammenzubasteln.
>
> Das will mir aber nicht so recht gelingen.
> Zum Schluss soll es moeglich sein, von einem beliebigen Punkt in eine
> beliebige Richtung blicken zu koennen, am Besten noch mit Tiefendingsda
> (sorry, mir faellt das Wort gerade nicht ein), also dass weiter entfernte
> Objekte kleiner gezeichnet werden.
>
> Ich habe schon verschiedene Sachen ausprobiert...
>
> Verschieben und drehen des gesamten Koordinatensystems,
> Setzen eines Blickpunktes und Berechnung aller anderen Punkte relativ dazu
> usw...
>
> Aber entscheidende Probleme habe ich nicht loesen koennen :
>
> In der Standard-Ansicht wird umgerechnet mit : x+cos(45)*y,z+sin(45)*y
[...]
> Kann mich vielleicht jemand in die Theorie "einweisen" ?
Die ganze Theorie waere wohl fuer den Anfang etwas umfangreich -
insbesondere dann, wenn Du nicht im Schlaf mit Vektoren und Matrizen
umgehen kannst und Rotationen bisher nur nach dem Muster
Erst um die x-Achse, dann um die y-Achse...
ausgefuehrt hast.
Der Grundansatz ist der: Fuer jedes Objekt Deiner Welt hast Du ein
eigenes Koordinatensystem. Sowohl abzubildende Objekte in Deiner Welt
als auch das "Betrachterobjekt".
Die Aufgabe besteht jetzt darin, die Welt aus Sicht des
Betrachterobjekts, also in dessen lokalem Koordinatensystem
auszudruecken. Dazu muessen die Weltpunkt-Koordinaten in dieses
Koordinatensystem transformiert werden.
Ueblicherweise schleppt man fuer jedes Objekt so ein eigenes
Koordinatensystem z.B. in Form einer 3x3-Matrix (oder einer
Quaternion) + eines Vektors (Ort des Nullpunkts des lokalen Systems in
globalen (Welt-) Koordinaten) herum.
Auch wenn Dir diese Betrachtungsweise zunaechst fremd sein sollte,
muesstest Du Dich wohl oder uebel mit ihr anfreunden, wenn Du etwas
anstaendiges auf die Beine stellen willst.
Fuer den Anfang mag folgendes Rezept reichen:
Ich gehe davon aus, dass Deine Welt in einer Art
"Bildschirmkoordinatensystem" beschrieben ist. x-Achse->rechts,
y-Achse->unten, z-Achse->hinten.
Um jetzt eine Betrachterposition zu bestimmen, genuegt es im
einfachsten Falle, den Betrachter mittels zweier Operationen zu
plazieren:
1) Drehung um die z-Achse um den Winkel wz
gefolgt von
2) Drehung um die (bereits gedrehte) x-Achse des Betrachters
um den Winkel wx.
gefolgt von
3) Verschiebung des Nullpunkts um einen Vektor T
Bei einer solchen Positionierung erscheinen Senkrechten der Welt als
senkrecht (wenn wir die Y-Achse als Senkrecht definieren), was fuer
den Anfang genuegen mag.
Mathematisch wird diese Operation ausgefuehrt als
1') Drehung um die x-Achse der Welt um wx
gefolgt von
2') Drehung um die z-Achse der Welt um wz
gefolgt von
3') Verschiebung des Nullpunktes um T
(also in umgekehrter Reihenfolge wie oben. Immer wenn Rotationen
bezueglich eines bereits rotierten Systems gemeint sind, rotiert man,
Mathematik sei dank, einfach in umgekehrter Reihenfolge um die
urspruenglichen Achsen).
Um jetzt die Welt in diesem Betrachter-Koordinatensystem zu sehen,
muessen wir auf die Welt-Koordinaten der Punkte die inverse
Transformation anwenden. Diese lautet
1'') Verschiebung des Nullpunktes um -T
2'') Drehung um die z-Achse der Welt um -wz
3'') Drehung um die x-Achse der Welt um -wx
(Bei der Umkehrung muessen sowohl die Ausfuehrungsreihenfolge
umgekehrt als auch die einzelnen Bestandteile der Gesamttransformation
fuer sich invertiert werden).
Als Formeln: x,y,z sei ein Punkt in Welt-Koordinaten
1) x' = x-tx , y' = y-ty , z' = z-tz
2) x'' = cos(wz)*x' + sin(wz)*y'
y'' = -sin(wz)*x' + cos(wz)*y'
z'' = z'
2) xl = x''
yl = cos(wx)*y'' + sin(wx)*z''
zl = -sin(wx)*y'' + cos(wx)*z''
(xl,yl,zl) sind jetzt die Koordinaten des urspruenglichen Punktes
(x,y,z) im Koordinatensystem des Betrachters. Wenn Du jetzt einfach zl
ignorierst, hast Du eine (flache) Parallelprojektion.
Der naechste Schritt waere dann eine Zentralprojektion (das, was Du
oben beschrieben hast), also das was das Auge oder eine Kamera "sehen"
wuerde.
Dazu sind noch einige Festlegungen noetig. Und zwar der Ort der
Blickpunktes und die Blickrichtung. Wenn wir uns die xy-Ebene des
Betrachtersystems wie bisher als zukunftige Bildschirmebene vorstellen
und annehmen, dass der Betrachter senkrecht auf diese Ebene blickt und
sich _vor_ dieser Ebene befindet, waere eine typische Festlegung fuer
den Blickpunkt:
x0 = x-Koordinate der Bildschirmmitte
y0 = y-Koordinate der Bildschirmmitte
z0 = ein negativer Wert, zum Probieren etwa -2*x0
Die Abbildungsformeln fuer eine Zentralperspektive mit diesen Vorgaben
waeren dann
(x1,y1,z1) Auf das Betrachtersystem transformierte Punktkoordinaten.
(x0,y0,z0) Blickpunkt in lokalen Koordinaten des Betrachters
x1-x0
x_s = x0 - z0* -----
z1-z0
y1-y0
y_s = y0 - z0* -----
z1-z0
Wenn Du fuer -z0 (das ja positiv ist) einfach d schreibst, erhaeltst
Du die Formeln
x1-x0 x0*z1+d*x1
x_s = x0 + d* ----- = ----------
z1+d z1+d
y1-y0 y0*z1+d*y1
y_s = y0 + d* ----- = ----------
z1+d z1+d
Vielleicht reicht's fuer den Anfang.
FF
Horst
Mit Vektoren kann ich eigentlich schon sehr gut umgehen, nur mit Matrizen
nicht. 3D lernt man doch nicht in der Schule !!! Wie käme der Lehrer denn
dazu ??? Interessiert doch eh keinen !!! -grummel-
> ... Dazu muessen die Weltpunkt-Koordinaten in dieses
> Koordinatensystem transformiert werden.
Das habe ich versucht mit obigem Satz auszudrücken.
Nur WIE habe ich nicht verstanden... ;)
> Ueblicherweise schleppt man fuer jedes Objekt so ein eigenes
> Koordinatensystem z.B. in Form einer 3x3-Matrix (oder einer
Habe ich schon gemacht (mit wenig Erfolg)
> Auch wenn Dir diese Betrachtungsweise zunaechst fremd sein sollte,
isse nicht
> muesstest Du Dich wohl oder uebel mit ihr anfreunden, wenn Du etwas
kein Problem !
> Fuer den Anfang mag folgendes Rezept reichen:
[...]
*VIELEN* Dank -freu- ;)
Wird mir sicher weiterhelfen ! :)
/ \
/ /
/ \/ /\ , ° /\
/ \ / \ /---, / / \
/_________\ /________\_ / / / /_______\_ @Quarks.Leine.de
/