Свой рейтрейсер · Шаг 5 из 5
Луч, который отражается
Остался последний штрих, ради которого трассировку лучей и придумали в 1979 году: отражения. Луч, упавший на зеркальный шар, не кончается — он отскакивает и летит дальше, и в шаре видно всё остальное: пол, соседей и даже его собственное отражение в полу. Сколько раз отскакивать, решает глубина.
Что сделать
Найдите яркость луча: что он видит, плюс отражение, — если поверхность блестит и глубина ещё позволяет.
Что приходит
nachaloиnapr— откуда и куда идёт лучglubina— сколько ещё раз луч может отразитьсяuvidet— функция каркаса:uvidet(nachalo, napr)отдаёт словарь о том, что встретил луч
Что вернуть
Число: svet встречи, если blesk равен 0 или glubina — 0; иначе (1 − blesk) · svet + blesk · яркость отражённого луча.
Допишите функцию cvet_lucha в редакторе справа.
Результат верните через return — то, что
напечатано, на проверку не влияет.
с графикой когда тесты пройдут, ответ вашей функции нарисуется · все задачи с графикой
В проекте
Каркас зовёт cvet_lucha для каждой точки картинки с глубиной 3, а uvidet собирает из ваших шагов 1–4. Решите шаг — и в зеркальном шаре и в полу отразится вся сцена.
Луч из (0, 1, -1) идёт вниз-вперёд, (0, -1, 1), и падает на пол-зеркало: svet 0.2, blesk 0.5, нормаль вверх. Отражённый луч (0, 1, 1) уходит в небо яркостью 0.9.
Ответ: 0.5 · 0.2 + 0.5 · 0.9 = 0.55.
В проверке uvidet — игрушечный мир: пол-зеркало внизу и небо наверху.
uvidet(nachalo, napr) возвращает словарь о встрече:
"svet"— яркость самой поверхности от 0 до 1, уже с тенью;"blesk"— доля отражения от 0 до 1; у неба — 0;"tochka"и"normal"— точка встречи и нормаль длиной 1; у неба их нет.
Если blesk равен 0 или glubina равна 0 — ответ svet.
Иначе отражённое направление — r = napr − 2 · (napr · normal) · normal, а ответ — (1 − blesk) · svet + blesk · c, где c — яркость луча из tochka по r с глубиной на 1 меньше, посчитанная так же.
Образцовый тест целиком
def uvidet(nachalo, napr):
if napr[1] < 0:
return {"tochka": (0, 0, 0), "normal": (0, 1, 0), "svet": 0.2, "blesk": 0.5}
return {"svet": 0.9, "blesk": 0}
cvet_lucha((0, 1, -1), (0, -1, 1), 3, uvidet)
0.55
Обсуждение
Вопросов пока нет.
Войдите, чтобы спросить.