Как я могу решить проблему света в трассировке лучей? - PullRequest
0 голосов
/ 16 апреля 2019

Я делаю изображение с использованием Python.Но затенение по Ламберту не работает.

Сначала изображение сохраняется таким образом. введите описание изображения здесь

Но когда я перевернул нормальный вектор сферы, изображение сохраняется следующим образом. введите описание изображения здесь

Этомой код затенения.

v = -m*ray

if s == 'Sphere':
    n = view.viewPoint - list[idx].c - v
    n =  -n / np.sqrt(np.sum(n*n))

for i in light:
    l_i = v + i.position - view.viewPoint
    l_i = l_i / np.sqrt(np.sum(l_i * l_i))

 x = list[idx].s.d[0] * i.intensity[0] * max(np.dot(l_i, n), 0)
 y = list[idx].s.d[1] * i.intensity[1] * max(np.dot(l_i, n), 0)
 z = list[idx].s.d[2] * i.intensity[2] * max(np.dot(l_i, n), 0)

list - это список сфер, а idx - номер ближайшей сферы.Буду благодарен, если кто-нибудь сможет мне помочь.Я занимаюсь этим уже неделю

1 Ответ

0 голосов
/ 29 апреля 2019

Вы не указали, что считаете неправильным.Где свет относительно сфер на первом изображении?Это выше и немного позади них?Если так - изображение выглядит правильно.Если предположить, что приведенные выше утверждения верны, то второе изображение выглядит правильно.Причина, по которой свет находится в нижней части сфер, заключается в том, что нормаль теперь указывает «внутрь», поэтому знак продукта точки () будет противоположен знаку на первом изображении.Обратите внимание, что в вашем примере кода не похоже, что у вас есть лечение теневыми лучами.Другими словами - все объекты будут освещены так, как если бы все остальные объекты были прозрачными.Никакие объекты не будут отбрасывать тени на другие объекты.Это также объясняет, почему вы можете видеть дно сфер, когда свет идет сверху.Если бы у вас были правильные теневые лучи, то на самом деле не имело бы значения, куда указывает нормаль (я бы удалил функции max () в этой точке).

...