Форум программистов, компьютерный форум, киберфорум
Наши страницы
OpenGL
Войти
Регистрация
Восстановить пароль
 
Эникей
0 / 0 / 0
Регистрация: 23.03.2017
Сообщений: 42
1

Нужно написать лабиринт, по которому можно перемещаться по нажатию стрелок на клавиатуре (glut)

22.09.2017, 00:31. Просмотров 270. Ответов 6
Метки нет (Все метки)

Нужно написать простенький 3D лабиринт используя графические библиотеки (glut, в моем случае). Есть движок. Я его немного переделал. Сейчас на экран выводится прозрачный куб. Наблюдатель находится как-бы внутри него. Получается что-то вроде коридора. Но что дальше делать - вообще не могу представить. Нужен какой-то простенький лабиринт из 2-х проходов. Перемещаться в нем нужно с помощью стрелок. Синтаксис С++ я НЕ ЗНАЮ ВООБЩЕ, но тем не менее, задание выполнить надо. Прошу помощи! Преподаватель сказал, что там разберется любой болван, даже не зная языка, но видимо, я тупее любого болвана. Что нужно сделать, чтобы по нажатию клавиши <стрелка вверх>, <стрелка вправо/влево> прорисовывался уже другой коридор? И желательно сделать так, чтобы не все стенки были прозрачными(а то не понятно куда идти в этом лабиринте).

КОД:

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
// ConsoleApplication1.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\glut.h>
#include <stdlib.h>
#pragma comment (lib,"opengl32.lib")
#pragma comment (lib,"glu32.lib")
#pragma comment (lib,"glut32.lib")
float rotor1 = 0; // текущий угол вращения планеты по орбите
                  /* параметры материала тора */
float mat1_dif[] = { 0.8f,0.8f,0.0f };
float mat1_amb[] = { 0.2f,0.2f,0.2f };
float mat1_spec[] = { 0.6f,0.6f,0.6f };
float mat1_shininess = 0.5f * 128;
/* параметры материала конуса */
float mat2_dif[] = { 0.8f,0.0f,0.0f };
float mat2_amb[] = { 0.2f,0.2f,0.2f };
float mat2_spec[] = { 0.6f,0.6f,0.6f };
float mat2_shininess = 0.7f * 128;
/* параметры материала шара */
float mat3_dif[] = { 0.0f,0.5f,0.0f };
float mat3_amb[] = { 0.2f,0.2f,10.2f };
float mat3_spec[] = { 0.6f,0.6f,0.6f };
float mat3_shininess = 0.1f * 128;
//материал орбиты
float mat4_dif[] = { 0.1f,0.4f,0.7f,1.0 };
float mat4_amb[] = { 0.2f,0.2f,0.2f,1.0 };
float mat4_spec[] = { 0.8f,0.8f,0.8f };
float mat4_shininess = 0.8f * 128;
int i = 90;
static int flag;
static int mousex, mousey;
float dd = 1.5;
int dx = 0;
int dy = 0;
 
 
/* Инициализируем параметры материалов и
* источника света
*/
void init(void)
{
    GLfloat light_ambient[] = { 0.0, 0.0, 0.0, 1.0 };
    GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
    GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 };
    GLfloat light_position[] = { -1.0, -1.0, 1.0, 0.0 };
    /* устанавливаем параметры источника света */
    glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
    glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
    glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);
    /* включаем освещение и источник света */
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    /* включаем z-буфер */
    glEnable(GL_DEPTH_TEST);
}
/* Функция вызывается при необходимости
* перерисовки изображения. В ней осуществляется
* весь вывод геометрии.
*/
void display(void)
{
    glPushMatrix();
    glRotatef(dx, 0, 1, 0);
    glRotatef(dy, -1, 0, 0);
    /* очищаем буфер кадра и буфер глубины */
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
    glRotatef(20.0, 1.0, 0.0, 0.0);
    /* отображаем куб */
    glMaterialfv(GL_FRONT, GL_AMBIENT, mat3_amb);
    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat3_dif);
    glMaterialfv(GL_FRONT, GL_SPECULAR, mat3_spec);
    glMaterialf(GL_FRONT, GL_SHININESS, mat3_shininess);
    glPushMatrix();
    glTranslatef(0, 0.19, 2.0);
    glutWireCube(2.5);
    glPopMatrix();
    glPopMatrix();
    /* выводим сцену на экран */
    glFlush();
}
/* Вызывается при изменении пользователем размеров окна
*/
 
void redraw(void) {
    rotor1 += 0.1; if (rotor1>360.0) { rotor1 -= 360.0; }
    glutPostRedisplay();
}
 
void reshape(int w, int h)
{
    /* устанавливаем размер области вывода
    * равным размеру окна
    */
    glViewport(0, 0, (GLsizei)w, (GLsizei)h);
    /* задаем матрицу проекции с учетом размеров окна */
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(
        40.0, /* угол зрения в градусах */
        (GLfloat)w / h, /* коэффициент сжатия окна */
        1, 100.0); /* расстояние до плоскостей отсечения */
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(
        0.0f, -2.0f, 6.0f, /* положение камеры */
        0.0f, 0.0f, 0.0f, /* центр сцены */
        0.0f, 1.0f, 0.0f); /* положительное направление оси y */
}
/* Вызывается при нажатии клавиши на клавиатуре */
void keyboard(unsigned char key, int x, int y)
{
    switch (key) {
    case 27: /* escape */
        exit(0);
        break;
    }
}
 
void mouse(int button, int state, int x, int y)
{
    if (state == GLUT_DOWN) {
        switch (button) {
        case GLUT_LEFT_BUTTON:
            flag = 1;
            break;
        case GLUT_RIGHT_BUTTON:
            break;
        }
    }
    else if (state == GLUT_UP) {
        flag = 0;
    }
}
void action(int x, int y)
{
    if (flag == 1) {
        if (x - mousex > 0) { dx += dd; }
        if (x - mousex < 0) { dx -= dd; }
        if (y - mousey < 0) { dy += dd; }
        if (y - mousey > 0) { dy -= dd; }
    }
    mousex = x; mousey = y;
    glutPostRedisplay();
}
 
/* Главный цикл приложения.
* Создается окно, устанавливается режим
* экрана с буфером глубины
*/
int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB
        | GLUT_DEPTH);
    glutInitWindowSize(500, 500);
    glutCreateWindow(argv[0]);
    init();
    glutMouseFunc(mouse);
    glutMotionFunc(action);
    glutIdleFunc(redraw);
    glutReshapeFunc(reshape);
    glutDisplayFunc(display);
    glutKeyboardFunc(keyboard);
    glutMainLoop();
    return 0;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.09.2017, 00:31
Ответы с готовыми решениями:

Коды стрелок на клавиатуре
Приветствую! Есть у меня задание, в котором нужно использовать стрелки на...

Написать сервер, к которому по вебсокету можно подключаться
Нужно написать сервер к которому по вебсокету можно подключаться. Нашёл пример...

Проверка на нажатие стрелок на клавиатуре
есть такая конструкция void func() { char login = {NULL}; login =...

Ввод данных с использованием стрелок на клавиатуре
Здравствуйте, такой вопрос: в задании указано, что для ввода одной из...

Не обрабатывается нажатие кнопок (стрелок) на клавиатуре
Нашел в интернете код для обработки нажатия стрелок на клавиатуре, но он...

6
Avaddon74
291 / 172 / 76
Регистрация: 15.09.2017
Сообщений: 591
22.09.2017, 12:56 2
Цитата Сообщение от Эникей Посмотреть сообщение
Что нужно сделать
Я думаю, ответ на твой вопрос, кроется в одном маленьком факте:
Цитата Сообщение от Эникей Посмотреть сообщение
Синтаксис С++ я НЕ ЗНАЮ ВООБЩЕ, но тем не менее
У тебя два выхода, либо изучить самому, и выполнить задание преподавателя. Или заплатить и тебе напишут код. Тебе тут помогут советом, но делать за тебя просто так ни кто не будет. А чтоб тебе смогли помочь, ты должен четко сформулировать вопрос!
1
Эникей
0 / 0 / 0
Регистрация: 23.03.2017
Сообщений: 42
23.09.2017, 12:14  [ТС] 4
Конечно, я понимаю) Просто синтаксис выучить сейчас не могу, так как мы учим другие языки (Фортран, Visual Basic). Если я начну учить С++ сейчас, то я просто запутаюсь. Сами понимаете, что Фортран и С++ - это совершенно разные вещи.
0
vindast
56 / 54 / 10
Регистрация: 25.04.2017
Сообщений: 509
23.09.2017, 13:23 5
Цитата Сообщение от Эникей Посмотреть сообщение
(Фортран, Visual Basic)
Хочпаде, где ты учишься?
0
Эникей
0 / 0 / 0
Регистрация: 23.03.2017
Сообщений: 42
23.09.2017, 21:26  [ТС] 6
Хочпаде, где ты учишься?
Информатика и вычислительная техника))
0
vindast
56 / 54 / 10
Регистрация: 25.04.2017
Сообщений: 509
23.09.2017, 21:51 7
Эникей,
Цитата Сообщение от vindast Посмотреть сообщение
где
0
23.09.2017, 21:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.09.2017, 21:51

Написать алгоритм, по которому можно вычислить дату следующего дня
Написать алгоритм, по которому можно вычислить дату следующего дня. Указание: ...

Переключение страниц при нажатии стрелок на клавиатуре
Есть такой HTML код: &lt;div class='next1'&gt; &lt;?php previous_post_link('%link',...

Движение Image при нажатии стрелок на клавиатуре
Здравствуйте. Помогите пожалуйста. У меня есть Image1 я хочу что бы при нажатии...


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

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

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