Система координат плоского затенения
Может кто-то, пожалуйста, направьте меня по ссылке, где я смог бы решить такой вопрос, поскольку это экзаменационный вопрос, и я хотел бы сначала попробовать его, прежде чем просить о решении.
Рассмотрим треугольную грань из трех вершин 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 рассказывает все, что вам нужно знать. Но я чувствую, что вы новичок в этой области, так что вот еще немного информации:
определения
Позвольте иметь треугольную грань, определяемую его 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)
, Вы хотите получить цвет пикселя для центральной точки треугольника.вычисление
normal
в точке интересаЧтобы отобразить произвольную точку интереса, вы можете использовать барицентрические координаты (так как вы вычисляете это на бумаге, в таком случае лучше).
Но в вашем случае точка является центральной, поэтому нормаль - это всего лишь среднее из 3 нормалей:
n=(n0+n1+n2)/3.0
Если я правильно помню, в случае произвольной точки в барицентрических координатах
(u,v,w=1-u-v)
это было бы так:n=u*n0 + v*n1 + w*n2
вычисление
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|)
вычислить цвет
Это также легко:
color = col_face * ( col_dir*cos(ang) + col_amb )
Не забудьте обработать негатив
cos(ang)
, Поведение зависит от вашей реализации. иногда используетсяmax(0.0,cos(ang))
в других случаях|cos(ang)|
,
[Заметки]
Если вам интересно, как движки рендеринга справляются с интерполяциями, посмотрите