Помощь - Поиск - Пользователи - Календарь
Полная версия: Трёхерная графика. Шар
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
art88
Здача:
Изобразить расположенный на поверхности гладкий красный шар(освещённый).
-------------------------------------------------
Проблема:
Думаю, что большую часть этой задачи я решил(см. Globe.pas).
Осталось правильно раскрасить шар.
Вот формула яркоти поверхности
I= kр Iр + kн Iнcos(a)
kр - коэффициент отражения рассеянного света (kд<1);
kн - коэффициент отражения направленного света;
Iр - интенсивность рассеянного света;
Iн - интенсивность падающего света;
а - угол между направлением света и нормалью к поверхности.
I у меня считается, вопрос только в том, как задать оттенки красного.
Пробовал в цикле менять угол от 0 до пи, считать I и делать SetRGBPalette(j, $FF*I, 00, 00), но кроме красного откуда-то берутся и другие цвета.
Помогите пожалуйста!
(Для тех, у кого не читаются комментарии globe.doc)
volvo
Цитата(art88 @ 18.02.2006 14:54) *
Пробовал в цикле менять угол от 0 до пи, считать I и делать SetRGBPalette(j, $FF*I, 00, 00), но кроме красного откуда-то берутся и другие цвета.

Из TP Хелпа по процедуре SetRgbPalette:
Цитата(TP Help)
Restrictions:
SetRGBPalette can be used only with the IBM 8514 driver and the VGA.
У тебя IBM8514?

Насколько я вижу, у тебя вообще 16-цветный режим устанавливается... Как же ты хочешь в нем получить НЕСКОЛЬКО оттенков красного? Попробуй использовать 256-цветный (например, SVGA.BGI)
art88
Ну, хорошо, подключил я SVGA.bgi(Globe2.pas).
А как же мне всё таки быть с раскраской шара? Указанным мною выше способом не получается!
volvo
Посмотрел я твою программу... blink.gif
Цитата(art88 @ 18.02.2006 14:54)
I у меня считается, вопрос только в том, как задать оттенки красного.
blink.gif А что именно у тебя в I считается, ты не задумывался? Ты же сам пишешь, что:

Цитата(art88 @ 18.02.2006 14:54)
I= kр Iр + kн Iнcos(a)
kр - коэффициент отражения рассеянного света (kд<1);
kн - коэффициент отражения направленного света;
Iр - интенсивность рассеянного света;
Iн - интенсивность падающего света;
а - угол между направлением света и нормалью к поверхности.
Это же уравнение Фонга, правда? Но, извини меня, оно "немного" по другому выглядит:
Цитата
ambient = Ka,
diffuse = Kd * cos(N, L),
specular = Ks * pow(cos(R, V), Ns),
intensity = ambient + amp * (diffuse + specular).

где
Ka - коэффициент фоновой интенсивности (характеристика окружающей среды)
Kd - коэффициент рассеяния (характеристика поверхности)
Ks - коэффициент отражения (характеристика поверхности)
Ns - коэффициент вида отражения (характеристика поверхности)
amp - "мощность" источника света
P - рассматриваемая точка
N - нормаль к поверхности изображаемого объекта в точке P
L - вектор, проведенный из точки P в источника света (луч света)
V - вектор, проведенный из точки P в "точку зрения" камеры
R - отраженный луч света (отражение L относительно N)
ambient - "фоновая" освещенность
diffuse - "рассеянная" освещенность
specular - "отраженная" освещенность
intensity - освещенность (суммарная)
cos(A,B) - косинус угла между векторами A и B

Чувствуешь разницу? Ты считал вот так:
I:= Round(k1 + k2*Cosinus(p1));
, где и k1, и k2 заданы константами, а нужно - по вышеприведенной формуле, чтобы все изменялось динамично...
art88
Хорошо, тогда у меня ещё вопрос, где можно найти все требующиеся коэффициенты, и как в итоге получить требуемую раскраску шара.
art88
Я тут уже почти доделал программу, она изображает матовый , освещённый шарик и тень.(см sphere.pas)
-------------
Осталось только добавить блик: раскраска расчитывается по формуле Ламберта (при cos_alfa>0) и к полученному значению Интенсивности добвляется зеркальное отражние(In*km*cos_beta).
beta- угол между направлением отражённого света и направлением в глаз.(см. sp,jpg)
-------------
Помогите доделать последнюю задачу(спасибо Volvo за пирамиду).
cos_beta не правильно считается(см.globe.pas).
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.