Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi: Графика, звук, видео
Войти
Регистрация
Восстановить пароль
 
iRubbick
0 / 0 / 0
Регистрация: 04.10.2015
Сообщений: 18
1

Правильные нормали текстур освещения для куба

03.01.2018, 20:36. Просмотров 165. Ответов 2
Метки нет (Все метки)

У меня все происходит как обычно - через одно место)
Сначала написал примитивную процедуру для рисования куба, затем открыл такую замечательную вещь как glSolidCube, на которой собственно и пытаюсь отрабатывать разные приёмы.

Код рисования куба вручную:

Кликните здесь для просмотра всего текста
Delphi
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
procedure IdBox(var IdTexture : GLuint);
begin
  glEnable(GL_CULL_FACE);
  glCullFace(GL_BACK);
 
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, IdTexture);
glNormal3f( 0.0, 0.5, 0.0);
glBegin(GL_QUADS);
glTexCoord2f(0,0);glVertex3f(0.5,0.5,-0.5);
glTexCoord2f(0,1);glVertex3f(-0.5,0.5,-0.5);
glTexCoord2f(1,1);glVertex3f(-0.5,0.5,0.5);
glTexCoord2f(1,0);glVertex3f(0.5,0.5,0.5);
glEnd;
 
glBindTexture(GL_TEXTURE_2D, IdTexture);
glBegin(GL_QUADS);
glNormal3f( 0.0, 1.0, 0.0);
glTexCoord2f(0,0);glVertex3f(0.5,-0.5,0.5);
glTexCoord2f(0,1);glVertex3f(-0.5,-0.5,0.5);
glTexCoord2f(1,1);glVertex3f(-0.5,-0.5,-0.5);
glTexCoord2f(1,0);glVertex3f(0.5,-0.5,-0.5);
glEnd;
 
glBindTexture(GL_TEXTURE_2D, IdTexture);
glBegin(GL_QUADS);
glNormal3f( 0.0, 1.0, 0.0);
glTexCoord2f(0,0);glVertex3f(0.5,0.5,0.5);
glTexCoord2f(0,1);glVertex3f(-0.5,0.5,0.5);
glTexCoord2f(1,1);glVertex3f(-0.5,-0.5,0.5);
glTexCoord2f(1,0);glVertex3f(0.5,-0.5,0.5);
glEnd;
 
glBindTexture(GL_TEXTURE_2D, IdTexture);
glBegin(GL_QUADS);
glNormal3f( 0.0, 1.0, 0.0);
glTexCoord2f(0,0);glVertex3f(0.5,-0.5,-0.5);
glTexCoord2f(0,1);glVertex3f(-0.5,-0.5,-0.5);
glTexCoord2f(1,1);glVertex3f(-0.5,0.5,-0.5);
glTexCoord2f(1,0);glVertex3f(0.5,0.5,-0.5);
glEnd;
 
glBindTexture(GL_TEXTURE_2D, IdTexture);           //left side
glBegin(GL_QUADS);
//glNormal3f( 0.0, 1.0, 0.0);
glTexCoord2f(0,0);glVertex3f(-0.5,0.5,0.5);
glTexCoord2f(0,1);glVertex3f(-0.5,0.5,-0.5);
glTexCoord2f(1,1);glVertex3f(-0.5,-0.5,-0.5);
glTexCoord2f(1,0);glVertex3f(-0.5,-0.5,0.5);
glEnd;
 
glBindTexture(GL_TEXTURE_2D, IdTexture);       //right side
glBegin(GL_QUADS);
//glNormal3f( 0.0, 1.0, 0.0);
glTexCoord2f(0,0);glVertex3f(0.5,0.5,-0.5);
glTexCoord2f(1,0);glVertex3f(0.5,0.5,0.5);
glTexCoord2f(1,1);glVertex3f(0.5,-0.5,0.5);
glTexCoord2f(0,1);glVertex3f(0.5,-0.5,-0.5);
glEnd;
glDisable(GL_CULL_FACE);
end;

результат:
Правильные нормали текстур освещения для куба

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

Теперь про glSoliCube.
Первый куб на скрине желтого цвета - попытка забиндить текстуру на дефолтный кубик. Но в его процедуре не описаны нормали, поэтому для цвета берется только первый пиксель, тем самым "выдав на гора" желтый цвет.
Попытка модифицировать glSoliCube:
Кликните здесь для просмотра всего текста
Delphi
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
64
65
66
67
procedure DrawIdBox(Size : GLfloat; IdTex : GLuint; DrawType : GLenum);
{ ïðîöåäóðГ* Г·ГҐГ±Г*Г® ñïèñæåГ*Г* Гі DGLUT }
{Size - Г°Г*çìåð}
{IdTex - èìÿ Г§Г*ãðóæåГ*Г*îé òåêñòóðû}
{Draw type - GL_QUADS èëè QL_TRIANGLES}
var
  V : array[0..7, 0..2] of GLfloat;
  I : GLint;
  HalfSize : GLfloat;
