Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Программирование графики > Изменение текстуры куба и сферы через системный проводник


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

CPP-файл:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    #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-файл:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    #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 везде прописана?

Ошибки:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    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


Картинки здесь:
http://www.cyberforum.ru/attachments/1079318d1572450455
http://www.cyberforum.ru/attachments/1079319d1572450455
http://www.cyberforum.ru/attachments/1079320d1572450455
http://www.cyberforum.ru/attachments/1079321d1572450455
http://www.cyberforum.ru/attachments/1079322d1572450455
http://www.cyberforum.ru/attachments/1079323d1572450500
http://www.cyberforum.ru/attachments/1079324d1572450500

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)