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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.68
veter48
0 / 0 / 0
Регистрация: 09.11.2008
Сообщений: 87
#1

OpenGL и материалы - C++

20.04.2012, 16:18. Просмотров 3055. Ответов 13
Метки нет (Все метки)

Здравствуйте. Есть программа:
C++
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#include <GL/glut.h> 
 
static int kv= 1;
static int kd = 1;
 
void reshape(int w, int h)
{
    glViewport(0, 0, w, h);
    
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0, w, 0, h);
    
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}
 
static void key(unsigned char key, int x, int y)
{
    switch (key) 
    {
        case 27 : 
        case 'q':
            exit(0);
            break;
 
        case '+':
            if (kv < 75 & kd < 75) 
            {
             kv += 1;
             kd += 1;
            }
            break;
 
        case '-': 
            if (kv > -5 & kd > -5) 
            {
             kv -= 1; 
             kd -= 1; 
            }
            break;
    }
 
    glutPostRedisplay();
}
 
 
void display()
{
 
    glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glClear(GL_COLOR_BUFFER_BIT);
    
    glBegin(GL_POLYGON);
    glColor3f(0.0, 0.0, 1.0);
    glVertex2i(150 - kv,300);
    glVertex2i(200, 250-kv);
    glVertex2i(300+kv, 300);
    glVertex2i(275, 350+kv);
    glVertex2i(200, 350+kv);
    glEnd();
    
 
    
    glBegin(GL_POLYGON);
    glColor3f(0.0, 0.0, 1.0);
    glVertex2i(450-kd, 300);
    glColor3f(0.0, 1.0, 0.0);
    glVertex2i(500, 250-kd);
    glColor3f(1.0, 0.0, 1.0);
    glVertex2i(600, 250-kd);
    glColor3f(1.0, 1.0, 0.0);
    glVertex2i(610+kd,260);
    glColor3f(1.5, 0.5, 0);
    glVertex2i(575, 350+kd);
    glColor3f(0.0, 1.0, 1.0);
    glVertex2i(500, 350+kd);
 
    glEnd();
    
    glutSwapBuffers();
}
 
 
 
int main (int argc, char * argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
    glutInitWindowSize(800, 600);
    glutInitWindowPosition(100,100);
    glutCreateWindow("Lab Darbs1");
    glutKeyboardFunc(key);
    glClearColor(1,1,1,1);
    
    glutReshapeFunc(reshape);
    glutDisplayFunc(display);
    
    glutMainLoop();
    
    return 0;
}
И надо сделать так чтоб многоугольники выглядели как стекло. Помогите хоть как начать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.04.2012, 16:18
Здравствуйте! Я подобрал для вас темы с ответами на вопрос OpenGL и материалы (C++):

Материалы по STL - C++
добрый день, столкнулся с такой проблемой. Пытаюсь разобраться с STL, в книжках все красиво гладко, но когда сталкиваешься с реальными...

Указать материалы, направление - C++
Доброго времени суток, прошу у Вас помощи. Мне нужна программа, которая взаимодействует с браузером. Мне 48 лет, когда то давным давно я...

Материалы для изучения - C++
Подскажите пожалуйста какие-нибудь статьи по ссылкам и указателям.

Нужны материалы для курсовой - C++
Помогите скиньте книги материалы и т.д где можно почитать про ниже сказанное буду очень благодарен Распознавание образов. Основные...

Подкиньте материалы для изучения С++ с нуля - C++
Подкиньте пожалуйста материала для обучения на языке С++ с нуля. Только, чтоб не мудрино было, а так как будто бабушке объясняют, которая...

материалы предназначеные для самостоятельного изучения языка с++ - C++
Внимание: данные материалы предназначены для самостоятельного изучения языка с++ используя Microsoft Visual Studio 2008 и не только,,, ...

13
romex
44 / 44 / 4
Регистрация: 11.04.2010
Сообщений: 223
20.04.2012, 16:24 #2
воспользуйтесь glColor4f. Четвертым параметром идет прозрачность.
0
Nick Alte
Эксперт С++
1639 / 1011 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
20.04.2012, 17:54 #3
У стекла хорошая отражательная способность (надо установить белый цвет реакции на Specular и высокое значение экспоненты блеска) и одновременно слабая реакция на диффузное освещение. Разумеется, надо ещё и установить параметры источника света и вообще настроить работу освещения. Чтобы блеск выглядел нормально, надо пользоваться объектами, составленными из достаточно мелких треугольников.
1
veter48
0 / 0 / 0
Регистрация: 09.11.2008
Сообщений: 87
20.04.2012, 22:01  [ТС] #4
Добавил я источник света, почему объекты не сохраняют свои цвета? И как правильно настроить параметры материалов?

C++
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#include <GL/glut.h> 
 
static int kv= 1;
static int kd = 1;
 
void reshape(int w, int h)
{
    glViewport(0, 0, w, h);
    
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0, w, 0, h);
    
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}
 
static void key(unsigned char key, int x, int y)
{
    switch (key) 
    {
        case 27 : 
        case 'q':
            exit(0);
            break;
 
        case '+':
            if (kv < 75 & kd < 75) 
            {
             kv += 1;
             kd += 1;
            }
            break;
 
        case '-': 
            if (kv > -5 & kd > -5) 
            {
             kv -= 1; 
             kd -= 1; 
            }
            break;
    }
 
    glutPostRedisplay();
}
 
 
void display()
{
       
 
    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  
      
    GLfloat light0_diffuse[] = {1, 1, 1};
    GLfloat light0_direction[] = {0.0, 0.0, 1.0, 0.005};
    glEnable(GL_LIGHT0);
    glLightfv(GL_LIGHT0, GL_DIFFUSE, light0_diffuse);
    glLightfv(GL_LIGHT0, GL_POSITION, light0_direction);
 
 
    glBegin(GL_POLYGON);
    glColor3f(0.0, 0.0, 1.0);
    glVertex2i(150 - kv,300);
    glVertex2i(200, 250-kv);
    glVertex2i(300+kv, 300);
    glVertex2i(275, 350+kv);
    glVertex2i(200, 350+kv);
    glEnd();
    
 
    
    glBegin(GL_POLYGON);
    glColor3f(0.0, 0.0, 1.0);
    glVertex2i(450-kd, 300);
    glColor3f(0.0, 1.0, 0.0);
    glVertex2i(500, 250-kd);
    glColor3f(1.0, 0.0, 1.0);
    glVertex2i(600, 250-kd);
    glColor3f(1.0, 1.0, 0.0);
    glVertex2i(610+kd,260);
    glColor3f(1.5, 0.5, 0);
    glVertex2i(575, 350+kd);
    glColor3f(0.0, 1.0, 1.0);
    glVertex2i(500, 350+kd);
 
    glEnd();
    
    glDisable(GL_LIGHT0);
    
    glutSwapBuffers();
}
 
 
 
