Matrix für die Sicht aus Richtung eines Vektors



  • 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. 😕


Anmelden zum Antworten