Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
3 / 4 / 0
Регистрация: 18.11.2010
Сообщений: 126

Вращение объекта. Библиотека OpenGL.

04.04.2012, 11:03. Показов 3140. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет.
У меня в работе подключены эти библиотеки:
C++
1
2
3
4
#include <vcl.h>
#include <math.h>
#pragma hdrstop
#include "Unit1.h"
Сама работа связана с вращением фигуры в 3D. Я так понимаю, если здесь нет библиотеки opengl. эта программа написана без него?

А вот весь код:
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
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
#include <vcl.h>
#include <math.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
 
const TrCol=24;
float oldX=0;
float oldY=0;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
BackBuffer=new Graphics::TBitmap();
BackBuffer->Width=Width;
BackBuffer->Height=Height;;
}
//---------------------------------------------------------------------------
float rotation=0;
float plane=0;
float distance=1;
class TFPoint
{
public:
float X;
float Y;
float Z;
};
class CTriangle
{
public:
int p1;
int p2;
int p3;
float Distance;  //Это типа Z - буффер
} ;
//Задаем координаты звезды
TFPoint StarPoints[]=
        {
        {    1,   1, 107},  //0
        {   92,   1,  53},  //1
        {   92,   1, -53},  //2
        {    1,   1,-107},  //3
        {  -92,   1, -53},  //4
        {  -92,   1,  53},  //5
        {   18,   1,  32},  //6
        {   37,   1,   1},  //7
        {   18,   1, -32},  //8
        {  -18,   1, -32},  //9
        {  -37,   1,   1},  //10
        {  -18,   1,  32},  //11
        {    1, -35,  1},   //12
        {    1,  35,  1},   //13
        };
 
CTriangle Triangles[]=
        {
        {0 ,6 ,12,0},
        {1 ,6 ,12,0},
        {1 ,7 ,12,0},
        {2 ,7 ,12,0},
        {2 ,8 ,12,0},
        {3 ,8 ,12,0},
        {3 ,9 ,12,0},
        {4 ,9 ,12,0},
        {4 ,10,12,0},
        {5 ,10,12,0},
        {5 ,11,12,0},
        {0 ,11,12,0},
 
        {0 ,6 ,13,0},
        {1 ,6 ,13,0},
        {1 ,7 ,13,0},
        {2 ,7 ,13,0},
        {2 ,8 ,13,0},
        {3 ,8 ,13,0},
        {3 ,9 ,13,0},
        {4 ,9 ,13,0},
        {4 ,10,13,0},
        {5 ,10,13,0},
        {5 ,11,13,0},
        {0 ,11,13,0}
        };
 
TFPoint XYZtoXY(float x,float y,float z)
{
//Вычисляем расстояние от центра
float radius=sqrt(x*x+y*y);
radius*=distance;
//Вычисляем первый угол
float angle=0;
if(x==0)angle=atan(1000000);else angle=atan(y/x);
if(x<0)angle+=M_PI;
 
//Поворачиваем объект
angle+=rotation;
 
//Вычисляем новые координаты
float realX=radius*cos(angle);
float realZ=radius*sin(angle);
float realY=z;
 
//Определяем новое расстояние от центра
radius=sqrt(realY*realY+realZ*realZ);
radius*=distance;
//Вычисляем второй угол
if(realZ==0)angle=atan(1000000);else angle=atan(realY/realZ);
if(realZ<0)angle+=M_PI;
 
//Добавляем угол наклона сечения
angle+=plane;
 
//вычисляем координаты для экрана
TFPoint point;
point.X=realX;
point.Y=radius*sin(angle);
point.Z=radius*cos(angle);
 
//Тут мы центрируем положение объекта,Эти две строки можно вытереть
point.X+=420;
point.Y+=305;
return point;
}
//---------------------------------------------------------------------------
TForm1::SortTriangles()
{
TFPoint point1,point2,point3;//Сначала подсчитаем расстояние от камеры до точки на плоскости
TFPoint mediana,seredina;
for(int i=0;i<TrCol;i++)
        {
        point1=XYZtoXY(StarPoints[Triangles[i].p1].X,StarPoints[Triangles[i].p1].Y,StarPoints[Triangles[i].p1].Z);
        point2=XYZtoXY(StarPoints[Triangles[i].p2].X,StarPoints[Triangles[i].p2].Y,StarPoints[Triangles[i].p2].Z);
        point3=XYZtoXY(StarPoints[Triangles[i].p3].X,StarPoints[Triangles[i].p3].Y,StarPoints[Triangles[i].p3].Z);
 
        mediana.X=(point1.X+point2.X)/2.0;
        mediana.Y=(point1.Y+point2.Y)/2.0;
        mediana.Z=(point1.Z+point2.Z)/2.0;
 
        seredina.X=(point3.X+mediana.X)/2.0;
        seredina.Y=(point3.Y+mediana.Y)/2.0;
        seredina.Z=(point3.Z+mediana.Z)/2.0;
        Triangles[i].Distance=seredina.Z;
        }
 
        //А теперь мы сортируем пузырьком наши треугольники
CTriangle temptr;
for(int j=0;j<TrCol;j++)
        for(int i=j;i<TrCol-1;i++)
                {
                if(Triangles[i].Distance<Triangles[i+1].Distance)
                        {
                        temptr=Triangles[i];
                        Triangles[i]=Triangles[i+1];
                        Triangles[i+1]=temptr;
                        }
                }
return 0;
}
 
//////---------------------------------------------------------------------
void TForm1::DrawPoints()
{
TFPoint point1,point2,point3;
BackBuffer->Canvas->Brush->Color=clBlack;
BackBuffer->Canvas->FillRect(Form1->GetClientRect());
BackBuffer->Canvas->Brush->Color=clRed;
BackBuffer->Canvas->Pen->Color=clOlive;
BackBuffer->Canvas->Pen->Width=1;
TPoint p[3];
 
SortTriangles();
 
for(int i=0;i<TrCol;i++)
        {
        point1=XYZtoXY(StarPoints[Triangles[i].p1].X,StarPoints[Triangles[i].p1].Y,StarPoints[Triangles[i].p1].Z);
        point2=XYZtoXY(StarPoints[Triangles[i].p2].X,StarPoints[Triangles[i].p2].Y,StarPoints[Triangles[i].p2].Z);
        point3=XYZtoXY(StarPoints[Triangles[i].p3].X,StarPoints[Triangles[i].p3].Y,StarPoints[Triangles[i].p3].Z);
        p[0].x=point1.X;
        p[0].y=point1.Y;
 
        p[1].x=point2.X;
        p[1].y=point2.Y;
 
        p[2].x=point3.X;
        p[2].y=point3.Y;
        BackBuffer->Canvas->Polygon(p,2);
        }
Canvas->Draw(0,0,BackBuffer);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift,
      int X, int Y)
{
rotation-=(X-oldX)/50.0;
plane-=(Y-oldY)/100.0;
DrawPoints();
oldX=X;
oldY=Y;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormMouseWheel(TObject *Sender, TShiftState Shift,
      int WheelDelta, TPoint &MousePos, bool &Handled)
{
distance+=WheelDelta/1000.0;
DrawPoints();
}
P.s. Код не мой
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.04.2012, 11:03
Ответы с готовыми решениями:

Кубик Рубик в OpenGL - вращение
Недавно начал осваивать OpenGL, попытался сделать кубик рубика, но столкнулся с проблемой вращения его, до этого делал вращение только...

Движение графического объекта по траектории и его вращение
Помогите!!! Нужно нарисовать фигуру и задать движение. Начальное направление задается в виде вектора перемещения. При касании границы...

Движение графического объекта по траектории, вращение, изменение цвета
Помогите пожалуйста! У меня задача:1) нарисовать фугуру (звезда в круге). (С этим я справлюсь.) 2) реализовать движение по траектории...

7
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
04.04.2012, 11:24
Да, без. Вопрос, собственно, в чем?
0
3 / 4 / 0
Регистрация: 18.11.2010
Сообщений: 126
04.04.2012, 11:32  [ТС]
а собственно как он работает без openGl?
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
04.04.2012, 11:51
На самом деле код прикольный, красиво

Licwin, здесь используются математические вычисления для проекции трехмерных объектов на плоскость, а проекции затем рисуются на канве.
0
3 / 4 / 0
Регистрация: 18.11.2010
Сообщений: 126
04.04.2012, 12:08  [ТС]
а может кто как можно больше оставить комментариев к листингу? по строчкам...
я примерно понимаю работу кода... но хотелось бы на защите рассказать все подробно
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
04.04.2012, 12:21
Licwin, в коде комментариев достаточно, угадывать, что вам не понятно - дело неблагодарное, на вашем месте я бы про это поведал сам.
0
3 / 4 / 0
Регистрация: 18.11.2010
Сообщений: 126
04.04.2012, 12:57  [ТС]
непонятно следующие:

