ДР 2013/10/Група3
- Forums:
"Умен" автофокус
Досега в сценовите файлове се разчиташе, че когато имаме DOF, ще задаваме разстоянието до фокусната равнина ръчно, чрез параметъра focalPlaneDist.
Това е досадно, затова ще искаме да реализираме следният автофокус, по подобие на огледално-рефлексните фотоапарати.
Използвайте сцената testmesh.trinity. Тя в момента има зададена фокусна равнина на 300 единици (this is SPARTAA!). Разкарайте това свойство от сцената. Добавете ново булево свойство autofocus на камерата. Ако то е true, в края на Camera::frameBegin() оценете разстоянието до обектите на сцената, като изстреляте и проследите 5 лъча:
- В центъра на кадъра
- 15% наляво от центъра
- 15% нагоре от центъра
- 15% надясно от центъра
- 15% надолу от центъра
Всеки от тези 5 лъча проследете (чрез итериране на scene.nodes масива) и определете на какво разстояние е най-близкият обект. Вземете получтените 5 числа за разстоянията. Част от тях може да са безкрайност (лъчите не са ударили нищо). Тях ги изхвърлете, ползвайте само не-безкрайните стойности. От тях намерете медианата (ако са нечетен брой числа - вземете средното от сортирания списък; ако са четен - вземете средно-аритметично от двете средни). Въпросната медиана ползвайте за focalPlaneDist.
Направете вашата функционалност да се хвали, като печата с cout или printf какво разстояние е намерил автофокуса
След направените корекции би следвало в сцената testmesh.trinity да подбере подобно разстояние (300 или малко повече единици). Пробвайте решението си и върху други сцени.