/ / Einstellen des Up-Vektors im Kamera-Setup in einem Raytracer - Kamera, Raytracing

Einstellen des Up-Vektors im Kamera-Setup in einem Raytracer - Kamera, Raytracing

Ich lese Grundlagen der Computergrafik undIch versuche, meinen eigenen Ray Tracer einzurichten. Das Buch sagt: "Die gebräuchlichste Art, den Kamerarahmen zu konstruieren, ist vom Standpunkt, der e wird, die Blickrichtung, die w ist, und der Aufwärtsvektor, der benutzt wird, um eine Basis zu konstruieren, die v und w hat Ebene definiert durch die Blickrichtung und die Aufwärtsrichtung "

aber dann kam ich rüber Wie bewegt man eine Kamera mit einem Ray-Tracer? was besagt, dass wir den Aufwärtsvektor für die (Steigung?) korrigieren müssen, indem wir ein Kreuzprodukt mit der Kamerarichtung (w) ausführen. Warum das?

Ich rufe mein Kamera-Setup mit LookAt (0,0,0) und Up (0,1,0)

// a camera can be constructed using a position, direction and an up vector
Camera::Camera(Vector position, Vector lookAt, Vector up) {
this->position = position;
this->lookAt = lookAt;

// the difference between camera position and where we want
// to look at is the direction of the camera
Vector direction = lookAt.diff(position);

// camera frame
w = direction.normalize();
v = up.cross(w).normalize(); // right vector


// which is the correct up?
u = up.normalize();
printf("%.2f %.2f %.2fn", u.getX(), u.getY(), u.getZ()); // prints 0 1 0

u = v.cross(w).normalize(); // the up vector
printf("%.2f %.2f %.2fn", u.getX(), u.getY(), u.getZ()); // prints 0.31 -0.86 -0.41
}

Antworten:

1 für die Antwort № 1

Was Sie am Ende brauchen, ist ein Paar Vektorendas bildet eine orthonormale Basis für die Bildebene. Einer davon wird nach rechts in Bezug auf die Ausrichtung der Kamera zeigen. Der andere wird relativ zur Ausrichtung der Kamera zeigen.

Wenn der obere Vektor ein allgemeiner ist, ist der Himmel dasSo, "und wenn Ihre Kamera nicht eben ist, dann werden der Aufwärts- und der Kamera-Up-Vektor etwas anders sein. Der Aufwärts-Vektor ist ein Hinweis auf die von Ihnen gewünschte Ausrichtung, aber es ist nicht genau der richtige Vektor. In diesem Fall können Sie den rechten Vektor mit dem Richtungsvektor kreuzen, und das wird Ihnen einen Vektor geben, der in der Bildebene liegt und senkrecht zum rechten Vektor steht. Das ist, was Sie wollen.

Wenn der obere Vektor ein allgemeiner "der Himmel ist so" ist, und wenn deine Kamera ist level, dann der up-Vektor und der camera_upVektor wird genau gleich sein. Das zusätzliche Cross-Produkt wäre unnötig, aber es gibt keinen Schaden, wenn Sie wollen, dass der Code allgemein genug ist, um den ersten Fall zu behandeln.

Vielleicht kann etwas ASCII-Kunst helfen, zu klären ...

^                                        * look-at point
| "up"        "camera up"
|                  
|       image plane 

"camera down"

Der obere Vektor ist gerade hoch. Der Blickpunkt ist höher als die Kamera, daher muss die Kamera ein wenig zurückkippen. Im Diagramm sehen wir die Kante der Bildebene. Der "richtige" Vektor befindet sich in dieser Ebene und weist auf das Diagramm hin. Der Richtungsvektor (den Ihr Code aufgerufen hat w) steht senkrecht auf dem Bild und zeigt direkt auf den Blickpunkt.

Der Kamera-up-Vektor (u in Ihrem Code) muss in der Bildebene liegen, also können wir "up" nicht verwenden. Und es muss senkrecht zum "richtigen" Vektor sein. Der einfachste Weg, das zu bekommen, besteht darin, diese zwei Vektoren zu kreuzen.

Da wir den "richtigen" Vektor in Bezug auf den ursprünglichen Aufwärtsvektor erzeugt haben, gibt uns das die Orientierung.