![]() |
Красный матовый шар, освещённый солнцем... [ПАСКАЛЬ]
Суть задачи такова:
нужно построить красный матовый шарик, освещённый вектором света. Проблема в том, что светлое место на шарике должно переходить в полутень, а потом в тень плавно. Но линии начала полутени и тени изогнуты по-разному (надо сделать так, чтобы они были изогнуты одинаково). И, кроме того, при некоторых координатах, линия тени, идущая по экватору шара, становится не круглой (почти треугольной). Это тоже надо исправить. Вот уже написанный текст программы на Паскале: Код:
Program graph2; {310 190} |
Вложений: 1
1. Возможно дело в квантизации (неравномерная изогнутость линий). То есть заметен переход от RGB(10,10,10) к RGB(11,11,11), Такой же эффект может возникнуть при округлении (при целочисленной арифметике особенно).
2. Проверь ограничение значения косинуса угла между освещающим вектором и нормалью поверхности. Он может принимать отрицательные значения (как бы освещение изнутри). Влияет на появление артефактов освещения в тени. 3. Проверь ограничения на попадание в шар (при сканировании картинки) - освещение вне шара 4. В аттачменте примерно так оно работает (сделано в математике 4.0) Понимаю, что текст математики выглядит мягко говоря непонятно... Если есть вопросы - охотно объясню. |
1) Если так, как можно исправить?
2) Для отрицательных косинусов значению косинуса присваивается нуль, это я учёл. 3) Не понял... 4) В идеале линия разделения света и тени должна проходить чётко по экватору шарика, на картинке далеко не так... А текст там и правда не слишком понятный >< |
Вложений: 2
1) Можно использовать диферинг, то есть добавить в цвет шумовую составляющую с разбросом 1-2 значения интенсивности. Глаз "сгладит" соседние пиксели по среднему и получится эффект более плавных переходов.
3) я пробегал каждый пиксель картинки и вычислял в нём 3-мерную нормаль к поверхности. Там, где поверхности нет (вне шара) - за нормаль был принят нулевой вектор. 4) Линия и так чётко по экватору, просто надо помнить, что мы видим проекцию, то есть экватор (круг) вырождается в эллипс или отрезок. Для пояснения переделал в линейную функцию рассеяния (чтобы лучше было видно границу на экваторе, перекрасил в красный цвет и сделал несколько кадров с разными углами освещения). |
Вложений: 1
Без отражения (то есть чисто за счёт матового рассеяния во все стороны) выглядит неестественно, добавляем отражение (будем считать что освещение идёт от бесконечного белого размазанного пятна, расположенного на расстоянии бесконечности)
1. считаем что матовое рассеяние идёт линейно n1.light, где n1 - нормаль к поверхности, light - направление падающей волны, точка - скалярное произведение. 2. считаем что пятно света с учётом всех эффектов даёт экспоненциальную функцию рассеяния. Отражённый луч вычисляем так: reflect1 = light - n1 (2(n1.light)). На экран попадает только его положительно направленная проекция на ось z, то есть reflect = Max[0,reflect1.{0,0,-1}] |
Время: 13:37. |
Время: 13:37.
© OSzone.net 2001-