Самоучитель по 3dsmax 7

         

Еще надо отметить, что обычно объекты непрозрачны и поэтому преломлением пренебрегают


Еще надо отметить, что обычно объекты непрозрачны и поэтому преломлением пренебрегают.

Алгоритм работы функции трассировки луча с началом o = (ox,oy,oz) и направлением d = (dx,dy,dz), возвращающей, кстати, освещенность по всем трем цветовым компонентам, будет, таким образом, выглядеть примерно так:

  • ищем ближайшее пересечение луча со сценой (определяем точку p, где произошло пересечение, выясняем, с каким конкретно объектом оно произошло)

    • если не нашли, возвращаем 0

    • если пересечение есть, текущую освещенность полагаем равной фоновой освещенности (ambient)

  • определяем вектор n, нормаль к объекту в точке пересечения

  • для кажого (точечного) источника света

    • считаем вектор l, соединяющий источник и точку p (начало в p)

    • ищем пересечение луча с началом в точке p и направлением d со сценой

      • если нашли, прекращаем обработку этого источника, так как его не видно

    • считаем симметричный l относительно n вектор r

    • считаем по уравнению Фонга (оно использует n, l, r, d) освещенность в точке за счет этого источника света, добавляем ее к текущей

  • считаем симметричный d относительно n вектор refl, то есть отраженный вектор

  • трассируем отраженный луч (с началом p и направлением refl), добавляем полученную освещенность к текущей

  • считаем направление преломленного луча (вектор refr) по d, n и коэффициентам преломления

  • трассируем преломленный луч (с началом p и направлением refr), добавляем полученную освещенность к текущей

  • покомпонентно умножаем текущую освещенность на цвет объекта

  • если для материала, заполняющего пройденную лучом от o до p трассу beta != 0, умножаем текущую освещенность на коэффициент ослабления

  • возвращаем текущую освещенность

При стандартной камере, которая находится в (0,0,-dist), и ориентирована так, что пикселу экрана (sx,sy) соотвествует 3D-точка (sx-xSize/2, ySize/2-sy, 0), для получения цвета пиксела (sx,sy), очевидно, достаточно оттрассировать луч, положив при этом

ox = oy = dz = 0,
oz = -dist,
dx = sx - xSize / 2,
dy = ySize / 2 - sy.

Содержание раздела