Проектирование и позиционирование объектива и сенсора для симулятора света, трассировщик лучей

Я создаю симулятор света на C++ для 3D-сцены (пока "Корнеллский ящик"). Это проект для курса по графике, который я делаю, и я не стремлюсь сделать его быстро, меня вполне устраивает просто визуализировать одно приличное изображение, даже если это займет несколько часов. Я хочу продемонстрировать глобальное освещение и глубину резкости.

Вместо обычного трассировщика лучей лучи испускаются точечным источником света, отражаются от геометрии в сцене и в конечном итоге попадают на датчик света, который представляет собой прямоугольник в 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

Текущий рендеринг

Виден в основном точечный источник света, несфокусированный.

В идеале я хочу, чтобы примерно половина поля (z между -0,5 и 0,5) была сфокусирована, чтобы можно было увидеть DOF. Мой вопрос: как откалибровать сенсор и линзу, чтобы появилось изображение? Я не думаю, что смогу сделать линзу и сенсор слишком маленькими, тогда почти все лучи будут отброшены, потому что они не попадет в камеру и, таким образом, сделает рендеринг невыполнимым с вычислительной точки зрения.


person Betamos    schedule 23.07.2013    source источник


Ответы (1)


Я думаю, вы спрашиваете: куда поставить камеру? Если вы знаете фокусное расстояние вашего объектива (то есть расстояние за объективом, на котором он будет фокусировать параллельные падающие лучи), то несложно узнать поле зрения и расположить камеру так, чтобы сцена была правильно кадрирована. Это то, что вы спрашиваете?

Если это так, рассчитайте это расстояние пересечения, а остальное встанет на свои места.

person bjorke    schedule 26.07.2013
comment
Датчик находится в том же месте, что и камера-обскура, когда я использовал обычный трассировщик лучей для рендеринга, визуализированное изображение подтверждает, что размещение камеры по крайней мере в порядке. Я подозреваю, что объектив и/или датчик могут быть слишком большими, что приводит к такой малой глубине резкости, что почти вся сцена становится размытой. Источник света не должен выглядеть таким большим, так как это всенаправленный точечный источник света. - person Betamos; 27.07.2013
comment
Если вы использовали настоящую модель точечного отверстия (то есть лучи проходят через точечное отверстие, а изображение визуализируется ВВЕРХ ВНИЗ), то кривизна линзы (или показатель преломления) должна быть настроена так, чтобы ее фокусное расстояние было таким же, как расстояние от отверстия до плоскости изображения. Затем поместите линзу туда, где когда-то была дырочка. Чтобы сфокусироваться, либо переместите объектив к объекту, либо просто уменьшите размер объектива (по сути, увеличьте виртуальную диафрагму). Несколько минут с увеличительным стеклом и линейкой или любой камерой с ручной фокусировкой, такой как зеркальная или дальномерная, могут быть здесь поучительны. - person bjorke; 29.07.2013