Ich erstelle einen Lichtsimulator in C++ für eine 3D-Szene (vorerst eine "Cornell-Box"). Dies ist ein Projekt für einen Grafikkurs, den ich mache, und ich versuche nicht, es schnell zu machen, nur ein anständiges Bild zu rendern, ist für mich in Ordnung, auch wenn es Stunden dauert. Ich möchte globale Beleuchtung und DOF demonstrieren.
Anstelle eines normalen Raytracers werden die Strahlen von einer Punktlichtquelle emittiert, prallen auf die Geometrie in der Szene und treffen schließlich auf den Lichtsensor, der in der 3D-Umgebung ein Rechteck ist, und je nachdem, wo der Strahl auf den Sensor trifft, das Intensität wird für dieses Pixel auf dem Bildschirm erhöht.
Zwischen dem Sensor und der Szene befindet sich ein Objektiv, das ich zu entwerfen und richtig zu positionieren versuche, um eine Kamera zu simulieren. Die Linse ist ebenfalls eine flache Oberfläche, aber die Normalen (wenn der Strahl auf die Linse trifft und gebrochen wird) werden gemäß einer dünnen, sphärischen Linse berechnet.
Mein aktuelles Setup, das sich aus Formeln für Objektive und dergleichen ergibt, die ich auf Wikipedia gefunden habe:
The Cornell box: x, y and z in between -1 and 1
Sensor dimensions: 0.2 x 0.2 (too large?)
Sensor position: 0, 0, -2.9
Sensor resolution: ~ 150 x 150 px
Lens dimensions: 0.4 x 0.4 (rectangular shape for now, spherical normals)
Lens position: sensor position + (0, 0, 0.1037) (in front of sensor)
Lens IOR: 1.52 (glass)
Lens focal length: 0.1
Lens radius: 0.104
Was zu sehen ist, ist hauptsächlich die Punktlichtquelle, unfokussiert.
Idealerweise möchte ich, dass ungefähr die Hälfte des Feldes (z zwischen -.5 und.5) fokussiert wird, damit der DOF sichtbar ist. Meine Frage ist: Wie kann ich den Sensor und das Objektiv kalibrieren, damit ein Bild erscheint? Ich glaube nicht, dass ich das Objektiv und den Sensor zu klein machen kann, dann werden fast alle Strahlen verworfen, weil sie nicht auf die Kamera treffen, und somit das Rendering rechnerisch undurchführbar machen.
Lösung des Problems
Ich denke, was Sie fragen, ist: Wo soll die Kamera platziert werden? Wenn Sie die Brennweite Ihres Objektivs kennen (d. h. den Abstand hinter dem Objektiv, in dem parallel einfallende Strahlen fokussiert werden), ist es einfach, das Sichtfeld zu kennen und die Kamera so zu platzieren, dass die Szene korrekt gerahmt ist. Das fragst du?
Wenn ja, berechnen Sie diese Schnittpunktentfernung und der Rest ergibt sich.
Keine Kommentare:
Kommentar veröffentlichen