RayTracing und Cubic environment mapping



  • Hallo zusammen,

    für die Uni arbeiten wir gerade an einem RayTracer.
    Bin mittlerweile soweit, dass ich gerne eine environment map implementieren möchte.

    Zunächst prüfe ich für jeden Ray welche Seite der Map benutzt werden soll (right, left, front, back, top, bottom). Diese Abfrage funktioniert soweit auch. Ich hänge aber nun an der Stelle wie ich über die Richtung des Rays nun auf einen Bildpunkt der Map zugreifen kann. Jede Seite meiner Map hat eine Größe von 512*512 Pixel und ich benutze für das Auslesen der Farbe eines Pixels OpenCV mit der Methode cvGet2D. Dieser übergebe ich das Bild sowie x und y Koordinaten für den jeweiligen Bildpunkt. Ich hänge nun aber an der Mathematik wie ich die Bildpunkte korrekt auslesen kann. Auf einer Webseite konnte ich folgendes Beispiel finden:

    Für die front-map:

    s=cvGet2D(img5, myRay.direction(1) / myRay.direction(2) + 1.0f) * 0.5f*sizeY,
    					  (myRay.direction(0) / myRay.direction(2) + 1.0f) * 0.5f*sizeY);
    

    Wobei direction(1) die y-Achse, direction(0) die x-Achse, direction(2) die z-Achse und sizeX und sizeY die Größe der entsprechenden Map sind.

    Dies funktioniert auch teilweise. Das angezeigt Bild ist allerdings extrem verpixelt und abgeschnitten. Hat hier jemand eine Idee?

    Viele Grüße
    skizZ


  • Mod

    skizZ schrieb:

    Das angezeigt Bild ist allerdings extrem verpixelt und abgeschnitten. Hat hier jemand eine Idee?

    jap, vermutlich hat jeder sogar eine ganz andere idee was du damit meinst.
    screenshot wuerde helfen 😉



  • Das klingt für mich, als ob bei einer Rechnung ein Epsilon, also ein sehr Kleiner zusätzlicher Wert fehlt, um Ungenauigkeiten durch die endliche Genauigkeit der Fließkommazahlen entsteht, auszugleichen.



  • Hallo,

    hier habe ich ein Bild:
    http://imageshack.us/photo/my-images/215/bildschirmfoto20111201ul.png/

    Die Spiegelung auf der Kugel oben rechts scheint entsprechend auch nicht zu funktionieren.

    skizZ


  • Mod

    schaut aus als ob vielleicht die orientierung der einzelnen faces nicht korrekt ist, manchmal is die implementierung

    s=cvGet2D(img5, myRay.direction(1) / fabsf(myRay.direction(2)) + 1.0f) * 0.5f*sizeY,
                          (myRay.direction(0) / fabsf(myRay.direction(2)) + 1.0f) * 0.5f*sizeY);
    

    vielleicht ist auch mal x und y vertauscht? (also oben/unten) ?



  • Hi,

    also das Problem ist, wenn das andersrum da steht, dann ist das Hintergrundbild um 90 Grad nach rechts verdreht. Nur so wird es richtig angezeigt 🙂

    Ich muss wohl noch ein bisschen kämpfen, aber ist die vorgehensweise so allgemein korrekt?

    Ich vermute den Fehler mittlerweile woanders.
    Die Richtung des Vektors in eine Achse kann ja negativ sein. Benutze ich kein fabs, dann läuft das Programm nicht durch. Ich verfälsche also auch die eigentlichen Werte. Hat dazu jemand eine Idee?

    Ich möchte nur mit der Richtung eines Vektors auf den passenden Bildpixel zugreifen.

    skizZ


Anmelden zum Antworten