2013-07-23 2 views
1

Я создаю легкий симулятор в 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 

Current rendering

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

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

ответ

0

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

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

+0

Датчик находится в том же месте, что и камера-обскура, когда я использовал обычный трафарет для рендеринга, рендеринговое изображение подтверждает, что размещение камеры по крайней мере ОК. Я подозреваю, что объектив и/или датчик могут быть слишком большими, что приводит к тому, что глубина поля настолько узкая, что почти вся сцена размывается. Источник света не должен выглядеть настолько большим, что это всенаправленный точечный свет. – Betamos

+0

Если вы использовали истинную модель обскуры (т. Е. Лучи прослеживаются через отверстие и изображение отображается UPDIDE DOWN), то кривизну линзы (или показатель преломления) следует настраивать так, чтобы ее фокусное расстояние было таким же, как и расстояние от отверстия до плоскости изображения. Затем поместите объектив, где был один просвет. Чтобы сфокусироваться, либо переместите объектив к объекту, либо просто уменьшите размер объектива (фактически, подняв виртуальный f/стоп). Здесь можно поучиться несколько минут с увеличительным стеклом и линейкой, или с любой ручной фокусировочной камерой, такой как зеркальная фотокамера или дальномер. – bjorke

Смежные вопросы