Matrix für die Sicht aus Richtung eines Vektors



  • Hi,
    Tja, wie der Titel schon sagt, ich bring es nicht zusammen, eine Matrix zu erstellen, die alle Objekte so transformiert, das ich dann aus der Richtung eines Beliebigen Vektors auf die Objekte schaue.
    Meine Mathematischen Kenntnisse auf dem Gebiet sind leider dafür unzureichend. Ich habs mit dot product probiert, um die Rotation zu bekommen, scheint aber nicht ganz korrekt zu sein. Ich krieg auch nicht heraus, wie die Translation aussehen soll. Ich hab auch noch keine View oder sonstige Matrix.
    So hab ichs bis jetzt probiert:
    Da der Betrachter aus dem Urprung heraus guckt, normalisiere ich de Vektor. Soviel ich weiß stellen dan die Vektorkomponenten dann den Winkel zwischen dem Vektor und den Urprungsachsen dar.
    Zuerst mache ich eine translation um -Vektorkomponenten, also -x, -y, -z.
    Dann rotiere ich, indem ich den normalisierten Vektor als xyz-Rotation bentutze. Dann wieder eine translation zurück.
    Scheint aber nicht korrekt zu sein. Wie könnte man das machen?

    btw, ich habe auch noch keine referenz dazu gefunden. Kennt ihr einen Link dazu?



  • weiß ja nicht ob dir das was hilft, aber in DirectX gbs dafür ne funktion, D3DXMatrixLookAtLH oder D3DXMatrixLookAtRH. in der SDK doku steht dazu folgendes drin:

    zaxis = normal(At - Eye)
    xaxis = normal(cross(Up, zaxis))
    yaxis = cross(zaxis, xaxis)

    xaxis.x yaxis.x zaxis.x 0
    xaxis.y yaxis.y zaxis.y 0
    xaxis.z yaxis.z zaxis.z 0
    -dot(xaxis, eye) -dot(yaxis, eye) -dot(zaxis, eye) 1
    (bezieht sich auf die Varianzte für Left Handed Koordinaten Systeme bzw. D3DXMatrixLookAtLH)

    wobei Eye die Position des viewers ist (in deinem fall (0,0,0), der ursprung) und At der Punkt, auf den der Viewer schaut, dafür kannst du deinen normalisierten vektor einsetzen. Up kann getrost (0,1,0) sein.
    hoffe, ich hab jetzt nix schwachsinniges hier gepostet, und dass ich dir helfen konnte 🙂



  • Danke für die schnelle Antwort.
    Ich benutze kein DX, deshalb muss ich das selber machen.

    xaxis.x yaxis.x zaxis.x 0
    xaxis.y yaxis.y zaxis.y 0
    xaxis.z yaxis.z zaxis.z 0

    was soll das heißen? 😕 Also die null am ende?



  • Ein Vektor reicht ja auch nicht, um die Camera eindeutig zu definieren. Du brauchst mindestens 3.

    Referenz für Mathematik? Vielleicht eine Mathebuch!

    Bye, TGGC \-/



  • TGGC schrieb:

    Referenz für Mathematik? Vielleicht eine Mathebuch!

    Das hab ich hier neben mir liegen. Glaubst du, ich hab nicht vorher nachgeschaut? Da Problem hab ich nicht erst seit einer Minute.



  • @randa
    ooops, ist etwas "aus der form geraten"^^
    das ist die matrix bzw. wie man sie ausrechnet:

    EDIT: wieso macht das forum meine schönen leerzeichen hier immer weg, und schiebt die wörter so nah zusammen????!!!?!?!!? habe jetzt "trennstriche" eingefügt
    xaxis.x | yaxis.x | zaxis.x | 0
    xaxis.y | yaxis.y | zaxis.y | 0
    xaxis.z | yaxis.z | zaxis.z | 0
    -dot(xaxis, eye)| -dot(yaxis, eye)| -dot(zaxis, eye)| 1
    d.h. das zb Matrix[0][0] = xaxis.x is. und die Nullen sine ebenfalls elemente der matrix zB Matrix[0][3] = 0.
    "Ich benutze kein DirectX"
    dachte ich mir, deshalb hab ich ja auch den rechenweg gepostet^^
    @TGGC
    IMHO braucht man nur zwei. Position und Direction. Der Up Vektor wird doch nur selten anders als mit (0,1,0) gesetzt, und der right vektor ist das crossproduct aus Direction und Up Vektor. (Wie gesagt, meine Meinung)



  • ok, capiche. hab mir schon tage drüber den Kopf zerbrochen.
    Danke vielmals. 🙂



  • [quote="Babbo"]
    EDIT: wieso macht das forum meine schönen leerzeichen hier immer weg, und schiebt die wörter so nah zusammen????!!!?!?!!? habe jetzt "trennstriche" eingefügt[/quote]

    hm.. weil html alle leerzeichen hinter dem ersten ignoriert und foren deswegen meistens code oder source tags haben, bzw. html den pre tag?



  • @Babbo: Auch wenn er nie anders ist, benötigst du ihn aber trotzdem.

    Bye, TGGC \-/



  • @Trienco oooooops^^
    @TGGC ja, aber man muss ihn nicht ausrechnen oder so...^^ okok, hab mich getäuscht, schande über mioch 😛 😉



  • Ok, ich hab die Matrix soweit getestet. Wie mir scheint, sieht man durch diese Matrix dennoch alles aus sicht des Urprungs, d.h. nur das Verhältnis von Eye und At zählt. Aber ich weiß nicht, wie die Matrix aussehen muss das ich die Objekte von einer beliebigen Position des Raums aus sehe. Das ist, was ich brauche.
    Entweder meine Feststellung über das Verhätnis ist richtig, oder ich hab da etwas falsch gemacht. Hier mal der Code:

    Matrix Result;
    opt::Vector3D Up (0.0, 1.0, 0.0);
    opt::Vector3D ZAxis;
    opt::Vector3D YAxis;
    opt::Vector3D XAxis;
    
    ZAxis=(ViewAt-ViewPosition);
    XAxis=(Up.CrossProduct (ZAxis));
    YAxis=(ZAxis.CrossProduct (XAxis));
    
    ZAxis.Normalize ();
    XAxis.Normalize ();
    YAxis.Normalize ();
    
    Result[0][0]=XAxis.vx;
    Result[0][1]=YAxis.vx;
    Result[0][2]=ZAxis.vx;
    
    Result[1][0]=XAxis.vy;
    Result[1][1]=YAxis.vy;
    Result[1][2]=ZAxis.vy;
    
    Result[2][0]=XAxis.vz;
    Result[2][1]=YAxis.vz;
    Result[2][2]=ZAxis.vz;
    
    Result[3][0]=-XAxis.DotProduct (ViewPosition);
    Result[3][1]=-YAxis.DotProduct (ViewPosition);
    Result[3][2]=-ZAxis.DotProduct (ViewPosition);
    
    return Result;
    

    ViewPosition ist entprechend "Eye". Für Eye hab ich natürlich etliche Kombinationen versucht, dennoch sehe ich alles aus dem Urprung. Abgesehen davon kann ich für Eye nicht (0, 0, 0) nehmen, da dann die Berechnungen falsch sind, d.h. ich sehe nichts mehr.



  • naja, sehe so erstma keinen fehler, ich denke mal, dass Result im konstruktor auf identity gesetzt wird?
    ansonsten fällt mir auf, dass ich nen fehler gemacht hab, sorry, At kann nicht einfach durch die Richtung des Vectors ersetzt werden, sondern muss den absoluten punkt enthalten, auf den der vektor "zeigt". sry dafür.



  • Babbo schrieb:

    naja, sehe so erstma keinen fehler, ich denke mal, dass Result im konstruktor auf identity gesetzt wird?

    Einheitsmatrix? Ja.

    ansonsten fällt mir auf, dass ich nen fehler gemacht hab, sorry, At kann nicht einfach durch die Richtung des Vectors ersetzt werden, sondern muss den absoluten punkt enthalten, auf den der vektor "zeigt". sry dafür.

    Was meinst du jetzt mit absoluten Punkt, auf den der zeigt?

    Ansonsten, kennt du eine möglichkeit, wie die Matrix aufgebaut werden muss, damit ich von einem beliebigen Punkt im Raum aus die Objekte betrachten kann?

    Oder sagt mir wenigstens, wo ich eine Referenz du dem Thema finden kann, dann kann ich mich auch selber damit auseinandersetzen. Ich hab zu dem spezifischen Thema nichts gefunden.

    Edit: Ne Referenz wäre mir sogar lieber, dann versteh ich auch genau, wie und warum.



  • Ansonsten, kennt du eine möglichkeit, wie die Matrix aufgebaut werden muss, damit ich von einem beliebigen Punkt im Raum aus die Objekte betrachten kann?

    Nun, ich dachte ja, das würde so funktionieren, bei mir gehts auch...
    mit dem "absoluten punkt" meine ich folgendes (kleines beispiel mit 2d vektoren):
    d hast deine "camera" an position (0,0). sie schaut nach oben (positive y werte). du kannst also nun für "At" den punkt (0,1) angeben. ist deine "camera" nun aber an position (1,0), und du gibst als "At" weiterhin (0,1) an, so schaut deine kamera nicht nach oben, sondern eben auf den punkt (0,1), also nach "linksoben". stattdessen müsstest du als "At" (1,1) angeben, um sie wieder nach oben schauen zu lassen.
    falls das nicht stimmt, schlagt mich ruhig, ich habe das jedoch so erfahren.
    referenzen findest du zb auf gamedev.net, geh da mal auf articles und such nach "camera class" oder sowas... ist recht gut erklärt, aber in englisch.



  • Babbo schrieb:

    Nun, ich dachte ja, das würde so funktionieren, bei mir gehts auch...

    Na, also entweder ist der Code genau das, was LookAtbla macht, oder das ist irgend was anderes. Jedenfalls schaue ich immer aus dem urprung. Ich schau mir die ganze Matrix Sache noch mal genau an.
    Jedenfalls hab ich auf gamedev usw dazu konkret nix gefunden, aber ich les mir mal die camera-matrix sachen durch, das wirds wohl sein.
    Das mit dem Absolutpunkt war mir klar.

    Danke für deine Hilfe.



  • Was meinst du jetzt mit absoluten Punkt, auf den der zeigt?

    Das mit dem Absolutpunkt war mir klar.

    jaja...^^



  • Babbo schrieb:

    jaja...^^

    Ich hab das schon verstanden, nur ich hab nicht verstanden worauf du hinauswolltest (absolutpunkt und so *g*)

    Ich hab weiter getestet und zeige mal auf, was mir nicht korrekt scheint:
    Gegeben:
    Ein Objekt, dessen Mittelpunkt liegt auf der z Achse. Der Z-Wert des Mittelpunkts beträgt 150, also M(0, 0, 150)
    Ein Zielpunkt, auf den ich schauen will: v(0.0, 0.0, 150.0), liegt auch auf der z-Achse
    Der Punkt, von dem aus ich schauen will: s(300, 0.0, 1.0)

    Eye ist dementprechend 's' und At ist 'v'.

    Ergebnis: Das Objekt ist nicht auf dem Bildschirm sichtbar. Es ist weit rechts (also +x-Koordinate). Wie ich mir das vorstelle (und wie es sein sollte) ist, das ich das Objekt sehe, aber etwas schräg von rechts. Und ich hatte erwartet, das das Objekt in der Mitte auftaucht. Denn wenn At-Eye=ZAchse, und das Objekt liegt auf der ZAchse, dann muss es genau in der Mitte sein.
    Meine Feststellung ist, das aus irgendeinem Grund das Objekt zu weit rechts ist, also die X-Koordinate falsch berechnet wird. Ob das auch direkt mit der Formel CrossProduct (Up, ZAxis) zusammenhängt, darüber bin ich mir nicht im klaren.
    Wie gesagt, diesen Test, den ich mit dieser Funktion mache, ist die allererste Transformation während der Hauptschleife und die einzige (d.h. es wird nach dieser Testtransformation keine andere mehr ausgeführt). Ausnahme ist die Transformation besagten Objekts um 150 Z, gleich beim Programmstart.
    Mensch Meier, was kann hier bloß falsch laufen? Es ist ja so oder so fast eine 1:1 Kopie aus dem DX-Manual!?



  • *push*

    Noch eine Verständnisfrage: Wozu sind die drei negativen dot products da? Ich hab verstanden, wozu das andere Zeugs da ist, nur der Zweck der dot products ist mir unbekannt. 😕


Log in to reply