Система координат плоского затенения

Может кто-то, пожалуйста, направьте меня по ссылке, где я смог бы решить такой вопрос, поскольку это экзаменационный вопрос, и я хотел бы сначала попробовать его, прежде чем просить о решении.

Рассмотрим треугольную грань из трех вершин A (0,2, -1), B(1,0,1) и начала координат O, а нормальные векторы в вершинах равны nA=(0,1,0), nB=(1,0,0) и nO=(0,0,1) соответственно. Падающий свет имеет белый цвет и направлен в направлении L=(1,2,2), а интенсивность равна 1, интенсивность фонового окружающего света равна 0,1, а коэффициенты диффузного отражения для (красного, зеленого, синего) равны (0,6,0.7,0.8). Нет необходимости отражать световой вклад.

а) Найдите значения интенсивности (красный, зеленый, синий) на лице, используя плоскую штриховку в центре лица.

Спасибо

1 ответ

Комментарий BeyelerStudios рассказывает все, что вам нужно знать. Но я чувствую, что вы новичок в этой области, так что вот еще немного информации:

  1. определения

    Позвольте иметь треугольную грань, определяемую его 3 вершинами (v0,v1,v2) и нормальные n0,n1,n2). Пусть источник света направлен на вектор света light, Свет имеет внешнюю и направленную части с (r,g,b) цвета: col_dir=(1.0,1.0,1.0) а также col_amb=(0.1,0.1,0.1), Коэффициент отражения поверхности col_face=(0.6,0.7,0.8), Вы хотите получить цвет пикселя для центральной точки треугольника.

  2. вычисление normal в точке интереса

    Чтобы отобразить произвольную точку интереса, вы можете использовать барицентрические координаты (так как вы вычисляете это на бумаге, в таком случае лучше).

    лицо треугольника

    Но в вашем случае точка является центральной, поэтому нормаль - это всего лишь среднее из 3 нормалей:

    n=(n0+n1+n2)/3.0
    

    Если я правильно помню, в случае произвольной точки в барицентрических координатах (u,v,w=1-u-v) это было бы так:

    n=u*n0 + v*n1 + w*n2 
    
  3. вычисление cos(angle) между normal и к light вектор

    Для этого легко использовать точечное произведение (хотя оба вектора имеют единичный размер... нормализовано):

    cos(angle) = (n.x*light.x)+(n.y*light.y)+(n.z*light.z)
    

    Если ваши векторы не нормализованы, вам нужно разделить результат на их размер.

    cos(angle) = ( (n.x*light.x)+(n.y*light.y)+(n.z*light.z) ) / (|n|*|light|)
    
  4. вычислить цвет

    Это также легко:

    color = col_face * ( col_dir*cos(ang) + col_amb )
    

    Не забудьте обработать негатив cos(ang), Поведение зависит от вашей реализации. иногда используется max(0.0,cos(ang)) в других случаях |cos(ang)|,

[Заметки]

Если вам интересно, как движки рендеринга справляются с интерполяциями, посмотрите

Другие вопросы по тегам