int main (int argc, char * argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
    glutInitWindowSize(800, 600);
    glutInitWindowPosition(100,100);
    glutCreateWindow("Lab Darbs 2");
    glutKeyboardFunc(key);
 
 
     glClearColor (1, 1, 1, 1);
 
     glEnable(GL_LIGHTING);
 
     glLightModelf(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
 
     glEnable(GL_NORMALIZE);
 
 
 
    
    glutReshapeFunc(reshape);
    glutDisplayFunc(display);
    
    glutMainLoop();
    
    return 0;
}
0
Nick Alte
Эксперт С++
1639 / 1011 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
21.04.2012, 10:08 #5
Во-первых, источнику света надо настроить не только Diffuse, но и Specular. Не помешает настроить и глобальный Ambient. Во-вторых, надо пользоваться уже не glColor, а glMaterial, для чего попутно включить GL_LIGHTING и выключить GL_COLOR_MATERIAL. Основные компоненты материала настраиваются так же, как и цвет (заметим, в массиве надо указывать 4 компонента, не 3), но каждый имеет свою роль: Ambient - интенсивность "захвата" фонового освещения, Diffuse - обычное рассеянное освещение, Specular - цвет бликов. Кроме того, материалу задаётся экспонента Shininess exponent, которая отвечает за свойства "зеркальности" - чем больше экспонента, тем более узкие блики (что соответствует гладким зеркальным поверхностям).
0
veter48
0 / 0 / 0
Регистрация: 09.11.2008
Сообщений: 87
22.04.2012, 18:25  [ТС] #6
Ну, я что-то попытался настроить. Добавил параметры материала. Но я не совсем понял что значит
в массиве надо указывать 4 компонента, не 3
. Ну, в общем, я нашел параметры материала для стекла и указал их, но на стекло это ни как не похоже. Мне кажется, что с настройкой освещения у меня что-то не правильно, помогите, пожалуйста. Спасибо.
C++
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#include <GL/glut.h> 
 
static int kv= 1;
static int kd = 1;
 
void reshape(int w, int h)
{
    glViewport(0, 0, w, h);
    
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0, w, 0, h);
    
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}
 
static void key(unsigned char key, int x, int y)
{
    switch (key) 
    {
        case 27 : 
        case 'q':
            exit(0);
            break;
 
        case '+':
            if (kv < 75 & kd < 75) 
            {
             kv += 1;
             kd += 1;
            }
            break;
 
        case '-': 
            if (kv > -5 & kd > -5) 
            {
             kv -= 1; 
             kd -= 1; 
            }
            break;
    }
 
    glutPostRedisplay();
}
 
 
void display()
{
       
 
    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  
      
    GLfloat light0_diffuse[] = {1, 1, 0, 1.0};
    GLfloat light0_direction[] = {0.5, 1, 1, 0.005};
 
    glEnable(GL_LIGHT0);
    glLightfv(GL_LIGHT0, GL_DIFFUSE, light0_diffuse);
    glLightfv(GL_LIGHT0, GL_POSITION, light0_direction);
    
    
    GLfloat spec[] = {0.9, 0.9, 0.9, 1.0};
    GLfloat ambient[] = {0.0, 0.0, 0.0, 1.0};
    GLfloat dif[] = {0.588235, 0.670588, 0.729412, 1.0};
    GLfloat emis[] = {0.0, 0.0, 0.0, 1.0};
    glMaterialfv(GL_FRONT, GL_SPECULAR, spec);
    glMaterialf(GL_FRONT, GL_SHININESS, 96);
    glMaterialfv(GL_FRONT, GL_AMBIENT, ambient);
    glMaterialfv(GL_FRONT, GL_DIFFUSE, dif);
    glMaterialfv(GL_FRONT, GL_EMISSION, emis);
    
 
    glBegin(GL_POLYGON);
    glVertex2i(150 - kv,300);
    glVertex2i(200, 250-kv);
    glVertex2i(300+kv, 300);
    glVertex2i(275, 350+kv);
    glVertex2i(200, 350+kv);
    glEnd();
    
    
    glDisable(GL_LIGHT0);
    
    glutSwapBuffers();
}
 
 
 
int main (int argc, char * argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
    glutInitWindowSize(800, 600);
    glutInitWindowPosition(100,100);
    glutCreateWindow("Glass");
    glutKeyboardFunc(key);
 
 
     glClearColor (1, 1, 1, 1);
 
     glEnable(GL_LIGHTING);
 
     glLightModelf(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
 
     glEnable(GL_NORMALIZE);
     
     glEnable(GL_LIGHTING);
     
     glDisable(GL_COLOR_MATERIAL);
     
     float global_ambient[] = { 0.0, 0.0, 0.0, 1.0 };
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, global_ambient);
 
    
    glutReshapeFunc(reshape);
    glutDisplayFunc(display);
    
    glutMainLoop();
    
    return 0;
}
0
Nick Alte
Эксперт С++
1639 / 1011 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
23.04.2012, 18:44 #7
Цитата Сообщение от veter48 Посмотреть сообщение
GLfloat light0_direction[] = {0.5, 1, 1, 0.005};
Это эквивалентно заданию позиции источника света в координатах (100, 200, 200). Советую внимательнее изучить смысл однородных координат и способы задания параллельных и точечных источников света.