в unit1.h есть класс, что он означает?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class TForm1 : public TForm
{
__published:
        TTimer *Timer1;
        void __fastcall FormMouseMove(TObject *Sender, TShiftState Shift,
          int X, int Y);
        void __fastcall FormMouseWheel(TObject *Sender, TShiftState Shift,
          int WheelDelta, TPoint &MousePos, bool &Handled);
private:    // User declarations
public:     // User declarations
        __fastcall TForm1(TComponent* Owner);
        void DrawPoints();  
        SortTriangles();
        Graphics::TBitmap*BackBuffer;
};
P.S. на форме есть таймер, который отвечает за вращение фигуры.

Далее для чего z-буфер? и вообще где про него почитать толковый материал?

Потом непонятно последние строчки в листинге, а именно эти:

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
void TForm1::DrawPoints()
{
TFPoint point1,point2,point3;
BackBuffer->Canvas->Brush->Color=clBlack;
BackBuffer->Canvas->FillRect(Form1->GetClientRect());
BackBuffer->Canvas->Brush->Color=clRed;
BackBuffer->Canvas->Pen->Color=clOlive;
BackBuffer->Canvas->Pen->Width=1;
TPoint p[3];
 
SortTriangles();
 
for(int i=0;i<TrCol;i++)
        {
        point1=XYZtoXY(StarPoints[Triangles[i].p1].X,StarPoints[Triangles[i].p1].Y,StarPoints[Triangles[i].p1].Z);
        point2=XYZtoXY(StarPoints[Triangles[i].p2].X,StarPoints[Triangles[i].p2].Y,StarPoints[Triangles[i].p2].Z);
        point3=XYZtoXY(StarPoints[Triangles[i].p3].X,StarPoints[Triangles[i].p3].Y,StarPoints[Triangles[i].p3].Z);
        p[0].x=point1.X;
        p[0].y=point1.Y;
 
        p[1].x=point2.X;
        p[1].y=point2.Y;
 
        p[2].x=point3.X;
        p[2].y=point3.Y;
        BackBuffer->Canvas->Polygon(p,2);
        }
Canvas->Draw(0,0,BackBuffer);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift,
      int X, int Y)
{
rotation-=(X-oldX)/50.0;
plane-=(Y-oldY)/100.0;
DrawPoints();
oldX=X;
oldY=Y;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormMouseWheel(TObject *Sender, TShiftState Shift,
      int WheelDelta, TPoint &MousePos, bool &Handled)
{
distance+=WheelDelta/1000.0;
DrawPoints();
}
Добавлено через 1 минуту
и еще вопрос, если описывать, что можно описать в курсаче по этой программе?
Если было бы OpenGL, то я бы описал его и листинг... Но так как его нет, мне стоит описать "математические вычисления для проекции трехмерных объектов на плоскость" ???
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
05.04.2012, 05:02
Если я не ошибаюсь, то вместе с билдером 6-тым идут примеры с OpenGL.
А во что у меня завалялось, кажется оттуда.
Вложения
Тип файла: rar OpenGL.rar (72.7 Кб, 150 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.04.2012, 05:02
Помогаю со студенческими работами здесь

OpenGl 3.3 Вращение объекта в мировых координатах
Здравствуйте, столкнулся со следующей проблемой. Необходимо реализовать вращение объекта при помощи кнопок клавиатуры:тангаж, рысканье,...

Направление (вращение) объекта в сторону перемещения OpenGL
Есть некий объект (пускай конус). Он движется по координатам x,y,z (например по точкам A(1; 32; 43), B(12; 108; 320)... с интервалом,...

C# OpenGL вращение камеры "мышкой" вокруг трёхмерного объекта
Я в С# новичок и в OpenGL. Какой-то бы целостный пример для вращения мышкой камеры вокруг куба! Даже точнее, вращение само я реализовал,...

Реализовать вращение 3D объекта как вращение камеры
Существует некий объект в 3D пространстве (для примера используем куб). В исходном положении это дело выглядит как на рисунке 1 первый куб...

Вращение объекта вокруг другого объекта
Как сделать вращение объекта вокруг другого объекта? Например: создаём куб, затем внутри него создать ещё один куб и отодвинуть этот...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru