deepla deepla

Development of useful applet application.

トップ > 開発メモ - Lazarus > コンポーネント - GLScene

コンポーネント - GLScene

LazarusでOpenGLの操作ができるコンポーネントです

ライセンス

MPL(Mozilla Public License)

GLScene(OpenGLベースのライブラリ)の準備

インストールの前に

Linuxの場合、OpenGLがインストールされていなければ、インストールします

$ sudo apt-get install libglu1-mesa-dev
参考: http://forum.lazarus-ide.org/index.php?topic=5991.0

問題

GLSceneをインストールするとエラーが発生する(Ubuntu系20.04以降)

現象

以下のメッセージが表示されてインストールできない

lazarus.pp(165,1) Error: Error while linking

原因

デフォルトでlibxxf86vm-devパッケージが入っていない為

対策

端末で以下のコマンドを実行し、libxxf86vm-devパッケージをインストールします

$ sudo apt install libxxf86vm-dev
参考: https://www.pascalgamedevelopment.com/archive/index.php/t-6911.html

テクスチャーを利用するとLazarusが強制終了する(Ubuntu系20.04以降)

対策

端末で下記のコマンドを実行します

$ sudo ln -s /usr/lib/x86_64-linux-gnu/libGL.so.1 /usr/lib/libGL.so
参考: https://forum.lazarus.freepascal.org/index.php?topic=46771.0

インストール

オンラインパッケージマネージャーのGLSceneは古いので、以下の別バージョンのいずれかをインストールします

別バージョン

表示する

インストールの方法(v1.6)

  1. 以下のホームページよりGLSceneをダウンロードし、任意のライブラリフォルダへ解凍します

    https://sourceforge.net/p/glscene/code/HEAD/tree/branches/GLSceneLCL/

  2. ファイルを修正します

    ファイル: Sourse\GLViewer.pas
    変更行: 41行付近
    変更内容:

    	TGLSceneViewer = class(GLLCLViewer.TGLSceneViewer)
    	Public
    	  {$IFDEF MSWINDOWS} // [追加]
    	  class procedure WSRegisterClass; override;
    	  {$ENDIF} // [追加]
    	end;
    

    ファイル:Sourse\DesignTime\GLSceneForm.pas
    変更行: 230行付近
    変更内容:

        if Registered then
          Exit;
        inherited WSRegisterClass;
        {$IFDEF MSWINDOWS} // [追加]
        RegisterWSComponent(TGLSceneForm, TGLSOpenGLForm);
        {$ENDIF} // [追加]
        Registered := True;  
    

  3. Windowsの場合、\GLSceneLCL\externalにあるSetup.batを管理者権限で実行し、補助のダイナミックライブラリ(.dll)をC:\Windows\System32とC:\Windows\SysWOW64ディレクリィにコピーします
  4. コンポーネントのコンパイル及びインストール (BASS, FMOD, CGShader, ODE, NewtonはWindowsのみサポートされています)
    Lazarusを起動し、GLSceneLCL/Packagesディレクトリ内の以下のコンポーネント(.lpk)をコンパイル及びインストールします

    GLScene_Runtimeパッケージ: [開く]→[コンパイル]
    GLScene_DesignTimeパッケージ: [開く]→[インストール]

    SDLライブラリを使用したい場合は、GLSceneSDLパッケージをコンパイルします
    Windowsの場合、その他にGLSceneBass, GLSceneFMod, GLSceneODE, GLSceneNGD, GLSceneCgShader and GLSceneWinOlnlyライブラリをコンパイルできます
注意: v1.4とv1.6では、パッケージ名が異なる(GLSceneLCL_DesignTimeがGLScene_DesignTimeに変更等)ので、v1.4で作成したプログラムは修正の必要があります。