Цитата Сообщение от veter48 Посмотреть сообщение
GLfloat light0_diffuse[] = {1, 1, 0, 1.0};
Это ярко-жёлтый цвет, светить лучше белым.

Цитата Сообщение от veter48 Посмотреть сообщение
glLightfv(GL_LIGHT0, GL_DIFFUSE, light0_diffuse);
Надо задать источнику света ещё и бликовую яркость, GL_SPECULAR. И тоже белым цветом. Эта компонента освещения считается отдельно. По умолчанию эта компонента в источниках света загнана в ноль.

Цитата Сообщение от veter48 Посмотреть сообщение
GLfloat emis[] = {0.0, 0.0, 0.0, 1.0};
В этом нет необходимости, по умолчанию материалы сами не светятся.

Цитата Сообщение от veter48 Посмотреть сообщение
glBegin(GL_POLYGON);
Эта фигура состоит из нескольких треугольников и будет выглядеть очень так себе. Рекомендую составить фигуру хотя бы из нескольких сотен треугольников (а лучше - больше).

Цитата Сообщение от veter48 Посмотреть сообщение
float global_ambient[] = { 0.0, 0.0, 0.0, 1.0 };
Совсем выключать фоновое освещение не очень хорошо, так неосвещённые участки скатываются в непроглядную черноту. Лучше оставить некоторую небольшую интенсивность.
0
veter48
0 / 0 / 0
Регистрация: 09.11.2008
Сообщений: 87
24.04.2012, 22:43  [ТС] #8
Эта фигура состоит из нескольких треугольников и будет выглядеть очень так себе. Рекомендую составить фигуру хотя бы из нескольких сотен треугольников (а лучше - больше).
Вот я не пойму что вы имеете в виду. Я в этом мало разбираюсь, может всё-таки как-то можно добиться того, чтоб GL_POLYGON выглядел как стекло? Я еще подправил свет, и вроде что-то похоже на серое стекло, но хочется больше прозрачности, бликов. Спасибо.

C++
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#include <GL/glut.h> 
 
static int kv= 1;
static int kd = 1;
 
void reshape(int w, int h)
{
    glViewport(0, 0, w, h);
    
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0, w, 0, h);
    
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}
 
static void key(unsigned char key, int x, int y)
{
    switch (key) 
    {
        case 27 : 
        case 'q':
            exit(0);
            break;
 
        case '+':
            if (kv < 75 & kd < 75) 
            {
             kv += 1;
             kd += 1;
            }
            break;
 
        case '-': 
            if (kv > -5 & kd > -5) 
            {
             kv -= 1; 
             kd -= 1; 
            }
            break;
    }
 
    glutPostRedisplay();
}
 
 
void display()
{
       
 
    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  
      
    GLfloat light0_diffuse[] = {1, 1, 1, 1.0};
    //GLfloat light0_direction[] = {0.5, 1, 1, 0.005};
    GLfloat light0_direction[] = {0.5, 0.5, 0.5, 0.005};
    GLfloat light0_spec[] = {1, 1, 1, 1.0};
 
    glEnable(GL_LIGHT0);
    glLightfv(GL_LIGHT0, GL_DIFFUSE, light0_diffuse);
    glLightfv(GL_LIGHT0, GL_SPECULAR, light0_spec);
    glLightfv(GL_LIGHT0, GL_POSITION, light0_direction);
    
    
    GLfloat spec[] = {1, 1, 1, 1.0};
    GLfloat ambient[] = {0.0, 0.0, 0.0, 1.0};
    GLfloat dif[] = {0.588235, 0.670588, 0.729412, 1.0};
    GLfloat emis[] = {0.0, 0.0, 0.0, 1.0};
    glMaterialfv(GL_FRONT, GL_SPECULAR, spec);
    glMaterialf(GL_FRONT, GL_SHININESS, 5);
    glMaterialfv(GL_FRONT, GL_AMBIENT, ambient);
    glMaterialfv(GL_FRONT, GL_DIFFUSE, dif);
    glMaterialfv(GL_FRONT, GL_EMISSION, emis);
    
 
    glBegin(GL_POLYGON);
    glVertex2i(150 - kv,300);
    glVertex2i(200, 250-kv);
    glVertex2i(300+kv, 300);
    glVertex2i(275, 350+kv);
    glVertex2i(200, 350+kv);
    glEnd();
    
    
    glDisable(GL_LIGHT0);
    
    glutSwapBuffers();
}
 
 
 
int main (int argc, char * argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
    glutInitWindowSize(800, 600);
    glutInitWindowPosition(100,100);
    glutCreateWindow("Glass");
    glutKeyboardFunc(key);
 
 
     glClearColor (1, 1, 1, 1);
 
     glEnable(GL_LIGHTING);
 
     glLightModelf(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
 
     glEnable(GL_NORMALIZE);
     
     glEnable(GL_LIGHTING);
     
     glDisable(GL_COLOR_MATERIAL);
     glEnable(GL_BLEND);
     glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
     
     float global_ambient[] = { 0.2, 0.2, 0.2, 1.0 };
     glLightModelfv(GL_LIGHT_MODEL_AMBIENT, global_ambient);
 
    
    glutReshapeFunc(reshape);
    glutDisplayFunc(display);
    
    glutMainLoop();
    
    return 0;
}
0
Nick Alte
Эксперт С++
1639 / 1011 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
24.04.2012, 22:51 #9
С прозрачностью - вопрос отдельный, а для натуральных бликов надо или составлять фигуру из большого количества мелких треугольников (GL_TRIANGLES, GL_TRIANGLE_STRIP), либо вообще на шейдеры переходить. Первое намного проще.
Например, у нас есть куб. Самое простое - представить каждую его грань в виде квадрата и разделить по диагонали на два треугольника. Но если мы хотим бликов, то надо разбить каждую грань на сеточку из квадратов (скажем, 20*20) и уже каждый такой маленький квадратик представить как два мелких треугольничка. Это можно выполнить циклами. При этом надо задавать в каждой вершине нормаль (glNormal3f) как перпендикуляр к грани куба, причём единичной длины. На таком кубике блеск будет уже неплохо смотреться.
Ну а чтобы совсем хорошо - рисовать шейдеры, рассчитывать в них попиксельное освещение по Фонгу и всё такое...
0
veter48
0 / 0 / 0
Регистрация: 09.11.2008
Сообщений: 87
27.04.2012, 20:42  [ТС] #10
Может, можете показать какой-то пример? Я как-то не понимаю, как это все реализовать?
0
Nick Alte
Эксперт С++
1639 / 1011 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
28.04.2012, 17:23 #11
Ну вот, например, процедурное рисование кубика, каждая грань которого поделена на энное число квадратиков.
C++
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
void DrawCubeSide(const float size, const unsigned int divisions) // нарисовать грань куба на плоскости XY
{
    const float squareSize = size / divisions;  // размер одной ячейки
    const float startPoint = -size/2;
    for(size_t i=0; i<divisions; ++i)
        for(size_t j=0; j<divisions; ++j)
        {
            const float x0 = i*squareSize + startPoint, x1 = x0 + squareSize;
            const float y0 = j*squareSize + startPoint, y1 = y0 + squareSize;
            glBegin(GL_TRIANGLES);
            glNormal3f(0, 0, -1);
            glVertex3f(x0, y0, startPoint);
            glVertex3f(x1, y0, startPoint);
            glVertex3f(x0, y1, startPoint);
            glVertex3f(x0, y1, startPoint);
            glVertex3f(x1, y0, startPoint);
            glVertex3f(x1, y1, startPoint);
            glEnd();
        }
}
 
void DrawCube(const float size, const unsigned int divisions)
{
    // лицевая грань
    DrawCubeSide(size, divisions);
    // задняя грань
    glPushMatrix();
    glRotatef(180, 0, 1, 0);
    DrawCubeSide(size, divisions);
    glPopMatrix();
    // Левая и правая грани
    glPushMatrix();
    glRotatef(90, 0, 1, 0);
    DrawCubeSide(size, divisions);
    glPopMatrix();
    glPushMatrix();
    glRotatef(-90, 0, 1, 0);
    DrawCubeSide(size, divisions);
    glPopMatrix();
 
    // Верхняя и нижняя грани
    glPushMatrix();
    glRotatef(90, 1, 0, 0);
    DrawCubeSide(size, divisions);
    glPopMatrix();
    glPushMatrix();
    glRotatef(-90, 1, 0, 0);
    DrawCubeSide(size, divisions);
    glPopMatrix();
}
0
veter48
0 / 0 / 0
Регистрация: 09.11.2008
Сообщений: 87
08.05.2012, 22:13  [ТС] #12
Все равно не понимаю как нарисовать многоугольники таким способом и как сделать это все похожем на стекло Помогите пожалуйста, уже срочно надо.
0
Nick Alte
Эксперт С++
1639 / 1011 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
09.05.2012, 12:12 #13
Цитата Сообщение от veter48 Посмотреть сообщение
как нарисовать многоугольники таким способом
Ну я уж и не знаю, как ещё доступней объяснить... Разбить многоугольник на большое количество треугольников, что может быть непонятного-то?

Цитата Сообщение от veter48 Посмотреть сообщение
как сделать это все похожем на стекло
А это уже зависит от того, какая именно степень похожести требуется. Характеристики освещения подобрать - это одно дело, это несложно. Прозрачность уже похитрее делается, рефракция требует уже серьёзных усилий, а уж какие-нибудь эффекты высшей категории вроде caustic - сам понимаешь...
0
veter48
0 / 0 / 0
Регистрация: 09.11.2008
Сообщений: 87
09.05.2012, 18:23  [ТС] #14
Ну похожесть мне нужна довольно примитивное, вот я немного поигрался, и в принципе добился того чего хотел, добавить бы немного глянца, может немного поможете?
C++
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
#include <GL/glut.h> 
 
static int kv= 1;
static int kd = 1;
 
void reshape(int w, int h)
{
    glViewport(0, 0, w, h);
    
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0, w, 0, h);
    
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}
 
