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

Изометрия, поворот и GLUT - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Создать программный комплекс – «Меню» http://www.cyberforum.ru/cpp-beginners/thread1034130.html
Создать программный комплекс – «Меню», содержащий следующие пункты: 1) Создание матрицы. 2) Заполнение файла inputdig.txt случайными числами. 3) Заполнение матрицы. 4) Нахождение обратной матрицы. 5) Нахождение транспонированной матрицы. 6) Нахождение определителя матрицы. Хотябы первый пункт! 1) При выборе первого пункта меню Ваша программа должна: запрашивать размерность матрицы (N*M,...
C++ Построить последовательность, образованную цифрами семеричного представления Построить последовательность из 20 чисел, образованную цифрами семеричного представления последовательности натуральных чисел, начинающейся с заданного n. http://www.cyberforum.ru/cpp-beginners/thread1034122.html
Задан текст, напечатать слова этого текста отличные от последнего слова C++
Задан текст.напечатать слова этого текста отличные от последнего слова удалить в каждом из них первую букву. Нужно сделать именно через матрицу. #include "iostream" #include "string.h" #include "stdio.h" using namespace std; int main() { setlocale(LC_ALL, "rus"); char s;
Центр тяжести C++
Система из n материальных точек в пространстве задана с помощью последовательности действительных чисел x1, y1, z1, p1, x2, y2, z2, p2, ..., xn, yn, zn, pn, где xi, yi, zi - координаты i-ой точки, а pi - ее вес (i = 1, 2, ..., n). Получить координаты центра тяжести системы. Задачу практически решила. НО есть вопрос: Как посчитать x, y, z по формулам в программе? ( я так понимаю, это сумма...
C++ Задачи по объектно-ориентированному программированию http://www.cyberforum.ru/cpp-beginners/thread1034078.html
Помогите, пожалуйста решить задачи. 1)K-значное число (K ≤ 10) называется пестрым, если все его цифры различны. При этом ноль не может быть первой цифрой. Требуется написать программу, которая для заданного K: находит максимально длинную цепочку пестрых K-значных чисел, в которой каждое следующее число в два раза больше предыдущего; находит все такие цепочки максимальной длины. ...
C++ Бинарное дерево C++ Доброе утро! Пишу программу по теоретическим основам АСУ, но не могу сделать бинарное дерево, которое выходило бы после вывода последнего результата, с количеством элементов равному последнему результату. сам код C++ изображен ниже: #include <iostream> using namespace std; int main() { int a=0; int g=0; int y=0; подробнее

Показать сообщение отдельно
Harmonster
9 / 9 / 3
Регистрация: 20.05.2012
Сообщений: 101
09.12.2013, 10:36     Изометрия, поворот и GLUT
Здравствуйте. У меня проблема. Данная программа - выводит на экран куб в пространстве, и позволяет крутить его по осям XYZ, изменять масштаб и скорость поворота (вернее тут будет сказать время перерисовки).

Мне нужно сделать так, чтобы куб рисовался в изометрии и когда происходит его поворот - ось фиксировалась и поворот происходил вокруг этой оси. В данной программе поворот происходит в плоскости, а как зафиксировать одну ось - я не знаю. Помогите, пожалуйста.

Исходный Код
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
#include <glut.h>
#include <iostream>
 
/*
WinWidth - ширина окна
WinHeight - высота окна
Scale - коэффициент масштабирования
Speed - скорость поворота
AngleX - угол поворота по оси X
AngleY - угол поворота по оси Y
AngleZ - угол поворота по оси Z
*/
 
float WinWidth = 400, WinHeight = 400, Scale = 1.0, Speed = 50.0;
int AngleX = 0.0, AngleY = 0.0, AngleZ = 0.0;
const float  PI = 3.14159265358979f;
 
void draw_figure();
void initialization();
void Keyboard(unsigned char key, int x, int y);
void Timer(int value);
 
void draw_figure()
{
    glClear(GL_COLOR_BUFFER_BIT);   
    glPushMatrix();
    glRotatef(127, 1.0, 1.0, 0.0);
    glRotatef(AngleX, 1.0, 0.0, 0.0);
    glRotatef(AngleY, 0.0, 1.0, 0.0);
    glRotatef(AngleZ, 0.0, 0.0, 1.0);
    glScalef(Scale, Scale, Scale); 
    // рисуем первый квадрат по координатам
    glBegin(GL_LINE_STRIP);
    glVertex3f(-50.0, -50.0, -50.0);
    glVertex3f(50.0, -50.0, -50.0);
    glVertex3f(50.0, 50.0, -50.0);
    glVertex3f(-50.0, 50.0, -50.0);
    glVertex3f(-50.0, -50.0, -50.0);
    glEnd();
    // второй квадрат по координатам
    glBegin(GL_LINE_STRIP);
    glVertex3f(-50.0, -50.0, 50.0);
    glVertex3f(50.0, -50.0, 50.0);
    glVertex3f(50.0, 50.0, 50.0);
    glVertex3f(-50.0, 50.0, 50.0);
    glVertex3f(-50.0, -50.0, 50.0);
    glEnd();
    // соединяющие линии
    glBegin(GL_LINES);
    glVertex3f(-50.0, -50.0, 50.0);
    glVertex3f(-50.0, -50.0, -50.0);
    glVertex3f(50.0, -50.0, 50.0);
    glVertex3f(50.0, -50.0, -50.0);
    glVertex3f(50.0, 50.0, 50.0);
    glVertex3f(50.0, 50.0, -50.0);
    glVertex3f(-50.0, 50.0, 50.0);
    glVertex3f(-50.0, 50.0, -50.0);
    glEnd();
    glPopMatrix();
    glutSwapBuffers();
}
 
void initialization()
{
    glClearColor(0.0, 0.0, 0.0, 1.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-WinWidth, WinWidth, -WinHeight, WinHeight, -400.0, 400.0); 
    glMatrixMode(GL_MODELVIEW);
}
 
void Keyboard(unsigned char key, int x, int y)
{
    switch (key)
    {
    case 'q': AngleX++; break;
    case 'w': AngleX--; break;
    case 'a': AngleY++; break;
    case 's': AngleY--; break;
    case 'z': AngleZ++; break;
    case 'x': AngleZ--; break;
    case '+': Scale++; break;
    case '-': Scale--;
        if (Scale < 1)
            Scale = Scale + 1;
        break;
    case 't': Speed += 10; break;
    case 'y': Speed -= 10; 
        if (Speed < 10)
            Speed = Speed + 10;
        break;
    }
}
 
void Timer(int value)
{
    glutPostRedisplay();
    glutTimerFunc(Speed, Timer, 0);
}
 
int main(int argc, char** argv)
{
    std::cout << "List of hotkeys" << std::endl;
    std::cout << "Q/W : rotate axis X" << std::endl;
    std::cout << "A/S : rotate axis Y" << std::endl;
    std::cout << "Z/X : rotate axis Z" << std::endl;
    std::cout << "T/Y : change rotating speed" << std::endl;
    std::cout << "+/- : scaling" << std::endl;
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    glutInitWindowSize(WinWidth, WinHeight);
    glutInitWindowPosition(200, 200);
    glutCreateWindow("Computer Graphic");
    glutDisplayFunc(draw_figure);
    glutTimerFunc(Speed, Timer, 0);
    glutKeyboardFunc(Keyboard);
    initialization();
    glutMainLoop();
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 23:07. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru