Fisheye камера

Да се добави опция към стандартната камера, която я превръща в камера тип "рибешко око" (fisheye). Фото-обективите тип "рибешко око" имат силно бъчвообразно изкривяване (което е постигнато напълно целенасочено), и ефектът прилича на това, което може да видите, когато гледате през шпионка.

Ето и как ще симулираме ефекта. Ще си представим, че сме разположили идеално отразяваща сфера в (0, 0, 0), с радиус 1. На някакво разстояние от нея (това разстояние е параметър - fishDist, например fishDist = 2), сме разположили обикновена правоъгълна камера. За да сме в съзвучие с досегашната канонична ориентация на камерата при yaw, pitch, roll = 0, то правоъгълната камера трябва да разположим някъде по Oz оста, и тя трбява да гледа в посока -Z.
Генерирането на лъчи става по следния начин. Когато искаме да генерираме лъч за пиксела (x, y), то генерираме лъч от правоъгълната камера, както и досега. Този лъч пресичаме със сферата. Ако лъчът пресича сферата, намираме отразения лъч спрямо сферата и неговата посока ползваме за посока на "истинския" лъч, който пуска fisheye камерата. За начало на този истински лъч пък ползваме Camera::pos, както и досега.

Трябва да се справите със следните трудности:
1) Някои от лъчите може да не улучат сферата (при fishDist = 2, това се получава приблизително при fov > 60 градуса). Когато се случи това, трябва да маркирате връщаният Ray по специален начин, така че raytrace да не процедира с него, а да върне черно (вижте примерите)
2) Трябва да поддържате посоките yaw, pitch и roll, както и aspect ratio и fov на камерата. aspectRatio и fov се отнасят за оригиналната правоъгълна камера, така че те не са проблем. За да поддържате yaw, pitch и roll ъглите (в съзвучие с нормалната правоъгълна камера), трябва да завъртите получаваните след отражението посоки по подходящ начин (указание: можете да си създадете ротационна матрица, като умножите съответните ротационни матрици за yaw, pitch и roll в подходящ ред; след това, оправянето на посоката на лъчите се свежда до просто умножение Matrix * Vector с отразения от сферата лъч).
3) Трябва да се погрижите ориентацията на получаваната картинка да е в съзвучие с получаваната от правоъгълната камера (вижте примерите).

В класа Camera вкарайте параметрите fisheye и fishDist, които да могат да се задават от scene файла. fishDist по подразбиране да е 2.0.

При правилна реализация, ще получите следните картинки:
1. meshes, fov = 90, fishDist =2
2. meshes, fov = 65, fishDist = 2
3. boxed, fov = 65, fishDist = 2

Задачата носи 15 точки. Ако не реализирате поддръжката на yaw, pitch и roll ротациите, взимаме 5т.

Comments

canonic camera

Търсейки из кода забелязах че наща камера се завърта с една матрица, после се транслира с pos вектора от scene файла. Въпроса ми е кой от member-ите на камерата държи ориентацията и за да я направя да гледа към -Z в каноничното пространство?

Лекция 4

В презентацията за лекция 4 е споменато, че камерата е в 0,0,0 и гледа в посока +z. Въпроса по скоро е кой code chunk в camera.cpp реализира описания в лекцията модел. Или кой chunk сетва началната позиция на камерата и rendering sheet (grid) - a?

Началното сетване на upLeft,

Началното сетване на upLeft, upRight и downLeft в Camera::beginFrame. Те се задават като абсолютни координати в равнината Z = +1. Само сменянето на -1 няма да свърши работа, разбира се, тъй като така кадърът ще е flip-нат хоризонтално.

местене на сцената

Създаването на отражателна сфера в (0,0,0) няма ли да изисква цялата сцена да бъде нагласена така че да може да бъде отразена от сферата ?

Друга е идеята

Не, то не е такава идеята. Трябва да реализираш вариант на Camera, който си "представя", че съществува такава сфера, без тя реално да се създава в сцената. Т.е. можеш да си създаваш в твоята Camera един instance на Sphere (или просто да копираш кода на Sphere::intersect), но не трябва тази сфера да се вкарва в scene.geometries!
Другояче казано - искаме вариант на Camera, който излъчва правилните лъчи като за fisheye камера директно.