Форум программистов, компьютерный форум, киберфорум
Delphi: Графика, звук, видео
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
2 / 2 / 1
Регистрация: 23.05.2011
Сообщений: 34
1

Метод Фонга и Гуро (Gouraud shading и Phong shading)

20.06.2013, 20:38. Показов 3295. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Привет всем. Нужно нарисовать тор и затенить его двумя методами(Фонга и Гуро). Тор у меня состоит из множества треугольников, которые я закрасил на первое время через рандом. Скрин прикрепил.
Помогите реализовать затенение методами Фонга и Гуро.
Вот код рисующий эту фигуру, a,b и с это координаты соответствующих вершин треугольников.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
procedure TModel.Draw(w,h:Integer);
var
  i:Integer;
  a,b,c:TPoint;
  r:Integer;
begin
  with bmp do
  begin
    Width:=w;
    Height:=h;
    with Canvas do
    begin
      Brush.Color:=clBtnFace;
      Rectangle(0,0,w,h);
    end;
    if arr2.hsize>0 then
    begin
    hh:=1;
      i:=-3;
      arr2.Sort;
      while i<arr2.hsize-3 do
      begin
        i:=i+3;
        a.X:=Floor(arr2.arr[i,0]);
        a.Y:=Floor(arr2.arr[i,1]);
        b.X:=Floor(arr2.arr[i+1,0]);
        b.Y:=Floor(arr2.arr[i+1,1]);
        c.X:=Floor(arr2.arr[i+2,0]);
        c.Y:=Floor(arr2.arr[i+2,1]);
        begin
            randomize;
            r:=random(255);
            Canvas.Brush.Color:=RGB(r,r,r);
            Canvas.Pen.Color:= RGB(r,r,r);
            Canvas.Polygon([a,b,c]);
          with Canvas do
          begin
            MoveTo(a.X,a.Y);
            LineTo(b.X,b.Y);
            LineTo(c.X,c.Y);
            LineTo(a.X,a.Y);
          end;
        end;
      end;
    end;
  end;
  cvs.Draw(0,0,bmp);
end;
Изображения
 
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.06.2013, 20:38
Ответы с готовыми решениями:

Использование shading interp для pcolorm
Проблема следующая : Рисую карту северного полюса в нужных мне осях и наношу нужную мне величину ...

C/C++, OpenGL+Shading, Game(Soft)Dev, StartUp
Всем доброго времени, Вам должно быть показался странным заголовок состоящий из тегов, но он почти...

Построение поверхности Matlab plot3, mesh, surfl , colormap, meshgrid, shading
z=sin(х)/(х2+у2+0.3) при х,у Î . вбиваю формулу выдаёт ошибку Добавлено через 5 минут &gt;&gt;...

Метод Фонга, ошибка 'pDC' : undeclared identifier
помогите пожалуйста ошибка: PhongView.cpp(141) : error C2065: 'pDC' : undeclared identifier //...

2
2 / 2 / 1
Регистрация: 23.05.2011
Сообщений: 34
20.06.2013, 22:29  [ТС] 2
Фонг:http://www.mari-el.ru/mmlab/ho... n11/4.html
Гуро:http://www.mari-el.ru/mmlab/ho... n11/3.html

Добавлено через 1 час 45 минут
Гуро помоему будет так:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
procedure TModel.Draw(w,h:Integer);
var
  i:Integer;
  a,b,c:TPoint;
  r:Integer;
  ax,ay,az,bx,by,bz,nx,ny,nz,d,hh:Extended;
begin
  with bmp do
  begin
    Width:=w;
    Height:=h;
    with Canvas do
    begin
      Brush.Color:=clBtnFace;
      Rectangle(0,0,w,h);
    end;
    if arr2.hsize>0 then
    begin
    hh:=1;
      i:=-3;
      arr2.Sort;
      while i<arr2.hsize-3 do
      begin
        i:=i+3;
        a.X:=Floor(arr2.arr[i,0]);
        a.Y:=Floor(arr2.arr[i,1]);
        b.X:=Floor(arr2.arr[i+1,0]);
        b.Y:=Floor(arr2.arr[i+1,1]);
        c.X:=Floor(arr2.arr[i+2,0]);
        c.Y:=Floor(arr2.arr[i+2,1]);
        ax:=arr2.arr[i,0];
        ay:=arr2.arr[i,1];
        az:=arr2.arr[i,2];
        bx:=arr2.arr[i+1,0];
        by:=arr2.arr[i+1,1];
        bz:=arr2.arr[i+1,2];
        nx:=ay*bz-az*by;
        ny:=az*bx-ax*bz;
        nz:=ax*by-ay*bx;
        d:=sqrt(nx*nx+ny*ny+nz*nz);
        nx:=nx/d;
        nx:=Abs(nx);
        r:=Round(nx*255);
        r:=Abs(r);
        if r>255 then r:=255;
        r:=255-r;
        begin
            Canvas.Brush.Color:=RGB(r,r,r);
            Canvas.Pen.Color:= RGB(r,r,r);
            Canvas.Polygon([a,b,c]);
          with Canvas do
          begin
            MoveTo(a.X,a.Y);
            LineTo(b.X,b.Y);
            LineTo(c.X,c.Y);
            LineTo(a.X,a.Y);
          end;
        end;
      end;
    end;
  end;
  cvs.Draw(0,0,bmp);
end;
0
4165 / 1817 / 216
Регистрация: 06.10.2010
Сообщений: 4,074
02.07.2013, 13:13 3
Если использовать GDIGradientFill - можно замутить повершинное освещение. Будет выглядеть лучше.

Добавлено через 2 минуты
Трехмерное вращение тора с фонг-затенением
0
02.07.2013, 13:13
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.07.2013, 13:13
Помогаю со студенческими работами здесь

Быстрое затенение Фонга
Здравствуйте. Мне нужно реализовать затенение фигуры методо Гуро или Фонга, мне второй показался...

Реализация метода Гуро
Здравствуйте! Горит задание... Суть в реализации метода Гуро на примере простейших 3D объектах, С++...

Как выбираются коэффициенты в модели Фонга?
Загружаю модель из .obj + .mtl Использую OpenGL 4.3 Хочу реализовать стандартную модель освещения...

Заливка Гуро и визуализация алгоритма Прима
Добрый вечер,не могли бы вы помочь: необходимо код программы заливки Гуро и визуализация алгоритма...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru