Форум программистов, компьютерный форум, киберфорум
Наши страницы

Delphi: графика, звук, видео

Войти
Регистрация
Восстановить пароль
 
iRubbick
0 / 0 / 0
Регистрация: 04.10.2015
Сообщений: 18
#1

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

03.01.2018, 20:36. Просмотров 116. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Правильные нормали текстур освещения для куба (Delphi):

Посчитать нормали для куба - OpenGL
Как посчитать нормали для куба? вот например вертексы куба static const GLfloat g_vertex_buffer_data = { -1.0f, 1.0f, 1.0f, ...

Технология освещения и нормали. Не могу разобраться (WebGL) - OpenGL
Изучаю WebGL по книге "WebGL программирование трехмерной графики", вот ссылка на её https://www.ozon.ru/context/detail/id/31239396/. В...

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

ПОМОГИТЕ, не получается вывести ошибки и Правильные/не правильные ответы - JavaScript
А завтра сдавать :cry: <html> html> <head> <title>Тест</title> </head> <h1 align="center"> <font color="# #006400"> <i>Тест...

Гирлянда для освещения - Электроника
Хочу 20 малых ламп на 12в , соединить последовательно и подключить в сеть (для освещения). Нужны ваши советы по поводу пожарной...

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

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

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

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

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

Гладкие нормали для 3ds модели - OpenGL
Пишу ray tracing, в нем загружаю 3ds модель, в итоге имею массив треугольников, вершин и нормалей. Для поиска объекта использую поиск...

Как посчитать нормали для Tess обьекта - OpenGL
У меня есть фигура для которой мне нужно сделать освещение, но я не знаю как для нее считать нормали. Получилось "осветить " только одну...

Уравнение касательной и нормали для плоской кривой - Геометрия
Всем привет, помогите, пожалуйста составить уравнение касательной и нормали для плоской кривой y^3=x^2.


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

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

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