インストールの方法(旧バージョン-v1.4)

  1. 以下のホームページよりGLSceneをダウンロードし、任意のライブラリフォルダへ解凍します

    http://sourceforge.net/projects/glscene/files/

    ・GLScene v1.4 - Lazarus用
    ・GLScene v1.5 - Rad Studio Deiphi用(32ビット、64ビット)

    GLScene_v1.4_for_Lazarus.7zをダウンロードします

  2. Windowsの場合、\GLSceneLCL\externalにあるSetup.batを管理者権限で実行し、補助のダイナミックライブラリ(.dll)をC:\Windows\System32とC:\Windows\SysWOW64ディレクリィにコピーします
  3. コンポーネントをインストールする前にソースファイルにバグがある為、修正します

    GLSceneLCL/Packages/GLSceneLCL_RunTime.lpk 333,334行目のGlFileXをGLFileXに変更します(小文字Lを大文字Lに変更)
    GLSceneLCL/Source/GLSceneRegisterLCL.pas 107行目のGlFileXをGLFileXに変更します
    GLSceneLCL/Source/GLFileX.pas 31行目のGlFileXをGLFileXに変更します
    GLSceneLCL/Source/FGUISkinEditorLCL.pas 11行目のFGuiSkinEditorをFGUISkinEditorに変更します(GuiをGUIに変更)。更にLinuxの場合、19行目のWindows, を{Windows,}(コメントアウト)にします
    GLSceneLCL/Source/GLUtils.pas 719,720行目を以下のように変更します
    変更前

    path := LowerCase(ExtractFilePath(path));
    p := Pos('samples', path);
    
    変更後
    path := ExtractFilePath(path);
    p := Pos('samples', LowerCase(path);
    
    参考: http://forum.lazarus.freepascal.org/index.php?topic=36796.0

  4. Lazarus 2.0以降の場合は、以下の修正をします

    GLSceneLCL/Sourse/GLCrossPlatform.pas 104行目の[ ,LCLVersion, LCLType, FileUtil]の後に[, LazUTF8, LazFileUtils]を追加します
    GLSceneLCL/Sourse/GLUtils.pas 40行目の[Classes, SysUtils, Graphics, Controls,]の後に[ LazUTF8, LazFileUtils,]を追加します

  5. コンポーネントのコンパイル及びインストール (BASS, FMOD, CGShader, ODE, NewtonはWindowsのみサポートされています)
    Lazarusを起動し、GLSceneLCL/Packagesディレクトリ内の以下のコンポーネント(.lpk)をコンパイル及びインストールします

    GLScene_Runtimeパッケージ - 開く - コンパイル
    GLScene_DesignTimeパッケージ - 開く - コンパイル - インストール

    ※SDLライブラリを使用したい場合は、GLSceneSDLパッケージをコンパイルします
    Windowsの場合、その他にGLSceneBass, GLSceneFMod, GLSceneODE, GLSceneNGD, GLSceneCgShader and GLSceneWinOlnlyライブラリをコンパイルできます
    ※コンパイル時に「GLWindowsFont.pas(299,29) Error: Incompatible type for arg no. 2: Got "LPTEXTMETRIC", expected "LPTEXTMETRICW"」エラーが発生した場合、 GLWindowFont.basファイルの284行目のvar tm: LPTextMetric;var tm: LPTextMetricW;に変更します(Wndows64ビットで確認)

    ※参考: https://sourceforge.net/p/glscene/wiki/Lazarus%20Installation/

サンプルを実行する前に

Linuxの場合、[GCLCadencer]コンポーネントの[Mode]プロパティをcmASAPからcmApplicationIdleに変更します。もし、変更しないと例外クラスRunError(232)が発生します。

プログラム読み込み時にLazarusが強制終了する(Ubuntu 18.04)

原因

OpenGLバージョンが4.5の場合に発生する模様。 旧Lazarusがインストールされていて(Lazarusのアップデート除外をしていない状態で)OSのアップデートを行うと、アップデート時にOpenGLが3.3にダウングレードされるが、Lazarusは削除され、fpcのバージョンが変更されます。 故に、以下の方法を用いて解決します。
OpenGLのバージョン確認方法
端末で下記のコマンドを実行します
$ glxinfo | grep "version string"
server glx version string: 1.4
client glx version string: 1.4
OpenGL core profile version string: 4.5 (Core Profile) Mesa 18.0.0-rc5
OpenGL core profile shading language version string: 4.50
OpenGL version string: 3.0 Mesa 18.0.0-rc5
OpenGL shading language version string: 1.30
OpenGL ES profile version string: OpenGL ES 3.1 Mesa 18.0.0-rc5
OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.10
修正
  1. 端末で下記のコマンドを実行して~/.profileを編集します
    $ leafpad ~/.profile
  2. 末尾に以下の内容を追加して、保存します
    # It makes use of GLScene component in Lazarus, using OpenGL4.5.
    export LIBGL_ALWAYS_SOFTWARE=1
    
  3. 再ログインします

GLSceneの基本的な使い方

コンポーネント

TGLSceneViewer(画像配置枠)

TGLScene(オブジェクト配置)

カメラ
TGLCamera
ライト
TGLLightSource
球形状
TGLSphere
テクスチャを貼り付ける
ドーナツ形状
TGLAnnulus
ポリゴン(線)
TGLLines

TGLCadencer(進捗処理)

マウスによるカメラ移動

下記のプログラムを利用します
type
  { TForm1 }
  TForm1 = class(TForm)
  …
  private
    { private declarations }
    Camera_X, Camera_Y: Integer;
  …
procedure TForm1.FormShow(Sender: TObject);
begin
  Camera_X := 0;
  Camera_Y := 0;
end

procedure TForm1.GLSceneViewer1MouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  Camera_X := X;
  Camera_Y := Y;
end;

procedure TForm1.GLSceneViewer1MouseMove(Sender: TObject;
  Shift: TShiftState; X, Y: Integer);
begin
  if Shift = [ssLeft] then
    GLCamera1.MoveAroundTarget(Camera_Y - Y, Camera_X - X);
  Camera_X := X;
  Camera_Y := Y;
end;

広告リンク

準備

日本語処理

コンポーネント

関連ホームページ

ページのトップへ戻る
inserted by FC2 system