Форум программистов, компьютерный форум, киберфорум
OpenGL
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
96 / 10 / 1
Регистрация: 14.03.2017
Сообщений: 187
1

Работа c клавиатурой (GLUT)

15.03.2017, 03:25. Показов 1940. Ответов 1
Метки нет (Все метки)

Столкнулся вот с чем: При попытки менять x, ничего не происходит. При этом y меняется. Самое забавное, что если использовать комбинацию клавиш(вверх-влево, вправо-вниз и.т.д), то x спокойно себе меняется. В чем может быть проблема?
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
#include <Gl/freeglut.h>
#include <math.h>
 
float vecX;
float vecY;
float vecZ;
 
int w = 1024;
int h = 768;
 
float x = 0;
float y = 0;
float rSize = 1;
float speedX;
float speedY;
 
 
void changeSize(int w, int h) {
    // предотвращение деления на ноль
    if (h == 0)
        h = 1;
    float ratio = w * 1.0 / h;
    // используем матрицу проекции
    glMatrixMode(GL_PROJECTION);
    // обнуляем матрицу
    glLoadIdentity();
    // установить параметры вьюпорта
    glViewport(0, 0, w, h);
    // установить корректную перспективу
    gluPerspective(45.0f, ratio, 0.1f, 100.0f);
    // вернуться к матрице проекции
    glMatrixMode(GL_MODELVIEW);
}
 
void pressKey(unsigned char key, int x, int y) {
 
    switch (key) {
    case (97): speedX = -0.5; break; // a
    case (100): speedX = 0.5; break; // d
    case (119):  speedY = 0.5; break; // w
    case (115):  speedY = -0.5; break; // s
    }
}
 
void computePos(float speedX,float speedY) {
 
    x += speedX * 0.01f;
    y += speedY * 0.01f;
}
 
void releaseKey(unsigned char key, int x, int y) {
 
    switch (key) {
    case (97): speedX = 0; break; // a
    case (100): speedX = 0; break; // d
    case (119): speedY = 0; break; // w
    case (115):  speedY = 0; break; //s
    }
}
 
 
void renderScene(void) {
 
    // очистка буфера цвета и глубины
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
    
    if (speedX,speedY)
        computePos(speedX,speedY);
    // обнуление трансформации
    glLoadIdentity();
    glClearColor(0, 0, 0, 1);
    gluLookAt(0, 0, +20,
              0, 0,  0,
              0, 1,  0);
    glColor3f(1, 0, 0);
    
    glBegin(GL_QUADS);
    glVertex2f(-8, 8);
    glVertex2f(-8, 7);
    glVertex2f(8, 7);
    glVertex2f(8, 8);
    glEnd();
 
    glBegin(GL_QUADS);
    glVertex2f(-8, 8);
    glVertex2f(-8, -8);
    glVertex2f(-7, -8);
    glVertex2f(-7, 8);
    glEnd();
 
    glBegin(GL_QUADS);
    glVertex2f(-8, -7);
    glVertex2f(-8, -8);
    glVertex2f(8, -8);
    glVertex2f(8, -7);
    glEnd();
 
    glBegin(GL_QUADS);
    glVertex2f(7, 8);
    glVertex2f(7, -8);
    glVertex2f(8, -8);
    glVertex2f(8, 8);
    glEnd();
 
    glColor3f(0, 0, 1);
 
    
 
    glBegin(GL_QUADS);
    glVertex3f(x, y + rSize, 0); // вверх-лево
    glVertex3f(x, y, 0); // низ-лево
    glVertex3f(x+rSize, y, 0); // низ-право
    glVertex3f(x+rSize, y + rSize, 0); // вверх-право
    glEnd();
 
    // поменять буфер (мы рисовали на невидимом)
    glutSwapBuffers();
}
 
 
 
int main(int argc, char **argv) {
 
    // Инициализация GLUT и создание окна
    glutInit(&argc, argv);
    // Аргументы окна - глубина | двойной буфер(анимация) | RGBA
    glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
    // Позиция создаваемого окна
    glutInitWindowPosition(210, 35);
    // Размеры окна
    glutInitWindowSize(w, h);
    // Название окна
    glutCreateWindow("OpenGL Project");
    glMatrixMode(GL_PROJECTION);
 
    // регистрация
    // функция рисования
    glutDisplayFunc(renderScene);
    // функция перспективы
    glutReshapeFunc(changeSize);
    // функция ожидания - когда ничего не происходит - происходит функция
    glutIdleFunc(renderScene);
    // функция обрабатывания клавиш
    glutKeyboardFunc(pressKey);
    // 0 - единичные нажатия, 1 - залипание
    glutIgnoreKeyRepeat(1);
    // отжатие клавиши
    glutKeyboardUpFunc(releaseKey);
    // OpenGL - инициализация функции теста
    glEnable(GL_DEPTH_TEST);
 
 
    // основной цикл
    glutMainLoop();
 
    return 1;
}
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.03.2017, 03:25
Ответы с готовыми решениями:

Работа с трехмерными примитивами. Вокруг конуса GLU вращаются сфера GLUT и конус GLUT
создание виртуальной камеры gluLookAt и добавление эффектов анимации. вот само задание Вокруг...

Работа с клавиатурой
Здравствуйте, мне нужна помощь :) Задание состоит в том, что бы разработать программу, которая...

Работа с клавиатурой
при работе с курсовой столкнулся с задачей: выполнять действие сразу как только будет нажата...

Работа с клавиатурой
Здраствуйте, есть задача эмулировать нажатия клавиш, но winapi не выход, либо там где нада...

1
96 / 10 / 1
Регистрация: 14.03.2017
Сообщений: 187
17.03.2017, 14:51  [ТС] 2
Проблема решена, X и Y надо раздельно обрабатывать, тобишь создавать дву разных функции и на X и на Y.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.03.2017, 14:51

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Работа с клавиатурой
Чюваки!!! подскажите плз какие есть операции с клавиатурой в c/c++.....ну типа redkey как в...

Работа с клавиатурой
Дорогие форумчане, подскажите пожалуйста, столкнулся с такой проблемой на форме есть кнопки с...

Работа с клавиатурой
Прошу сильно не ругать, т.к. мне до программиста как медному тазику до ржавчины. Есть код который я...

Работа с клавиатурой
ребят подскажите в чем ошибка?? хотел попробовать управлять формой с помощью кнопок но все время...


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

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

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