Форум программистов, компьютерный форум, киберфорум
Программирование графики
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
0 / 0 / 4
Регистрация: 21.08.2017
Сообщений: 208

Изменение текстуры куба и сферы через системный проводник и библиотеку материалов в C++ Builder

30.10.2019, 18:50. Показов 1525. Ответов 1

Студворк — интернет-сервис помощи студентам
Добрый вечер! Я прохожу текстуры и библиотеку материалов GLMaterialLibrary. У меня есть программа с формой, полотном, геометрическими фигурами (кубом и сферой), источниками освещения и библиотекой материалов. Я сделал меню для куба и сферы с возможностями сфокусироваться на объекте, убрать фокус и поменять текстуру. Моя идея - по нажатии на команду меню открыть стандартный проводник OpenDialog, выбрать нужное изображение и после подтверждения назначить для куба библиотеку материалов, создать у неё новый объект и прописать у него в свойствах текстуры выбранное изображение, причём не напрямую, а через GLMaterialLibrary. Я воспользовался примером из методички, но компилятор выдал ошибки. Подскажите, что и где нужно заменить.

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
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "GLBaseClasses"
#pragma link "GLCoordinates"
#pragma link "GLCrossPlatform"
#pragma link "GLObjects"
#pragma link "GLScene"
#pragma link "GLWin32Viewer"
#pragma link "GLCadencer"
#pragma link "GLKeyboard"
#pragma link "GLMaterial"
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::GoToTheCube1Click(TObject *Sender)
{
GLSceneViewer1->Camera=GLCamera1;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::GoToTheSphere1Click(TObject *Sender)
{
GLSceneViewer1->Camera=GLCamera2;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::NotFocus1Click(TObject *Sender)
{
GLSceneViewer1->Camera=NULL;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::NotFocus2Click(TObject *Sender)
{
GLSceneViewer1->Camera=NULL;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::GLCadencer1Progress(TObject *Sender, const double deltaTime,
          const double newTime)
{
GLCube1->Turn(deltaTime*10);
GLSphere1->Turn(deltaTime*10);
//Движение вперед по клавишам ‘ц’ и’ w’
if (IsKeyDown('ц') || IsKeyDown('w')) { GLSceneViewer1->Camera->Move(2*deltaTime); }
//Движение назад по клавишам ‘ы’ и ‘s’
if (IsKeyDown('ы') || IsKeyDown('s')) { GLSceneViewer1->Camera->Move(-2*deltaTime); }
//Поворот влево по клавишам ‘ф’ и’ a’
if (IsKeyDown('ф') || IsKeyDown('a')) { GLSceneViewer1->Camera->Slide(-2*deltaTime); }
//Поворот вправо по клавишам ‘в’ и ‘d’
if (IsKeyDown('в') || IsKeyDown('d')) { GLSceneViewer1->Camera->Slide(2*deltaTime); }
//Движение вверх по клавишам ‘u’ и ‘г’
if (IsKeyDown('u') || IsKeyDown('г')) { GLSceneViewer1->Camera->Lift(0.01); }
//Движение вниз по клавишам ‘n’ и ‘т’
if (IsKeyDown('n') || IsKeyDown('т')) { GLSceneViewer1->Camera->Lift(-0.01); }
if (IsKeyDown('c') || IsKeyDown('с')) { GLSceneViewer1->Camera=GLCamera1; }
if (IsKeyDown('v') || IsKeyDown('м')) { GLSceneViewer1->Camera=GLCamera2; }
if (IsKeyDown('b') || IsKeyDown('и')) { GLSceneViewer1->Camera=NULL; }
 
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormMouseWheel(TObject *Sender, TShiftState Shift, int WheelDelta,
          TPoint &MousePos, bool &Handled)
{
if(GLSceneViewer1->MouseInControl==true) GLSceneViewer1->Camera->AdjustDistanceToTarget(Power(1.1,-WheelDelta/120));
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::LoadImageOnCube1Click(TObject *Sender)
{
if(OpenDialog1->Execute())
{
GLCube1->Material->MaterialLibrary = GLMaterialLibrary1;
GLMaterialLibrary1->Materials->Add
{
Name = 'CubeTexture';
Material–>Texture–>Image–>LoadFromFile(OpenDialog1->FileName);
Material–>Texture–>TextureMode = tmModulate;
Material–>BlendingMode = bmTransparency;
Material–>Texture–>Disabled = False;
}
}
}
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
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
#include "GLBaseClasses.hpp"
#include "GLCoordinates.hpp"
#include "GLCrossPlatform.hpp"
#include "GLObjects.hpp"
#include "GLScene.hpp"
#include "GLWin32Viewer.hpp"
#include "GLKeyboard.hpp"
#include "Math.hpp"
#include <Vcl.Menus.hpp>
#include "GLCadencer.hpp"
#include "GLMaterial.hpp"
#include <Vcl.Dialogs.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
    TGLScene *GLScene1;
    TGLSceneViewer *GLSceneViewer1;
    TGLCamera *GLCamera1;
    TGLCube *GLCube1;
    TGLSphere *GLSphere1;
    TGLCamera *GLCamera2;
    TGLLightSource *GLLightSource1;
    TGLLightSource *GLLightSource2;
    TMainMenu *MainMenu1;
    TMenuItem *Cube1;
    TMenuItem *Sphere1;
    TMenuItem *GoToTheCube1;
    TMenuItem *NotFocus1;
    TMenuItem *GoToTheSphere1;
    TMenuItem *NotFocus2;
    TGLCadencer *GLCadencer1;
    TOpenDialog *OpenDialog1;
    TGLMaterialLibrary *GLMaterialLibrary1;
    TMenuItem *LoadImageOnCube1;
    TMenuItem *LoadImageOnSphere1;
    void __fastcall GoToTheCube1Click(TObject *Sender);
    void __fastcall GoToTheSphere1Click(TObject *Sender);
    void __fastcall NotFocus1Click(TObject *Sender);
    void __fastcall NotFocus2Click(TObject *Sender);
    void __fastcall GLCadencer1Progress(TObject *Sender, const double deltaTime, const double newTime);
    void __fastcall FormMouseWheel(TObject *Sender, TShiftState Shift, int WheelDelta,
          TPoint &MousePos, bool &Handled);
    void __fastcall LoadImageOnCube1Click(TObject *Sender);
 
private:    // User declarations
public:     // User declarations
    __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
И вдобавок - почему не работает клавиатура, хотя библиотека GLKeyboard везде прописана?

Ошибки:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Checking project dependencies...
Compiling Project1.cbproj (Debug, Win32)
bcc32 command line for "Unit1.cpp"
  c:\program files (x86)\embarcadero\studio\20.0\bin\bcc32.exe -D_DEBUG -DUSEPACKAGES -n.\Win32\Debug -I"c:\program files 
  (x86)\embarcadero\studio\20.0\include\windows\vcl";"c:\program files (x86)\embarcadero\studio\20.0\include";"c:\program files 
  (x86)\embarcadero\studio\20.0\include\dinkumware";"c:\program files (x86)\embarcadero\studio\20.0\include\windows\crtl";"c:\program files 
  (x86)\embarcadero\studio\20.0\include\windows\sdk";"c:\program files (x86)\embarcadero\studio\20.0\include\windows\rtl";"c:\program files 
  (x86)\embarcadero\studio\20.0\include\windows\vcl";"c:\program files (x86)\embarcadero\studio\20.0\include\windows\fmx";
  C:\Users\Public\Documents\Embarcadero\Studio\20.0\hpp\Win32;D:\GLScene\include\win32;C:\Users\Public\Documents\Embarcadero\Studio\20.0\hpp\Win32 -y 
  -Q -k -r- -c -tR -tM -tU -tW -C8 -o.\Win32\Debug\Unit1.obj -w-par -Od -v -vi- -H=.\Win32\Debug\Project1.pch -H Unit1.cpp 
[bcc32 Error] Unit1.cpp(82): E2235 Member function must be called or its address taken
  Full parser context
    Unit1.cpp(77): parsing: void _fastcall TForm1::LoadImageOnCube1Click(TObject *)
[bcc32 Error] Unit1.cpp(82): E2379 Statement missing ;
  Full parser context
    Unit1.cpp(77): parsing: void _fastcall TForm1::LoadImageOnCube1Click(TObject *)
[bcc32 Warning] Unit1.cpp(83): W8098 Multi-character character constant
  Full parser context
    Unit1.cpp(77): parsing: void _fastcall TForm1::LoadImageOnCube1Click(TObject *)
[bcc32 Error] Unit1.cpp(83): E2129 Character constant too long (or empty)
  Full parser context
    Unit1.cpp(77): parsing: void _fastcall TForm1::LoadImageOnCube1Click(TObject *)
Failed
Elapsed time: 00:00:04.5
Миниатюры
Изменение текстуры куба и сферы через системный проводник и библиотеку материалов в C++ Builder   Изменение текстуры куба и сферы через системный проводник и библиотеку материалов в C++ Builder   Изменение текстуры куба и сферы через системный проводник и библиотеку материалов в C++ Builder  

Изменение текстуры куба и сферы через системный проводник и библиотеку материалов в C++ Builder   Изменение текстуры куба и сферы через системный проводник и библиотеку материалов в C++ Builder   Изменение текстуры куба и сферы через системный проводник и библиотеку материалов в C++ Builder  

Изменение текстуры куба и сферы через системный проводник и библиотеку материалов в C++ Builder  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.10.2019, 18:50
Ответы с готовыми решениями:

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

Пересечение сферы и куба
Дано: пересекаются сфера (радиус R, координаты центра x1,y1,z1) и куб (длина ребра L, координаты центра x2,y2,z2). Найти: или площадь...

Привязка текстуры к определенной точке сферы
Ситуация следующая: отображается сфера (с помощью gluSphere()), загружается текстура (glTexImage2D), натягивается на половину сферы с...

1
1741 / 913 / 480
Регистрация: 05.12.2013
Сообщений: 3,074
01.11.2019, 17:49
СюдЯ по ошибкам там опечатки, проверьте внимательно исходники
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.11.2019, 17:49
Помогаю со студенческими работами здесь

Разработать приложение, позволяющее изображать на форме имитацию сферы , куба
как эту программу сделать попроще без кода за 100 строчек ? Разработать приложение, позволяющее изображать на форме имитацию сферы...

Нанесение текстуры на два куба разного размера
Здравствуйте,такой вопрос,переношу одну текстуру на два куба(один длиннее другого),когда настраиваю ее,настраивается на всех,как сделать...

Как установить таймер в этом коде на управление автоматическим сжатием/увеличением сферы и куба
Private Function Center_X(Width As Integer) As Integer Center_X = Width \ 2 'процедура для нахождения центра по оси x End...

Написание функции для создания точек внутри куба и сферы: перевод кода из C++ в Delphi
Добрый день! В лабораторной работе мне дали задание - создать три трекбара и поместить тысячу точек внутри куба и сферы с кодом на C++: ...

Как наложить разные текстуры на разные грани одного и того же куба?
ЗДРАВСТВУЙТЕ! Подскажите пожалуйста как наложить разные текстуры на разные грани одного и тогоже куба?


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru