Я создаю легкий симулятор в C++ для 3D-сцены (на данный момент «ящик Корнелла»). Это проект для графического курса, который я делаю, и я не стремлюсь сделать это быстро, просто для того, чтобы сделать один достойный образ в порядке, я даже не считаю, что это занимает много часов. Я хочу продемонстрировать глобальное освещение и DOF.Дизайн и положение объектива и датчика для светового симулятора raytracer
Вместо обычного лучеискателя лучи испускаются от точечного источника света, отскакивают от геометрии сцены и в конечном итоге попадают в датчик освещенности, который представляет собой прямоугольник в 3D-среде, и в зависимости от того, где попадает луч датчик, интенсивность увеличивается для этого пикселя на экране.
Между датчиком и сценой есть объектив, который я пытаюсь правильно спроектировать и правильно позиционировать, чтобы имитировать камеру. Линза также является плоской поверхностью, но нормали (когда луч попадает в линзу и преломляется) вычисляются в соответствии с тонкой сферической линзой.
Моя текущая настройка, которая вытекает из формул для линз и такой я нашел в Википедии:
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
Что рассматривается в основном точечный источник света, не сфокусирован.
В идеале, я хочу, чтобы вокруг половины поля (от -5 до .5) было сфокусировано, чтобы поверхность была видна. Мой вопрос: как я могу откалибровать датчик и объектив, чтобы изображение появилось? Я не думаю, что я могу сделать объектив и датчик слишком маленькими, тогда почти все лучи будут отброшены, потому что они не попадут в камеру и, таким образом, сделают рендеринг вычислительно неосуществимым.
Датчик находится в том же месте, что и камера-обскура, когда я использовал обычный трафарет для рендеринга, рендеринговое изображение подтверждает, что размещение камеры по крайней мере ОК. Я подозреваю, что объектив и/или датчик могут быть слишком большими, что приводит к тому, что глубина поля настолько узкая, что почти вся сцена размывается. Источник света не должен выглядеть настолько большим, что это всенаправленный точечный свет. – Betamos
Если вы использовали истинную модель обскуры (т. Е. Лучи прослеживаются через отверстие и изображение отображается UPDIDE DOWN), то кривизну линзы (или показатель преломления) следует настраивать так, чтобы ее фокусное расстояние было таким же, как и расстояние от отверстия до плоскости изображения. Затем поместите объектив, где был один просвет. Чтобы сфокусироваться, либо переместите объектив к объекту, либо просто уменьшите размер объектива (фактически, подняв виртуальный f/стоп). Здесь можно поучиться несколько минут с увеличительным стеклом и линейкой, или с любой ручной фокусировочной камерой, такой как зеркальная фотокамера или дальномер. – bjorke