begin
  HalfSize := Size / 2;
  //îòêëþ÷èì îòîáðГ*æåГ*ГЁГҐ ГўГ*óòðåГ*Г*ГЁГµ ГЈГ°Г*Г*ГҐГ©
  //äëÿ Г¤Г*Г*Г*îãî áîêñГ*
  glEnable(GL_CULL_FACE);
  glCullFace(GL_BACK);
 
  glEnable(GL_TEXTURE_2D);
  glEnable(GL_TEXTURE_GEN_S); //enable texture coordinate generation
  glEnable(GL_TEXTURE_GEN_T);
  glBindTexture(GL_TEXTURE_2D, IdTex);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
  V[0, 0] := -HalfSize;
  V[1, 0] := -HalfSize;
  V[2, 0] := -HalfSize;
  V[3, 0] := -HalfSize;
  V[4, 0] := HalfSize;
  V[5, 0] := HalfSize;
  V[6, 0] := HalfSize;
  V[7, 0] := HalfSize;
  V[0, 1] := -HalfSize;
  V[1, 1] := -HalfSize;
  V[4, 1] := -HalfSize;
  V[5, 1] := -HalfSize;
  V[2, 1] := HalfSize;
  V[3, 1] := HalfSize;
  V[6, 1] := HalfSize;
  V[7, 1] := HalfSize;
  V[0, 2] := -HalfSize;
  V[3, 2] := -HalfSize;
  V[4, 2] := -HalfSize;
  V[7, 2] := -HalfSize;
  V[1, 2] := HalfSize;
  V[2, 2] := HalfSize;
  V[5, 2] := HalfSize;
  V[6, 2] := HalfSize;
 
for I := 0 to 5 do
  begin
    glBegin(DrawType);
    glTexCoord2f(0,0);
    glTexCoord2f(1,0);
    glTexCoord2f(1,1);
    glTexCoord2f(0,1);
      glNormal3fv(@BoxPoints[I, 0]);
      glVertex3fv(@V[BoxFaces[I, 0], 0]);
      
      glVertex3fv(@V[BoxFaces[I, 1], 0]);
      glVertex3fv(@V[BoxFaces[I, 2], 0]);
      glVertex3fv(@V[BoxFaces[I, 3], 0]);
 
  glEnd;
  end;
  glDisable(GL_Texture_Gen_S);
  glDisable(GL_Texture_Gen_T);
  glDisable(GL_CULL_FACE);
end;


Результат:
Правильные нормали текстур освещения для куба


Грани есть, нормали есть, но блин, текстура к ним нифига не привязана и ездит как то по своим правилам, непонятным никому... Как камеру повернешь, так она и катается.

Задача следующая - либо научится правильно расчитывать нормали для текстур на полигонах, либо привязать её к граням во второй процедуре. Как это сделать - ума не приложу.
Заранее благодарен)
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.01.2018, 20:36
Ответы с готовыми решениями:

Алгоритм автоматического распределения текстур по карте для игры типа Героев 3
Здравствуйте! Недавно захотелось написать игру похожую на герои 3, начал с...

Посчитать нормали для куба
Как посчитать нормали для куба? вот например вертексы куба static const...

Технология освещения и нормали. Не могу разобраться (WebGL)
Изучаю WebGL по книге "WebGL программирование трехмерной графики", вот ссылка...

Тестер. Как выделить правильные ответы зелёным, а не правильные красным?
Здравствуйте программисты!! у меня такая проблема. Как можно сделать в режиме...

ПОМОГИТЕ, не получается вывести ошибки и Правильные/не правильные ответы
А завтра сдавать :cry: <html> html> <head> <title>Тест</title> </head>...

2
iRubbick
0 / 0 / 0
Регистрация: 04.10.2015
Сообщений: 18
03.01.2018, 22:23  [ТС] 2
С первой процедурой вопрос решен, конечно несколько подзаморочился с рисованием осей и подгонкой по ним сторон, но теперь все ок.

Правильные нормали текстур освещения для куба


Остался вопрос со второй процедурой, т.к. желательно бы иметь на борту конструктор подобного типа, который сможет просчитать нормали для всех поликов+ накинуть шкурки.
0
murderer
3321 / 1467 / 134
Регистрация: 06.10.2010
Сообщений: 3,230
05.01.2018, 12:42 3
желательно бы иметь на борту конструктор подобного типа, который сможет просчитать нормали для всех поликов+ накинуть шкурки.
Возьми любой 3D-редактор.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.01.2018, 12:42

Гирлянда для освещения
Хочу 20 малых ламп на 12в , соединить последовательно и подключить в сеть...

Измеритель уровня освещения для цифровых часов
Хочу сделать электронные часы со светодиодными индикаторами. Подсмотрел дизайн...

ZigBee датчики для измерения освещения и влажности в комнате
Ребята, посоветуйте хорошие датчики для измерение освещения и влажности в...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru