Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.89/89: Рейтинг темы: голосов - 89, средняя оценка - 4.89
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109

Библиотека для работы с 3D графикой

27.05.2011, 13:05. Показов 17898. Ответов 62
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток. Посоветуйте какой ни будь инструмент для работы с 3D графикой в Билдере... на подобии GLScene если кто знает такой. Очень надо. Заранее спасибо!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.05.2011, 13:05
Ответы с готовыми решениями:

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

Библиотека для работы с графикой и текстом С++
Всем привет! Решил написать игру, в которой пользователь должен с клавиатуры писать команды роботу, и робот должен их выполнять, двигаться....

Написать пакет классов для работы с деловой графикой, предназначенный для работы в среде Windows
Написать пакет классовдля работы с деловой графикой, предназначенный для работы в среде Windows. Предусмотреть наличие в пакете классы для...

62
 Аватар для Maluda
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
31.05.2011, 12:44
Студворк — интернет-сервис помощи студентам
В первом примере должно получиться вот так
Миниатюры
Библиотека для работы с 3D графикой  
1
 Аватар для Maluda
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
31.05.2011, 12:45
Во втором примере должно получиться вот так
Миниатюры
Библиотека для работы с 3D графикой  
0
 Аватар для Maluda
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
31.05.2011, 12:50
Лучше использовать второй пример, так как он проще, понятнее, в нём не используются отдельные потоки и сторонние библиотеки компонентов

Добавлено через 3 минуты
Цитата Сообщение от Maluda Посмотреть сообщение
/*
;0,40 : idle
;40,46 : run
;46,54 : attack
;54,58 : paina
;58,62 : painb
;62,66 : painc
;66,72 : jump
;72,84 : flip
*/
Цитата Сообщение от Maluda Посмотреть сообщение
bbAnimateMD2(World3D.my_dragon, 1, .05, 40, 46);
Если менять вот эти параметры, то анимация дракона будет меняться,
то есть

Дракон бежит
C++
1
bbAnimateMD2(World3D.my_dragon, 1, .05, 40, 46);
Дракон прыгает
C++
1
bbAnimateMD2(World3D.my_dragon, 1, .05, 66, 72);
1
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
31.05.2011, 13:30  [ТС]
какая то фигня с CheckBox'ом ... пишет Class TCheckBox not found... хотя все как в примере...

Добавлено через 14 минут
С этой ошибкой разобрался... теперь пример запускается, но при активации движка ошибка вылезает:
Texture dose not exist
0
 Аватар для Maluda
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
31.05.2011, 14:39
Он ищет текстуру вот здесь "media/dragon/chorme-2.bmp"

То есть, если у тебя exe-шник расположен "c:\test\blitzproject.exe",
то текстуру будет искать по пути "c:\test\media\dragon\chorme-2.bmp"

Добавлено через 3 минуты
А, я понял, что ещё может быть,
я FinalOutputDirectory в настройках проекта поставил ".",
то есть exe-шник проекта у меня формируется в корне проекта, а не в папке Debug,
как это по-умолчанию в Билдере.
Короче, папка media должна быть там, где exe-шник

Добавлено через 28 секунд
Или она может быть в любом месте, тогда надо будет перебить пути, там их немного
0
 Аватар для name?
201 / 172 / 52
Регистрация: 01.06.2010
Сообщений: 371
31.05.2011, 14:40
Maluda, а можно проект?
0
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
31.05.2011, 14:41  [ТС]
Maluda, у меня оказывается нет такой папки... в версии которую я скачал... там только другие всячиские модели в формате 3ds
0
 Аватар для Maluda
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
31.05.2011, 14:42
Ты точно SDK скачал? Там должны быть папки include и lib
0
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
31.05.2011, 14:44  [ТС]
Maluda, SDK не нашел... там только обычная версия была... и та по моему не работает
0
 Аватар для Maluda
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
31.05.2011, 14:47
Вот так должна выглядеть папка с SDK
Миниатюры
Библиотека для работы с 3D графикой  
0
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
31.05.2011, 14:48  [ТС]
Maluda, нашел... щас буду качать)
0
 Аватар для Maluda
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
31.05.2011, 14:49
Вот так должна выглядеть папка media,
путь к ней можно увидеть вверху картинки

В некоторых версиях SDK папка VisualC может лежать в другом месте,
но папка media всегда внутри неё
Миниатюры
Библиотека для работы с 3D графикой  
2
 Аватар для QVO
652 / 462 / 80
Регистрация: 26.10.2010
Сообщений: 1,263
Записей в блоге: 4
31.05.2011, 16:25
Цитата Сообщение от Maluda Посмотреть сообщение
Дракон бежит
Код C++
1
bbAnimateMD2(World3D.my_dragon, 1, .05, 40, 46);
Дракон прыгает
Код C++
1
bbAnimateMD2(World3D.my_dragon, 1, .05, 66, 72);
А так он изнемогает от жажды
C++
1
bbAnimateMD2(World3D.my_dragon, 1, .05, 100, 72);
0
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
31.05.2011, 16:51  [ТС]
Скачал наконец нормальную версию SDK, пример заработал!

Теперь такой вопрос: есть ли русскоязычный подробный учебник, по тому как и что делать)

Например нужно сделать следующее: создать 3Д модель некоторого учебного стенда, который показывает как работает автоматизированное отопление. Т.е. трубы всякие, агрегаты, батареи ... в некоторых местах трубы имеют вырезы, где показывает как течет вода. При этом в некоторых пустых местах должны быть компоненты типа TEdit или TLabel в которые выводится информация поступающая от этого стенда.

p.s. Программа уже есть, по сути в нее просто нужно добавить элементы 3Д ... Завтра покажу скрин, как выглядит эта прога, чтоб было более понятно о чем речь...

Просто стоит вопрос, стоит ли браться за изучения Blitz3D... И если стоит, то на сколько сложно это все реализуемо.
0
 Аватар для QVO
652 / 462 / 80
Регистрация: 26.10.2010
Сообщений: 1,263
Записей в блоге: 4
31.05.2011, 17:01
Вроде на http://www.blitz3d.net/ что-то есть

http://www.turbobit.net/o8j3qlwdnbb3.html
1
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
31.05.2011, 19:12  [ТС]
Полистал статьи... понял что они именно по Blitz ... и ни одной статьи по совмещению с С++ ...
0
 Аватар для QVO
652 / 462 / 80
Регистрация: 26.10.2010
Сообщений: 1,263
Записей в блоге: 4
31.05.2011, 19:42
я вообще туго вникаю
0
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
31.05.2011, 19:51  [ТС]
Чисто для себя инфа интересная, как работы поменьше будет, думаю заняться изучением... но на данный момент нужно совместить Билдер с 3Д графикой, GLScene была бы идеальным вариантом, но она не работает почему то... только старарая версия, в которой нет нужных функций...
0
 Аватар для Maluda
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
01.06.2011, 00:04
Лучший ответ Сообщение было отмечено как решение

Решение

Blitz 3d - это самый лёгкий движок, который я знаю.

Потом, если вы хотите изучить трёхмерку - это вам не формы шлёпать и не кнопки на них бросать.
Это уже программирование в чистом виде.

1. Разберите внимательно все примеры.
2. Поймите, что в них происходит.

Здесь нет ничего сверхъестественного.

Затем, внимательно изучите весь SDK,
перечитайте весь этот файл Blitz3DSDK.html
Он должен лежать в корне

Добавлено через 57 секунд
Там же всё элементарно, например

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
C++ Programming
 
The following is a simple C++ application featuring a rotating cube using the Blitz3DSDK library.
 
#include <windows.h>
 
#include "blitz3dsdk.h"
 
extern int WINAPI WinMain(HINSTANCE hThisInst,HINSTANCE hPrevInst,LPSTR lpszArgs,int nWinMode){
 
    bbBeginBlitz3D();
 
    bbGraphics3D(800,600,0,2);
 
    BBLight light=bbCreateLight();
    BBCamera camera=bbCreateCamera();
    BBMeshModel cube=bbCreateCube();
 
    bbPositionEntity(camera,0,0,-4);
 
    while (!bbKeyHit(1)){
        bbTurnEntity(cube,1,2,3);
        bbRenderWorld();
        bbFlip();
    }
 
    bbEndBlitz3D();
    return 0;
}
Добавлено через 21 секунду
Что здесь может быть непонятно???

Добавлено через 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
        // инициализация движка
        bbBeginBlitz3D();
 
        // создание графического окна 800 пикселей на 600
        bbGraphics3D(800,600,0,2);
 
        // создание источника света
        BBLight light=bbCreateLight();
        
        // создание камеры
        BBCamera camera=bbCreateCamera();
        
        // создание 3Д примитива
        BBMeshModel cube=bbCreateCube();
 
        // установка камеры в глобальных координатах
        bbPositionEntity(camera,0,0,-4);
 
        // запуск рендера, пока не будет нажата клавиша ESCAPE 
        while (!bbKeyHit(1)){
                // функция, которая вращает модель
                bbTurnEntity(cube,1,2,3);
                // функция, которая отрисовывает 3Д сцену
                bbRenderWorld();
                // обмен буфера (в одном буфере строится сцена, затем готовый буфер меняется новым)
                bbFlip();
        }
        // остановка работы с движком 
        bbEndBlitz3D();
Добавлено через 2 часа 56 минут
Итак, я понял, что стандартные примеры из SDK очень плохо представлены,
поэтому полностью переработал самый лучший пример про самолётик и очень тщательно задокументировал!

Итак, создаём чистый проект, на форму бросаем кнопку

Создаём файл "Xplayer.h"
Копируем один к одному
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
#ifndef TXPlayer_H
#define TXPlayer_H
 
#include "blitz3dsdk.h"
 
// тип управления объектом
enum TControlMode {
    ctrlMouse = 1, ctrlJoystic
};
 
// тип привязки камеры
enum TCameraMode {
    cmCamAfterObject = 1, cmCamBesideObject, cmCamFromObject, cmCamWithoutObject
};
 
// структура, описывающая данные игрока
struct xplayer {
    // сам 3Д узел
    BBEntity entity;
    // камера, привязанная к объекту
    BBCamera camera;
    // режим управления - камера или джойстик
    TControlMode ControlMode;
    // режим положения камеры - за объектом, возле объекта, камера смотрит из объекта, камера отдельно от объекта
    TCameraMode CameraMode;
    // ускорение
    int ignition;
    // тангаж, курс, скорость по тангажу, скорость по курсу, крен, скольжение
    float pitch, yaw, pitch_speed, yaw_speed, roll, thrust;
    // указатель на следующего игрока
    xplayer *next;
};
 
// статический класс игры
class TXPlayer {
private:
    // список игроков
    static xplayer *xplayerlist;
 
    // функция по загрузке сцены
    static BBTerrain CreateXScene();
 
    // загрузка карты высот
    static BBPivot LoadXPlane(const char *file);
 
    // создание игрока, где
    // ............. BBPivot plane                          - ось центра координат 3Д модели
    // ............. int vp_x, int vp_y, int vp_w, int vp_h - размеры окна (ViewPort) текущего игрока
    // ............. TControlMode AControlMode              - тип управления игроком (джойстик или мышка)
    // ............. BBTerrain terr                         - поверхность, к которой будет привязан объект
    static xplayer *CreateXPlayer(BBPivot plane, int vp_x, int vp_y, int vp_w,
        int vp_h, TControlMode AControlMode, BBTerrain terr);
 
    // обновление данных игроков
    static void UpdateXPlayers();
 
protected:
 
public:
    // вызов игры из класса
    static void xfighter();
};
 
#endif // TXPlayer_H
Добавлено через 1 минуту
Создаём файл "Xplayer.cpp"

Один к одному копируем вот это
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
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
#include <vcl.h>
#pragma hdrstop
 
#include "Xplayer.h"
 
// инициализируем список игроков
xplayer *TXPlayer::xplayerlist = 0;
 
// *********************** xfighter *******************************
 
// загрузка сцены
BBTerrain TXPlayer::CreateXScene() {
    // установка источника освещения
    BBLight l = bbCreateLight();
    // поворот его по тангажу - 45, курсу - 45, крену - 0
    bbRotateEntity(l, 45, 45, 0);
    // установка света окружающей среды, в значениях R G B
    // по умолчанию 127 127 127
    bbAmbientLight(32, 32, 32);
 
    // Загрузка местности из файла карты высот
    BBTerrain terr = bbLoadTerrain("media/xfighter/hmap_1024.bmp");
    // масштабирование местности
    // увеличение по оси X в 20 раз, по оси Y в 800 раз, по оси Z в 20 раз
    bbScaleEntity(terr, 20, 800, 20);
    // установка местности в глобальных координатах
    // X = -20*512
    // Y = 0
    // Z = -20*512
    bbPositionEntity(terr, -20*512, 0, -20*512);
    // установка для объекта флага ПОЛНОЕ ОСВЕЩЕНИЕ
    bbEntityFX(terr, 1);
    // установка типа коллизии (столкновения для этого узла - местности)
    bbEntityType(terr, 10);
 
    // применение текстуры к местности
    // загрузка текстуры
    BBTexture tex1 = bbLoadTexture("media/xfighter/coolgrass2.bmp", 1);
    // масштабирование
    bbScaleTexture(tex1, 10, 10);
    // загрузка текстуры
    BBTexture tex2 = bbLoadTexture("media/xfighter/lmap_256.bmp");
    // масштабирование
    bbScaleTexture(tex2, bbTerrainSize(terr), bbTerrainSize(terr));
    // применение текстуры tex1 к местности
    bbEntityTexture(terr, tex1, 0, 0);
    // применение текстуры tex2 к местности
    bbEntityTexture(terr, tex2, 0, 1);
 
    // создание плоскости земли
    BBPlaneModel plane = bbCreatePlane();
    bbScaleEntity(plane, 20, 1, 20);
    bbPositionEntity(plane, -20*512, 0, -20*512);
    bbEntityTexture(plane, tex1, 0, 0);
    bbEntityOrder(plane, 3);
    bbEntityFX(plane, 1);
    bbEntityType(plane, 10);
 
    // создание облаков
    BBTexture tex = bbLoadTexture("media/xfighter/cloud_2.bmp", 3);
    bbScaleTexture(tex, 1000, 1000);
    BBPlaneModel p = bbCreatePlane();
    bbEntityTexture(p, tex);
    bbEntityFX(p, 1);
    bbPositionEntity(p, 0, 450, 0);
    p = bbCopyEntity(p);
    bbRotateEntity(p, 0, 0, 180);
 
    // создание воды
    BBTexture tex3 = bbLoadTexture("media/xfighter/water-2_mip.bmp", 3);
    bbScaleTexture(tex3, 10, 10);
    BBPlaneModel p1 = bbCreatePlane();
    bbEntityTexture(p1, tex3);
    bbEntityBlend(p1, 1);
    bbEntityAlpha(p1, .75);
    bbPositionEntity(p1, 0, 10, 0);
    bbEntityFX(p1, 1);
 
    return terr;
}
 
// главная функция вызова по работе с классом
void TXPlayer::xfighter() {
    // загрузка 3Д окна
    bbGraphics3D(960, 540, 0, 6);
    // включение антиалиазинга
    bbAntiAlias(BBTRUE);
 
    // установка коллизий
    bbCollisions(1, 10, 2, 2); // sphere-to-polygon, colliding collisions
 
    // создаём местность
    BBTerrain terr = CreateXScene();
 
    // загружаем модель самолётика
    BBPivot plane = LoadXPlane("media/xfighter/biplane.x");
 
    // создаём игрока
    xplayer *player1 = CreateXPlayer(plane, 0, 0, bbGraphicsWidth(),
        bbGraphicsHeight(), ctrlMouse, terr);
 
    // вводим переменную ФПС
    const float FPS = 30;
 
    int period = 1000 / FPS;
    int time = bbMilliSecs() - period;
 
    // деталировка местности, количество треугольников
    int detail = 2000;
    // включить трансформацию вершин (плавность переходов)
    int morph = 1;
 
    // устанавливаем деталировку земли
    bbTerrainDetail(terr, detail, morph);
 
    // переменная, которая будет отвечать за включение-выключение 3Д каркаса
    int wire = 0;
 
    // пока не нажата клавиша ESCAPE
    while (!bbKeyHit(KEY_ESCAPE)) {
        int elapsed;
        do {
            // считаем, сколько времени прошло
            elapsed = bbMilliSecs() - time;
        }
        while (elapsed == 0);
 
        // сколько 'frames(кадров)' пропущено
 
        int ticks = (int)elapsed / period;
 
        // tween based render
 
        float tween = float(elapsed % period) / float(period);
        for (int k = 1; k <= ticks; k++) {
            if (k == ticks)
            { /* делаем захват 3Д сцены, включая положение, поворот, масштаб и альфа-канал всех объектов.
                 эта команда используется при двойной буферизации
                 Часто игра разрабатывается таким образом, чтобы обновление элементов управления и физики происходили при низких частотах, примерно 10 раз в секунду, в целях сокращения нагрузки на сеть и процессор.
                 Вызов bbCaptureWorld после такого обновления, позволяет заполнить пробелы отрисовки, которые появляются со времени последнего bbUpdateWorld.
                 Отдельно стоящие вертексы не захватываются командой CaptureWorld и поэтому VertexCoords анимации должны быть анимированы вручную.
                 */
 
                bbCaptureWorld();
            }
            time = time + period;
            // обновляем данные об игроках
            UpdateXPlayers();
            // обновляем 3Д сцену
            bbUpdateWorld();
        }
 
        // каркас 3Д сцены будет включаться клавишей W
        if (bbKeyHit(KEY_W)) {
            wire = !wire;
            bbWireFrame(wire);
        }
 
        // левой скобкой в англ. раскладке уменьшаем деталировку земли
        if (bbKeyHit(KEY_LEFTBRACKET)) {
            detail = detail - 100;
            if (detail < 100)
                detail = 100;
            bbTerrainDetail(terr, detail, morph);
        } // правой скобкой увеличиваем
        else if (bbKeyHit(KEY_RIGHTBRACKET)) {
            detail = detail + 100;
            if (detail > 10000)
                detail = 10000;
            bbTerrainDetail(terr, detail, morph);
        }
 
        // включение-выключение морфинга вершин
        if (bbKeyHit(KEY_M)) {
            morph = !morph;
            bbTerrainDetail(terr, detail, morph);
        }
        // визуализация сцены за период tween
        bbRenderWorld(tween);
 
        // отрисовка 2Д текста
        // текст будет красного цвета
        bbColor(255, 0, 0);
        const AnsiString sText2D = "Detail:" + AnsiString(detail) + " Morph:" +
            AnsiString(morph == true ? "Y" : "N");
        bbText(0, 0, sText2D.c_str());
 
        // переключение переднего и заднего буфера
        bbFlip();
    }
}
 
// обновление данных игроков
void TXPlayer::UpdateXPlayers() {
    xplayer *p;
    // проходимся, по списку игроков
    for (p = xplayerlist; p; p = p->next) {
        int x_dir = 0, y_dir = 0, z_dir = 0;
        // режим управления
        switch (p->ControlMode) {
        case ctrlMouse:
            if (bbKeyDown(KEY_LEFT))
                x_dir = -1;
            if (bbKeyDown(KEY_RIGHT))
                x_dir = 1;
 
            if (bbKeyDown(KEY_UP))
                y_dir = -1;
            if (bbKeyDown(KEY_DOWN))
                y_dir = 1;
 
            if (bbKeyDown(KEY_A))
                z_dir = 1;
            if (bbKeyDown(KEY_Z))
                z_dir = -1;
 
            // изменение положения привязки камеры к объекту
            if (bbKeyHit(KEY_F1))
                p->CameraMode = cmCamAfterObject;
            if (bbKeyHit(KEY_F2))
                p->CameraMode = cmCamBesideObject;
            if (bbKeyHit(KEY_F3))
                p->CameraMode = cmCamFromObject;
            if (bbKeyHit(KEY_F4))
                p->CameraMode = cmCamWithoutObject;
            break;
 
            // если подключен джойстик
        case ctrlJoystic:
            x_dir = bbJoyXDir();
            y_dir = bbJoyYDir();
            if (bbJoyDown(1))
                z_dir = 1;
            if (bbJoyDown(2))
                z_dir = -1;
 
            if (bbKeyHit(63))
                p->CameraMode = cmCamAfterObject;
            if (bbKeyHit(64))
                p->CameraMode = cmCamBesideObject;
            if (bbKeyHit(65))
                p->CameraMode = cmCamFromObject;
            if (bbKeyHit(66))
                p->CameraMode = cmCamWithoutObject;
            break;
        }
 
        // рассчитываем ускорения поворота по курсу
        if (x_dir < 0) {
            p->yaw_speed = p->yaw_speed + (4 - p->yaw_speed) * .04;
        }
        else {
            if (x_dir > 0) {
                p->yaw_speed = p->yaw_speed + (-4 - p->yaw_speed) * .04;
            }
            else {
                p->yaw_speed = p->yaw_speed + (-p->yaw_speed) * .02;
            }
        }
 
        // рассчитываем ускорения поворота по тангажу
        if (y_dir < 0) {
            p->pitch_speed = p->pitch_speed + (2 - p->pitch_speed) * .2;
        }
        else {
            if (y_dir > 0) {
                p->pitch_speed = p->pitch_speed + (-2 - p->pitch_speed) * .2;
            }
            else {
                p->pitch_speed = p->pitch_speed + (-p->pitch_speed) * .1;
            }
        }
 
        // угол поворота по курсу
        p->yaw = p->yaw + p->yaw_speed;
        if (p->yaw < -180)
            p->yaw = p->yaw + 360;
        if (p->yaw >= 180)
            p->yaw = p->yaw - 360;
 
        // угол поворота по тангажу
        p->pitch = p->pitch + p->pitch_speed;
        if (p->pitch < -180)
            p->pitch = p->pitch + 360;
        if (p->pitch >= 180)
            p->pitch = p->pitch - 360;
 
        p->roll = p->yaw_speed * 30;
        // поворачиваем объект в трёх плоскостях
        bbRotateEntity(p->entity, p->pitch, p->yaw, p->roll);
 
        // меняем ускорение
        if (p->ignition) {
            if (z_dir > 0) { // faster?
                p->thrust = p->thrust + (1.5 - p->thrust) * .04; // '1.5
            }
            else {
                if (z_dir < 0) { // slower?
                    p->thrust = p->thrust + (-p->thrust) * .04;
                }
            }
            bbMoveEntity(p->entity, 0, 0, p->thrust);
        }
        else {
            if (z_dir > 0)
                p->ignition = 1;
        }
 
        // если назначена камера объекту (игроку, самолётику в нашем случае)
        if (p->camera) {
            // в зависимости от положения камеры
            switch (p->CameraMode) {
            case cmCamAfterObject:
                    // присоединяем камеру к объекту
                    bbEntityParent(p->camera, p->entity);
                // поворачиваем камеру по курсу
                bbRotateEntity(p->camera, 0, p->yaw, 0, BBTRUE);
                // задаём камере положение
                bbPositionEntity(p->camera, bbEntityX(p->entity),
                    bbEntityY(p->entity), bbEntityZ(p->entity), BBTRUE);
                bbMoveEntity(p->camera, 0, 1, -5);
                // подстраиваем курс и тангаж
                bbPointEntity(p->camera, p->entity, p->roll / 2);
                break;
            case cmCamBesideObject:
                    // отсоединяем камеру от объекта
                    bbEntityParent(p->camera, 0);
                bbPositionEntity(p->camera, bbEntityX(p->entity),
                    bbEntityY(p->entity), bbEntityZ(p->entity));
                bbTranslateEntity(p->camera, 0, 1, -5);
                bbPointEntity(p->camera, p->entity, 0);
                break;
            case cmCamFromObject:
                    // присоединяем камеру к объекту
                    bbEntityParent(p->camera, p->entity);
                bbPositionEntity(p->camera, 0, .25, 0);
                bbRotateEntity(p->camera, 0, 0, 0);
                break;
            case cmCamWithoutObject:
                    // отсоединяем камеру от объекта
                    bbEntityParent(p->camera, 0);
                bbPointEntity(p->camera, p->entity, 0);
                break;
            }
        }
    }
}
 
BBPivot TXPlayer::LoadXPlane(const char *file) {
    // загружаем центр осей
    BBPivot pivot = bbCreatePivot();
    // создаём каркас, загружая данные из файла и привязываем к нему центр осей
    BBMeshModel plane = bbLoadMesh(file, pivot);
    // масштабируем, делая более сферичным
    bbScaleMesh(plane, .125, .25, .125); // make it more spherical!
    // поворачиваем на 180 по курсу
    bbRotateEntity(plane, 0, 180, 0); // and align to z axis
    // устанавливаем радиус действия коллизии (в данном случае он будет сферичным)
    bbEntityRadius(pivot, 1);
    // указваем коллизию
    bbEntityType(pivot, 1);
    // прячем центр осей
    bbHideEntity(pivot);
    // возвращаем центр осей, так как движок будет двигать именно его
    return pivot;
}
 
xplayer *TXPlayer::CreateXPlayer(BBPivot plane, int vp_x, int vp_y, int vp_w,
    int vp_h, TControlMode AControlMode, BBTerrain terr) {
    // создаём новый экземпляр структуры
    xplayer *p = new xplayer;
    // указатель на следующего игрока
    p->next = xplayerlist;
    // в данном примере будет только один игрок, поэтому пока сделаем замыкание
    xplayerlist = p;
 
    // заполняем данные текущего игрока
    // тип управления
    p->ControlMode = AControlMode;
    // тип привязки камеры
    p->CameraMode = cmCamAfterObject;
    float x = AControlMode * 10;
    float z = AControlMode * 10 - 2500;
    // объектом нашего игрока будет самолётик, копируем 3Д модель
    p->entity = bbCopyEntity(plane);
    // ускорение
    p->ignition = 0;
    // тангаж
    p->pitch = 0.0f;
    // курс
    p->yaw = 0.0f;
    // скорость поворота по тангажу
    p->pitch_speed = 0.0f;
    // скорость поворота по курсу
    p->yaw_speed = 0.0f;
    // крен
    p->roll = 0.0f;
    // скольжение
    p->thrust = 0.0f;
    // устанавливаем пространственное положение нашего объекта
    bbPositionEntity(p->entity, x, bbTerrainY(terr, x, 0, z) + 50, z);
    bbRotateEntity(p->entity, 0, 180, 0);
    bbResetEntity(p->entity);
    // устанавливаем камеру
    p->camera = bbCreateCamera(p->entity);
    // перемещаем её в исходную позицию
    bbPositionEntity(p->camera, 0, 3, -10);
    // определяем окно камеры
    bbCameraViewport(p->camera, vp_x, vp_y, vp_w, vp_h);
    bbCameraClsColor(p->camera, 0, 192, 255);
    // делаем туманчик
    bbCameraFogColor(p->camera, 0, 192, 255);
    // диапазон тумана
    bbCameraFogRange(p->camera, 1000, 3000);
    // устанавливаем дальность видимости
    bbCameraRange(p->camera, 1, 3000);
    // CameraZoom p\camera,1.5
    // if(use_fog) bbCameraFogMode(p->camera,1);
    return p;
}
Добавлено через 3 минуты
В главной форме формируете обработчик события у кнопки,
подключаете файл #include "XPlayer.h"

ПАПКА media по-прежнему должна быть в корне с exe-шником

должно получиться всего лишь вот так:
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
// ---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "UnitBlitzLesson.h"
#include "blitz3dsdk.h"
#include "XPlayer.h"
// ---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
 
// ---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) {
}
 
// ---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender) {
    // инициализация движка
    bbBeginBlitz3D();
    // вызов функции из примера
        // выход из 3Д графики по ESCAPE
    TXPlayer::xfighter();
    // остановка работы с движком
    bbEndBlitz3D();
}
// ---------------------------------------------------------------------------
3
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
01.06.2011, 08:15  [ТС]
Цитата Сообщение от Maluda Посмотреть сообщение
1. Разберите внимательно все примеры.
2. Поймите, что в них происходит.
Здесь нет ничего сверхъестественного.
Затем, внимательно изучите весь SDK,
перечитайте весь этот файл Blitz3DSDK.html
Обязательно прочитаю, и попробую разобраться... Просто времени очень мало на воплощение проекта....

Стандартные примеры, это хорошо конечно, но вот как с 0 полностью все свое сделать. Хотя конечно это тоже только вопрос времени. Интересует, как использовать обычные компоненты типа ComboBox, Edit ... Без них, смысла нет начинать изучать.

Добавлено через 52 минуты
Еще такой вопрос, как быть с переносом на "пустой" комп ? я знакомому дал протестировать, у него не запускается, пишет что файл rtl60.bpl не найден
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.06.2011, 08:15
Помогаю со студенческими работами здесь

Для работы с графикой
Ребята, помогите подобрать компьютер для работы с графикой. Основные программы: Illustrator CS5, планируется перейти на версию CC ...

приложение, для работы с графикой
Доброго времени суток. Хочу написать простую программу, главным образом для применения фильтров к изображениям. + простые трансформации....

Настольный ПК для работы с графикой
Выбираю многозадачный компьютер для дома. Из требовательных задач много работаю с фото, кодирую видео. Изредка 3Д-графика. В игры не играю....

Компьютер для работы с графикой
Добрый день всем! Нужна помощь в подборе конфигурации системника без монитора для дизайнерской работы. Цена 25000-30000 р. или 6000...

Конфигурация для работы с графикой
Собираю комп для работы с графикой, CorelDRAW, Photoshop.... в 3D НЕ работаю, в игры НЕ играю.. После долгих раздумий у меня выстроилась...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru