Pyramidenstumpf zu Würfel transformieren
-
Ich hab einen Pyramidenstumpf, der zu einen Würfeln mit min(-1,-1,-1) und max(1, 1, 1) umgewandelt werden soll:
http://turing.fh-landshut.de/~jamann/frustum.PNG
Weiter kenne ich die Ergebnismatrix, die diese Transformation durchführt:
\left( \begin{array}{*{4}{c}} \frac{2n}{r-l}& 0 & -\frac{r+l}{r-l} & 0 \\ 0 & \frac{2n}{t-b} & -\frac{t+b}{t-b} & 0 \\ 0 & 0 & \frac{f+n}{f-n} & -\frac{2fn}{f-n} \\ 0 & 0 & 1 & 0 \\ \end{array} \right)Mir fehlt bloß die Herleitung...
-
Breite von Frustum auf 1 bringen:
-
Höhe auf 1 bringen:
-
Jetzt wollte ich noch die Länge des Frustums auf 1 bringen und da hänge ich
soll ich erst das Zentrum des Pyramidenstumpfs in den Ursprung verschieben und dann Skalieren... mmh... oder soll ich die Pyramide erst in eine kanonisches Sichtvolumen umwandlen... mmmh...?
-
Alles was du brauchst ist hier erklärt:
http://www.codeguru.com/cpp/misc/misc/math/article.php/c10123__3/
(In Worten kurz zusammengefasst: Du projizierst einen Punkt A=(ax,ay,az) im View Volume auf einen Punkt B=(bx,by,n) auf der near-Plane und bildest dann die Breite [l,r] und Höhe [b,t] der near-Plane auf das Intervall [-1,1]² ab. Anschließend transformierst du die z-Koordinate von [n, f] auf [0, 1].)Nebenbei: Dein Einheitswürfel ([-1,1]³) hat die Breite, Höhe, Länge 2 und nicht 1.
-
Dein Einheitswürfel ([-1,1]³) hat die Breite, Höhe, Länge 2 und nicht 1.
yup ist klar
-
Because you know that the transformation of z into z' does not depend on x or y in any way, you know that you want a formula of the form z'z = pz + q, where p and q are constants.
wie kommt er drauf, dass z'z = pz+q ist?
-
so wie ich das sehe kann ich nur sagen, das eine Skalierung und eine Verschiebung stattfinden muss:
z'=s*z+t(1-s)+t
z'=s*z+t-s*t+toh... ich sehe jetzt warum
- hat er aber schlecht erklärt
-
war etwas voreilig - habs doch noch nicht kapiert... wie kommt er auf z'z = pz+q?
-
Hey, entschuldigung dass ich sowas frage, aber kannst du mir mal erklären, was
r, l, d, t, b, f, n sind?Interessiert mich einfach.
-
Guck Dir das Bild an.
-
Sgt. Nukem schrieb:
Guck Dir das Bild an.
Ah okay, stimmt, hab das Bild nicht gesehen. Sind also Koordinaten
-
Hey, entschuldigung dass ich sowas frage, aber kannst du mir mal erklären, was ...
left, right, bottom, top, far, near
mit diesen 6 Größen ist das Sichtvolumen (Pyramidenstumpf = Frustum) eindeutig festgelegt
-
Wenn du einen Punkt aus dem Intervall [n,f] auf [-1,1] (oder [0,1] wie bei D3D) abbilden willst, erfordert das eine Skalierung und Translation. Das z skaliert das Intervall als ein Intervall der "Länge" 1 und das q verschiebt es so, dass der Mittelpunkt im Koordinatenursprung (des View Space) liegt.
Wenn n=0, dann bräuchtest du nur eine Skalierung und wenn f-n=2, dann nur eine Translation.
-
aber warum steht auf der linken seite z * z' ? und nicht nur z'=...
-
Würde ich [n,f] auf [0,1] transformieren wollen würde ich das wie folgt machen:
Strecke [n,f] am Punkt n + (f-n)/2 auf 1 Skalieren. Anschließend alles um 0,5 nach rechts verschieben:
z' = [z - (n + \frac{f-n}{2})]* \frac{1}{f-n}+ \frac{1}{2}
wie komm ich jetzt drauf, dass z'z= p z + q ist...?
-
Probe:
z' = [n - (n + \frac{f-n}{2})] * \frac{1}{f-n} + \frac{1}{2}
-
z' = [f-(n+\frac{f-n}{2})]*\frac{1}{f-n}+\frac{1}{2}
z'=[f-n-\frac{f-n}{2}]*\frac{1}{f-n}+\frac{1}{2}
-
soll ich dich alleinunterhalter vielleicht ins matheforum verschieben? (auf wunsch?)
-
soll ich dich alleinunterhalter vielleicht ins matheforum verschieben? (auf wunsch?)
ja - verschieb mich
-
Dieser Thread wurde von Moderator/in rapso aus dem Forum Spiele-/Grafikprogrammierung in das Forum Mathematik verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.