static void key(unsigned char key, int x, int y)
{
    switch (key) 
    {
        case 27 : 
        case 'q':
            exit(0);
            break;
 
        case '+':
            if (kv < 75 & kd < 75) 
            {
             kv += 1;
             kd += 1;
            }
            break;
 
        case '-': 
            if (kv > -5 & kd > -5) 
            {
             kv -= 1; 
             kd -= 1; 
            }
            break;
            
            case '[': 
            if (kv > -5) 
            {
             kv -= 1;  
            }
            break;
            
            case ']': 
            if (kv < 75) 
            {
             kv += 1;  
            }
            break;
            
            case ',': 
            if (kd > -5) 
            {
             kd -= 1;  
            }
            break;
            
            case '.': 
            if (kd < 75) 
            {
             kd += 1;  
            }
            break;
    }
 
    glutPostRedisplay();
}
 
 
void display()
{
       
 
    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  
      
    GLfloat light0_diffuse[] = {0.7, 0.7, 0.7, 1.0};
    GLfloat light0_direction[] = {1.8, 1.5, 2.9, 0.005};
 
    GLfloat light0_spec[] = {0.5, 0.5, 0.5, 1.0};
 
    glEnable(GL_LIGHT0);
    glLightfv(GL_LIGHT0, GL_DIFFUSE, light0_diffuse);
    glLightfv(GL_LIGHT0, GL_SPECULAR, light0_spec);
    glLightfv(GL_LIGHT0, GL_POSITION, light0_direction);
    
    glEnable (GL_BLEND);
    glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    
    GLfloat spec[] = {0.8, 0.8, 0.8, 1};
    GLfloat ambient[] = {1.0, 0, 0, 1};
    GLfloat dif[] = {0.588235, 0.670588, 0.729412, 0.15};
    GLfloat emis[] = {0.0, 0.0, 0.0, 1.0};
    glMaterialfv(GL_FRONT, GL_SPECULAR, spec);
    glMaterialf(GL_FRONT, GL_SHININESS, 125);
    glMaterialfv(GL_FRONT, GL_AMBIENT, ambient);
    glMaterialfv(GL_FRONT, GL_DIFFUSE, dif);
    glMaterialfv(GL_FRONT, GL_EMISSION, emis);
    
 
    glBegin(GL_POLYGON);
    glVertex2i(150 - kv,300 +kv);
    glVertex2i(160 - kv,260);
    glVertex2i(200, 250-kv);
    glVertex2i(300+kv, 300);
    glVertex2i(275, 350+kv);
    glVertex2i(200, 350+kv);
    glEnd();    
 
    GLfloat ambienttwo[] = {0, 0, 1, 1.0};
 
    glMaterialfv(GL_FRONT, GL_AMBIENT, ambienttwo);
    
    glBegin(GL_POLYGON);
    glVertex2i(450-kd, 300);
    glVertex2i(500, 250-kd);
    glVertex2i(600, 250-kd);
    glVertex2i(610+kd,260);
    glVertex2i(575, 350+kd);
    glVertex2i(500, 350+kd);
 
    glEnd();
    
     glDisable(GL_LIGHT0);
    
    glutSwapBuffers();
}
 
 
 
int main (int argc, char * argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
    glutInitWindowSize(800, 600);
    glutInitWindowPosition(100,100);
    glutCreateWindow("2. LD");
    glutKeyboardFunc(key);
 
 
     glClearColor (1, 1, 1, 1);
 
     glEnable(GL_LIGHTING);
 
     glLightModelf(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
 
     //glEnable(GL_NORMALIZE);
     
     glEnable(GL_LIGHTING);
 
     glEnable(GL_BLEND);
     glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
     
     float global_ambient[] = { 0.2, 0.2, 0.2, 1.0 };
     glLightModelfv(GL_LIGHT_MODEL_AMBIENT, global_ambient);
 
    
    glutReshapeFunc(reshape);
    glutDisplayFunc(display);
    
    glutMainLoop();
    
    return 0;
}
0
09.05.2012, 18:23
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.05.2012, 18:23
Привет! Вот еще темы с ответами:

Ищу материалы по работе с БД MySQL в C++ (учебник) - C++
Хотелось бы узнать автора и название книги, в которой описывается работа с БД MySQL в C++ Добавлено через 16 минут Хотелось бы...

Подскажите справочные материалы по регулярным выражениям std::regex - C++
Помогите разобраться с синтаксисом регулярных выражений для std::regex. Работаю в VS 2012. Нашел некий список на сайте Microsoft, но...

Нужны материалы на тему "С++ и работа с сетью" - C++
Подскажите книжонки или сайты с уроками по теме: c++ и работа с сетью Добавлено через 10 минут И какие для этого компоненты есть?...

Порекомендуйте программу для отработки метода "слепой печати" в русской и английской раскладке и/или учебные материалы. - C++
Стыдно печатать смотря на клавиатуру. Спасибо.


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

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

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