Vektor drehen, Koordinatensysteme umrechnen



  • Folgendes Problem, ich kanns nur schlecht erklären, es wäre schön wenn ihr versuchen könntet meinen etwas ungenauen Text zu verstehen und mir zu helfen:

    Ich habe einen beliebigen Normalenvektor gegeben, und will ihn nach links oder nach rechts, oder nach oben oder nach unten kippen. Der Grad der Kippung ist gegeben. Nach rechts/links drehen bedeutet nun, dass ich um die y-Achse drehe, und nach oben/unten drehen heißt, um die x-Achse zu drehen - wenn der Vektor die Z-Achse wäre.
    Das alles kann ich mir noch grade so vorstellen, aber mehr auch nicht. Hab von linearer Algebra eigentlich auch keine Ahnung, hatten wir nämlich noch nicht in der Schule. Ich hoffe ihr könnt es mir verständlich erklären.
    Hab (brauch das für Bumpmapping) noch was im Netz gefunden, wovon ich hauptsächlich verstehe, dass es hierzu passt:

    Nehe Gamedev & Michael I. Gold schrieb:

    Rotate Light Vector Into Normal Space

    * Need Normal coordinate system
    * Derive coordinate system from normal and “up” vector (we pass the texCoord directions to our offset generator explicitly, rem.: Jens)
    * Normal is z-axis
    * Cross-product is x-axis
    * Throw away "up" vector, derive y-axis as cross-product of x- and z-axis
    * Build 3x3 matrix Mn from axes
    * Transform light vector into normal space.(Mn is also called an orthonormal basis. Think of Mn*v as to "express" v in means of a basis describing tangent space rather than in means of the standard basis. Note also that orthonormal bases are invariant against-scaling resulting in no loss of normalization when multiplying vectors! rem.: Jens)

    Ein zusätzliches Problem ist übrigens, dass ich diesen up-vector, der ja anscheinend die y-Achse des Normalen-Koordinatensystems darstellt, nicht einmal kenne/einfach herausfinden kann, aber das tut hier erstmal nichts zur Sache.

    Wobei, vielleicht kann mir da auch gleich geholfen werden: 😃
    Ja, ich denke folgende Informationen könnten sogar nützlich für die Lösung sein:
    Den Wert, um den ich den Normalenvektor nach "rachts/links" rotieren will, wird erhalten, indem in einem Bild die Farbe eines Pixels an Stelle (x, y) mit der des Pixels an Stelle (x+1, y) vergleiche, und der Wert bei oben/unten wird die Farbe des Pixels mit der bei (x, y+1) verglichen.
    (Eigentlich kommt dann auch noch eine 3. Rotation hinzu, wenn ich nämlich als 2.
    Pixel (x+1, y+1) habe, aber das hab ich oben erstmal weggelassen)
    Der Pixel (x, y) ist automatisch so gewählt dass er an der Stelle liegt, wo der Normalenvektor ausgeht.
    Wenn mich nicht alles täuscht, handelt es sich also hier um ein 3. Bild-Koordinatensystem. Ich kann auch eine entsprechende Matrix namens Texturmatrix abrufen (ist gegeben). Ich bin sicher dass es damit eine einfache Lösung des Problems gibt, aber finden kann ich sie alleine nicht.
    Hoffentlich war es für euch möglich meinen wirren Gedanken zu folgen und die Situation zusammenzupusseln 😉

    Danke im Voraus,
    spl@t


Anmelden zum Antworten