tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
8
ZUGRIFFE
1081
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Maab Tutorials.de Gastzugang
    Hallo,

    ich stehe wieder vor einem neuen Problem.
    Ich versuche derzeit immernoch ein umschauen im 3D-Raum zu ermöglichen.

    Hier bei habe ich zwei Punkte, jeweils das Ziel und den Standort der Kamera.
    Wenn ich mich horizontal bewegen möchte, bilde ich die Rotationsmatrix Z für den Zielpunkt der dann um die Kamera rotiert und demnach die Kamera in diese Richtung schaut.

    Jedoch komme ich auf keinen Nenner mit der Vertikalen.
    Wie berechne ich diese Vertikale, d.h. nach oben und unten schauen, wenn ich einen Winkel gegeben habe und die zwei besagten Punkte ?

    Wenn ich eine Rotationsmatrix X und eine Rotationsmatrix Y bilde, diese miteinander multipliziere dann kommt irgendwie nur Müll raus.

    Weiss jemand Rat ?

    (Der Standort der Kamera befindet sich irgendwo im Raum, der Abstand (also der Radius) zwischen Standort und Ziel beträgt immer 2)

    Grüße und Danke,
    Maab.
     

  2. #2
    Maab Tutorials.de Gastzugang
    Nochmal zu dem Problem:

    Ich habe HIER ein Bild welches das Problem ganz gut beschreibt.

    Der grüne Punkt rotiert um die Z-Achse (Rotationskreis = grau) welcher das umschauen horizontal simuliert.

    Der (türkise) Viertelkreis zeigt einen Ausschnitt für das Rotieren in vertikaler Richtung.
    Der (rote bzw. schwarze) Punkt auf diesem Viertelkreis ist der Punkt der um den Winkel (gelb) ,auf diesem Kreis, verschoben werden soll!

    Vielleicht bringt das etwas mehr Lich in das Problem.

    Grüße,
    SkiD.
     

  3. #3
    Registriert seit
    Dec 2001
    Ort
    Bayern
    Beiträge
    5.800
    Blog-Einträge
    5
    Hallo,

    wenn du den Augpunkt und den Zielpunkt gegeben hast, dann baut man sich eine View-Matrix (ich nehme an die willst du berechnen?) am einfachsten über ein Orthonormalsystem zusammen. Das funktioniert in etwa so:
    Code :
    1
    2
    3
    4
    
    vorwärts <- normalisiere(zielpunkt - augpunkt)
    oben <- (0, 0, 1)
    rechts <- normalisiere(vorwärts × oben)
    oben <- normalisiere(rechts × vorwärts)
    Dabei ist × das Kreuzprodukt, für das die Rechte-Hand-Regel gelten sollte. Die Rotationsmatrix ergibt sich dann, indem man die drei Vektoren als Spalten bzw. Zeilen verwendet (je nachdem, ob du Spalten- oder Zeilenvektoren verwendest).

    Wenn du keine View-Matrix berechnen willst, dann solltest du das Problem vielleicht noch etwas genauer spezifizieren.

    Grüße, Matthias
     
    „Gib einem Menschen einen Fisch, und er wird für einen Tag satt. Lehre ihn Fischen, und er wird ein Leben lang satt.“
    “For every complex problem, there is an answer that is short, simple and wrong.”
    “Pessimism is safe, but optimism is a lot faster!”


    Aktuelles Coding Quiz: #17 - Wörter kreuz und quer

  4. #4
    Maab Tutorials.de Gastzugang
    Also wenn ich das jetzt richtig interpretiere, dass eine ViewMatrix eine Matrix ist, welches es mir erlaubt das ich mich immer um einen Punkt drehe, dann soll das genau der umgekehrte Fall sein.

    Ich möchte dass sich ein Punkt um meinen Standort dreht
    So ähnlich wie bei der Sonne und der Erde:
    Die Erde dreht sich um die Sonne (jedenfalls meistens) in einer Kreisbahn (ja ich weiss das stimmt nicht ganz, aber lassen wir unsere Erde jetzt einfach mal auf einer Kreisbahn umlaufen) , hierbei möchte ich (wenn ich jetzt die Sonne bin) die Erde immer im Blickpunkt haben, d.h. ich möchte immer in auf diesen Punkt schauen wo sich die Erde gerade befindet., bzw. in diese Richtung.

    Der Sonderfall hier ist jedoch, dass die Erde sich in meinen Fall nicht auf der XY-Ebene befindet, sondern dass sich meine Erde über mich drehen soll und unter mir durch. (siehe Bild)

    Wenn die ViewMatrix dieses Problem genau speziefiert, dann wäre es schon schön, wenn wir das im Detail durchgehen könnten, evtl. auch an einem Beispiel.

    D.h. ich befinde mich nicht im Mittelpunkt, sondern an der Position [2, 2, 0] (= Pe = Position Eye).
    Mein Blickpunkt befindet sich auf [4, 4, 4] (= Pv = Position Viewpoint).

    Normalisierung um ins Zentrum zu rutschen (?):
    d = Pt - Pe = [2, 2, 4] (= entspricht demnach auch den Richtungsvektor)

    Vorwärts x Oben:
    2 * 0 - 2 * 0 = 0
    2 * 1 - 2 * 0 = 2
    2 * 0 - 2 * 1 = 2

    Soll hier jetzt eine Matrix oder ein Vektor rauskommen ?
    Weil dann ist das nämlich eigentlich schon falsch ...

    Noch etwas, wenn ich vorher schonmal eine Rotation haben sollte, bspw. eine Rotation um die Z-Achse, muss ich dann, um die neuen Koordinaten rauszubekommen, diese Matrix * die Z-Rot-Matrix * den Richtugsvektor nehmen ?

    Grüße,
    Maab.
     

  5. #5
    Registriert seit
    Dec 2001
    Ort
    Bayern
    Beiträge
    5.800
    Blog-Einträge
    5
    Zitat Zitat von Maab Beitrag anzeigen
    Also wenn ich das jetzt richtig interpretiere, dass eine ViewMatrix eine Matrix ist, welches es mir erlaubt das ich mich immer um einen Punkt drehe, dann soll das genau der umgekehrte Fall sein.
    Eine Viewmatrix gibt an, wie die Szene transformiert werden muss, damit der Augpunkt im Ursprung liegt und eine festgelegte Achse der Blickrichtung entspricht. Sie setzt sich in der Regel aus einer Translation und anschließender Rotation zusammen. Ist das das, was du berechnen willst, oder etwas anderes? Wenn es etwas anderes sein soll, dann erkläre doch bitte genau, was berechnet werden soll.

    Zitat Zitat von Maab Beitrag anzeigen
    D.h. ich befinde mich nicht im Mittelpunkt, sondern an der Position [2, 2, 0] (= Pe = Position Eye).
    Mein Blickpunkt befindet sich auf [4, 4, 4] (= Pv = Position Viewpoint).

    Normalisierung um ins Zentrum zu rutschen (?):
    d = Pt - Pe = [2, 2, 4] (= entspricht demnach auch den Richtungsvektor)
    Hier wird nur der Richtungsvektor vom Augpunkt zum Zielpunkt berechnet. Zur Normalisierung muss der Vektor noch auf die Länge 1 gestreckt werden.

    Zitat Zitat von Maab Beitrag anzeigen
    Vorwärts x Oben:
    2 * 0 - 2 * 0 = 0
    2 * 1 - 2 * 0 = 2
    2 * 0 - 2 * 1 = 2
    Was rechnest du da? Das Kreuzprodukt aus [2, 2, 4] und [0, 0, 1] ist [2 * 1 - 4 * 0, 4 * 0 - 2 * 1, 2 * 0 - 2 * 0] = [2, -2, 0]. Um das Beispiel zu komplettieren (zunächst mal ohne die Normalisierung):
    Code :
    1
    2
    3
    4
    5
    6
    
    Pe <- [2, 2, 0]
    Pv <- [4, 4, 4]
    vorwärts <- Pv - Pe // = [2, 2, 4]
    oben <- [0, 0, 1]
    rechts <- vorwärts × oben // = [2, -2, 0]
    oben <- rechts × vorwärts // = [-8, -8, 8]
    Angenommen die Kamera soll jetzt entlang der negativen y-Achse schauen, die z-Achse soll nach oben zeigen und die x-Achse nach rechts. Dann sähe eine entsprechende View-Matrix aus wie folgt:
    Code :
    1
    
    [normalize(rechts), -normalize(vorwärts), normalize(oben)]
    Wenn man jetzt Pv zuerst so transliert, dass die Kamera im Ursprung liegt (Pe abziehen) und dann die Matrix darauf anwendet, ergibt sich [0, -2*sqrt(6), 0]. Der Punkt liegt auf der negativen y-Achse, also genau was wir erreichen wollten.

    Zitat Zitat von Maab Beitrag anzeigen
    Soll hier jetzt eine Matrix oder ein Vektor rauskommen ?
    Das Kreuzprodukt ergibt immer einen Vektor.

    Zitat Zitat von Maab Beitrag anzeigen
    Noch etwas, wenn ich vorher schonmal eine Rotation haben sollte, bspw. eine Rotation um die Z-Achse, muss ich dann, um die neuen Koordinaten rauszubekommen, diese Matrix * die Z-Rot-Matrix * den Richtugsvektor nehmen ?
    Was sollen denn die „neuen Koordinaten“ sein? Wenn du die beschriebene Rechnung ausführst, wird der Vektor zuerst um die z-Achse rotiert und dann mit der neuen Matrix transformiert.

    Grüße, Matthias
     
    „Gib einem Menschen einen Fisch, und er wird für einen Tag satt. Lehre ihn Fischen, und er wird ein Leben lang satt.“
    “For every complex problem, there is an answer that is short, simple and wrong.”
    “Pessimism is safe, but optimism is a lot faster!”


    Aktuelles Coding Quiz: #17 - Wörter kreuz und quer

  6. #6
    Maab Tutorials.de Gastzugang
    Ja also ich denke du machst genau dass, was ich auch mache, nur ich nutze Matrizen dazu.

    Pass auf, ich dachte mir das so:
    Zuerst nehme ich diesen Richtungsvektor ,der von Ursprung zum Punkt führt, und verschiebe diesen auf die X-Achse.

    Ungefähr so:
    Punktkoordinaten = [2,2,2] = vec(p)
    Derzeitiger Standort = [0,0,0] = vec(s)

    X-Achsen-Vektor = [1, 0, 0] = vec(x)
    Richtungsvektor = [2,2,2] - [0,0,0] = [2,2,2] = vec(r)

    Ich berechne das Azimuth:
    cos(gamma) = vec(r) * vec(x) / ( betrag(vec(r)) * betrag(vec(x)) )
    azimuth = acos(gamma)

    Dann bilde ich hier raus die Rotationsmatrix um die Z-Achse:

    Zr = [ [cos(azimuth), -sin(azimuth, 0)], [sin(azimuth), cos(azimuth), 9], [0,0,1] ]

    Dann bilde ich die Rotationsmatrix für die Rotation um Y

    Yr = [ [cos(beta), 0, sin(beta)], [0,1,0], [-sin(beta), 0, cos(beta)] ]

    Dann die Inverse von Zr

    Zi = Zr^(-1)

    Anschließend multipliziere ich die Matrizen der Reihe nach mit den Richtungsvektor:

    vec(rneu) = Zr * Yr * Zi * vec(r)

    Und verschiebe den ganzen Kram zurück

    Neue Koordinaten = [ rneu[0] + s[0], rneu[1] + s[1], rneu[2] + s[2]]

    So hätte ich mir das gedacht, bin mir nicht sicher ob das so funktionieren würde.
    Bzw. es funktioniet in meiner Anwendung nicht, da die Rotation irgendwie von ihren "Kurs" abkommt.

    Im großen und ganzen dürfte dass der ViewMatrix entsprechen.
    Deiner ausführlichen Erklärung, wie man das nun genau berechnet, werde ich jetzt mal nachgehen.

    Grüße,
    MaaB.
     

  7. #7
    Registriert seit
    Dec 2001
    Ort
    Bayern
    Beiträge
    5.800
    Blog-Einträge
    5
    Zitat Zitat von Maab Beitrag anzeigen
    Pass auf, ich dachte mir das so:
    Zuerst nehme ich diesen Richtungsvektor ,der von Ursprung zum Punkt führt, und verschiebe diesen auf die X-Achse.

    Ungefähr so:
    Punktkoordinaten = [2,2,2] = vec(p)
    Derzeitiger Standort = [0,0,0] = vec(s)

    X-Achsen-Vektor = [1, 0, 0] = vec(x)
    Richtungsvektor = [2,2,2] - [0,0,0] = [2,2,2] = vec(r)

    Ich berechne das Azimuth:
    cos(gamma) = vec(r) * vec(x) / ( betrag(vec(r)) * betrag(vec(x)) )
    azimuth = acos(gamma)
    Das ist nicht das Azimut, sondern der Winkel zwischen r und x. Der Unterschied sollte klar werden, wenn du zum Beispiel vec(p) = [2, 0, 2] wählst. Da der Punkt „über der x-Achse“ liegt, ist der Azimut 0, deine Rechnung ergibt allerdings 45°. Du musst den Punkt zuerst orthogonal auf die xy-Ebene projezieren (z = 0 setzen), wenn du das Azimut berechnen willst.

    Zitat Zitat von Maab Beitrag anzeigen
    Dann bilde ich hier raus die Rotationsmatrix um die Z-Achse:

    Zr = [ [cos(azimuth), -sin(azimuth, 0)], [sin(azimuth), cos(azimuth), 9], [0,0,1] ]

    Dann bilde ich die Rotationsmatrix für die Rotation um Y

    Yr = [ [cos(beta), 0, sin(beta)], [0,1,0], [-sin(beta), 0, cos(beta)] ]
    Was ist beta? Der Polarwinkel?

    Zitat Zitat von Maab Beitrag anzeigen
    Dann die Inverse von Zr

    Zi = Zr^(-1)

    Anschließend multipliziere ich die Matrizen der Reihe nach mit den Richtungsvektor:

    vec(rneu) = Zr * Yr * Zi * vec(r)
    Ich dachte du wolltest den Punkt auf die x-Achse verschieben? Wo passiert das?

    So ganz hab ich immer noch nicht verstanden, was du eigentlich machen willst…

    Grüße, Matthias
     
    „Gib einem Menschen einen Fisch, und er wird für einen Tag satt. Lehre ihn Fischen, und er wird ein Leben lang satt.“
    “For every complex problem, there is an answer that is short, simple and wrong.”
    “Pessimism is safe, but optimism is a lot faster!”


    Aktuelles Coding Quiz: #17 - Wörter kreuz und quer

  8. #8
    Avatar von Ryu1991
    Ryu1991 Ryu1991 ist offline Mitglied Gold
    Registriert seit
    Dec 2007
    Beiträge
    241
    Ohne jetzt alles gelesen zu haben, aber warum benutzt du nicht ne fertige Engine?
    Irrlicht wäre da zu empfehlen, aber es gibt auch 100e von anderen guten 3D-Engines
     
    "2 Dinge sind Unendlich, die Menschliche Dummheit und das Universum, bei 2tem bin ich mir noch nicht ganz sicher", Albert Einstein
    "Wenn man keine Ahnung hat, einfach mal Fresse halten", Dieter Nuhr

  9. #9
    3Cyb3r 3Cyb3r ist offline Mitglied Brokat
    Registriert seit
    May 2008
    Ort
    Baunatal (Hessen)
    Beiträge
    413
    Ohne jetzt alles gelesen zu haben, aber warum benutzt du nicht ne fertige Engine?
    Irrlicht wäre da zu empfehlen, aber es gibt auch 100e von anderen guten 3D-Engines
    Solche Posts verstehe ich nicht ... *kopfschüttel*
     
    Bei der Geburt ist ein Mensch so unfertig, wie ein an einem schönen blauen Montag in Taiwan hergestellter Computer vor der Programmierung.
    - Wolfgang Körner

Ähnliche Themen

  1. Suche Anleitung für ein Gamestudio-A7- Egoshooter-Spiel
    Von Forstidax im Forum Sonstige 3D-Programme
    Antworten: 0
    Letzter Beitrag: 19.05.09, 22:25
  2. Rotation
    Von Newb im Forum Flash Plattform
    Antworten: 2
    Letzter Beitrag: 09.10.06, 08:44
  3. Rotation
    Von DelphiDel im Forum Flash Plattform
    Antworten: 5
    Letzter Beitrag: 14.10.05, 19:55
  4. Forms mit Weiter-Button weiter schalten
    Von FutureTeam im Forum .NET Archiv
    Antworten: 3
    Letzter Beitrag: 11.04.05, 13:44
  5. Mal weiter oben mal weiter unten
    Von redX im Forum HTML & XHTML
    Antworten: 0
    Letzter Beitrag: 28.08.04, 14:43