Results 1 to 8 of 8

Thread: 3D Verzerrung

  1. #1

    3D Verzerrung

    Hallöchen!
    Ich brauch Hilfe.
    Und zwar bei Folgendem: Ich habe meine koordinaten im Raum. Im Moment zeige ich sie nur mit der X- und Y-Koordinate an. Nun will ich aber die Z-Koordinate mit einbeziehen. Dabei werden die X- und Y-Werte so verändert und verschoben, bis es einen 3D-Effekt gibt. Also so eine Art Fluchtpunkt. Nunja, aber lustigerweise kenn ich da keinen Algorhithmus oder so für.
    Deswegen brauch ich irgendwie Informationen. Bitte!

    Hoffe, jemand kann mir irgendwei helfen. Auch nur Stichworte oder so könnten mir helfen.

  2. #2
    Grundsätzlich könnte man das mit Strahlensätzen machen (habe ich mal gemacht, du must einfach von einem Augenpunkt vor dem Bildschirm ausgehen), das ist aber nicht ganz praktikabel, denn es gibt ja noch die Matrizen.

    http://de.wikipedia.org/wiki/Matrix_(Mathematik)
    http://de.wikipedia.org/wiki/Projektionsmatrix

    Es geht darum einen Vektor(x, y, z) (eigentlich wie ein Punkt) mit einer Matrix zu multiplizieren, dabei kannst du jeden 3D Punkt in eine 2D Ebene projezieren.

    Einfach gesagt:
    P' = P * Matrize

    Ausführlich:

    Wie du siehst, wird bei der Multiplikation eines Vektors mit einer Matrix einfach der Vektor um 90° gedreht und mehrfach jeweils in den verschiedenen Zeilen multipliziert.

    Um das ganze richtig schnell zu machen (falls du wirklich viele Punke hast) solltest du etwas wie OpenGL oder DirectX verwenden.

    Last edited by Drakes; 18.01.2009 at 22:05.

  3. #3
    Ah, danke! Damit kann ich schonmal etwas mehr anfangen.
    Dennoch hab ich noch ein ppar Fragen....
    Anschreinend kommt bei der Multiplikation eines Vektors mit einer Matrix wieder eine Matrix bei raus. Wie rechne ich das jetzt wieder in einen Vektor um?
    Quote Quote
    Die Position einer Kamera bezüglich eines Weltkoordinatensystems sowie die Aufnahmerichtung werden als äußere Orientierung bezeichnet. Das Projektionszentrum ist dabei C (ein 3-Vektor)) und die 3×3-Rotationsmatrix R. Des Weiteren wird die innere Orientierung K der Kamera benötigt. Sie setzt sich aus folgenden Elementen zusammen:
    1. Der Kammerkonstante c (Abstand zwischen Bildebene und Linse der Kamera).
    2. Der Anzahl der Pixel pro Millimeter in Richtung der x-Achse (kx) und y-Achse (ky).
    3. Der Position des Bildhauptpunktes h0=(x0,y0) (Durchstosspunkt der optischen Achse durch die Bildebene).
    4. Dem Scherungswinkel Θ zwischen den Bildachsen.

    Was ist hir mit dem Projektionszentrum C gemeint, und wie soll die Rotationsmatrix R aussehen? Ich denke, K hab ich soweit verstanden, das ist ja ausführlich erklärt. Wenn ichs eingebaut hab, werde ich halt mit den Werten etwas rumprobieren müssen.
    So wie ich das verstanden habe, entfernt man sich dann auch von der Maßeinheit der Pixel, oder? Also 2|0 ist nicht mehr der zweite Pixel der Ersten Reihe und so.

    Danke soweit nochmal!

  4. #4
    Quote Originally Posted by Lloyd64 View Post
    Ah, danke! Damit kann ich schonmal etwas mehr anfangen.
    Dennoch hab ich noch ein ppar Fragen....
    Anschreinend kommt bei der Multiplikation eines Vektors mit einer Matrix wieder eine Matrix bei raus. Wie rechne ich das jetzt wieder in einen Vektor um?
    Nein, du bekommst einen Vektor, wie man in meiner Rechnung sieht, in der Mitte ist die Schreibweise, rechts wie man es nun genau rechnet, z.B. ist x' = x*a +y*b + z*c . (Wahrscheinlich hast du gesehen, dass ich die + vergessen hatte ^^")
    Quote Originally Posted by Lloyd64 View Post
    Was ist hir mit dem Projektionszentrum C gemeint, und wie soll die Rotationsmatrix R aussehen?
    Ich denke mit der Rotationsmatrix ist mehr gemeint, um die Richtung in die die Kamera schaut zu ändern. Wirkungen von mehreren Matrizen, also die Änderungen die sie auf einzelne Punkte haben, kann man eben zu einer Matrize zusammenfassen, indem man die Matrizen miteinander (in der richtigen Reihenfolge) multipliziert.
    Quote Originally Posted by Lloyd64 View Post
    So wie ich das verstanden habe, entfernt man sich dann auch von der Maßeinheit der Pixel, oder? Also 2|0 ist nicht mehr der zweite Pixel der Ersten Reihe und so.
    Eigentlich eben doch, den Punkt denn man schlussendlich bekommt, soll dann wieder in Pixelkoordinaten sein, aber die 3D Koordinaten haben eigentlich nicht mehr viel mit den Pixelkoordinaten zu tun, das stimmt.

    Mit C ist eben eine Konstante gemeint.

    Hier, vielleicht hilft dir das noch, eine Beschreibung seitens Microsoft:
    http://msdn.microsoft.com/en-us/libr...02(VS.85).aspx

    Übrigens kommt es noch darauf an ob man ein linkshändiges oder ein rechtshändiges Koordinatensystem will.

    Last edited by Drakes; 18.01.2009 at 22:16.

  5. #5
    Hm, ich hab mir das ganze mit Projektionen etc. nochmal angesehn und habe festgestellt, dass ichs so machen will:
    ICh will einen Kamerapunkt festlegen, einen Vektor zu dem zu zeichnenden Punkt berechnen und dazwischen eine Ebene hinstellen und den Schnittpunkt berechnen.

    Nun hab ich mir das in etwa so gedacht:

    Ich habe einen Vektor für die Kamera C.
    Einen normalisierten Vektor für die Blickrichtung N. N und C werden den Stützvektor der Eben bilden.
    Dieser Vektor N soll die Normal der Ebene sein, sie soll senkrecht darauf stehen.
    Jetzt habe ich noch einen normalisierten Vektor U, der Senkrecht auf N steht und am Ende auf dem Bildschirm nach oben zeigen soll. Er erfüllt damit zwei Aufgaben:
    Die Rotation des ganen Systems und der erste Vektor zur Bildung der Ebene.
    Der Vektor V wird durch das Kreuzprodukt zwischen N und U gebildet und ist damit sowohl auf N als auch auf U senkrecht.

    Jetzt bilde ich damit meine Ebenenfunktion:

    X = ( C - N ) + r * U + s * ( U x N )

    Jetzt habe ich noch einen Vektor P und dieser subtrahiert mit C ergibt einen Vektor, den ich mit meiner Gleichung gleichsetzen muss.

    ( P - C ) = ( C - N ) + r * U + s * ( U x N )

    Ist das soweit richtig?

    Ich wll nicht, dass sich alles als falsch herausstellt, wenn ich das ganze programmiert habe.

  6. #6
    Wenn ich dich richtig verstehe, weißt du folgende Daten:
    P (Punkt, OV), C (Kamera, OV), N (Ebenenvektor, NV) und t (Ebenenposition, Skalar), U (Nachobenvektor, NV)

    Dann gilt q * (P - C) = C + t * N + r * U + s * (N x U)
    Nun hast du drei Unbekannte und kannst drei Gleichungen, eine pro Achse, aufstellen. Ein möglicher Ansatz wäre der Gaußsche Algorithmus (Eliminationsverfahren), um q, r und s zu bestimmen. Der Schnittpunkt liegt bei q * (P - C).

  7. #7
    Genau, so meinte ich das. Auch wenn ich nicht weiß, was du mit OV und NV meinst.

    Allerdings hab ich jetzt ein Problem. Wie ich Gleichungen mit Vektoren löse.
    Zum Beispiel hab ich keine Ahnung, was die Umkehrfunktion vom Kreuzprodukt oder Punktproduk ist oO
    Außerdem krieg ich, wenn ich das mal ganz normal wie mit Variablen umstelle, eine wirklich riesige Formel, da verlier ich echt den Überblick.

    Achja, das mit dem t ist mir erst garnicht aufgefallen, aber ist dann später echt praktisch, um die Brennweite festzulegen!

  8. #8
    OV - Ortsvektor (wobei die Bezeichnung wirklich relativ ist)
    NV - Normalenvektor bzw normierter Vektor (|V| = 1)

    q * (P - C)a = Ca + t * Na + r * Ua + s * (N x U)a mit a als Achsenindex

    Durch jeweils drei bekannte Achsenanteile kannst du drei Gleichungen mit drei Unbekannten aufstellen, ein lineares Gleichungssystem halt. Gelöst wird es in diesem Fall durch den vorhin schon erwähnten Gaußschen Algorithmus (Den du dir ruhig mal anschauen kannst).

    Zuerst einige Substitutionen:
    A = U x N
    B = P - C

    Dn = N3 * Bn / B3 - Nn
    En = Un - U3 * Bn / B3
    Fn = An - A3 * Bn / B3

    G = D1 - D2 * F1 / F2
    H = E1 - E2 * F1 / F2
    I = N3 + D3 * A3 / F2
    J = U3 - E2 * A3 / F2

    Hier die gesuchten Größen:
    r = t * G / H
    s = t * (D2 - G * E2 / H) / F2
    q = t * (I + G * J / H) / B3

    Übrigens, N gibt die Richtung der Ebene an, t hingegen die Position. Bei dieser in der Tat relativ langen Rechnung kann es sein, dass ich mich vertippt habe, dann einfach meckern . Dann geb ich mich nochmal dran, sollte ich die Zeit finden.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •