コンポーネント - 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)
- 以下のホームページよりGLSceneをダウンロードし、任意のライブラリフォルダへ解凍します
https://sourceforge.net/p/glscene/code/HEAD/tree/branches/GLSceneLCL/
- ファイルを修正します
ファイル: 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;
- Windowsの場合、\GLSceneLCL\externalにあるSetup.batを管理者権限で実行し、補助のダイナミックライブラリ(.dll)をC:\Windows\System32とC:\Windows\SysWOW64ディレクリィにコピーします
- コンポーネントのコンパイル及びインストール
(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)
- 以下のホームページより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をダウンロードします
- Windowsの場合、\GLSceneLCL\externalにあるSetup.batを管理者権限で実行し、補助のダイナミックライブラリ(.dll)をC:\Windows\System32とC:\Windows\SysWOW64ディレクリィにコピーします
- コンポーネントをインストールする前にソースファイルにバグがある為、修正します
・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
- Lazarus 2.0以降の場合は、以下の修正をします
・GLSceneLCL/Sourse/GLCrossPlatform.pas 104行目の[ ,LCLVersion, LCLType, FileUtil]の後に[, LazUTF8, LazFileUtils]を追加します
・GLSceneLCL/Sourse/GLUtils.pas 40行目の[Classes, SysUtils, Graphics, Controls,]の後に[ LazUTF8, LazFileUtils,]を追加します
- コンポーネントのコンパイル及びインストール
(BASS, FMOD, CGShader, ODE, NewtonはWindowsのみサポートされています)
Lazarusを起動し、GLSceneLCL/Packagesディレクトリ内の以下のコンポーネント(.lpk)をコンパイル及びインストールします
・GLScene_Runtimeパッケージ - 開く - コンパイル
※SDLライブラリを使用したい場合は、GLSceneSDLパッケージをコンパイルします
・GLScene_DesignTimeパッケージ - 開く - コンパイル - インストール
※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
修正
- 端末で下記のコマンドを実行して~/.profileを編集します
$ leafpad ~/.profile
- 末尾に以下の内容を追加して、保存します
# It makes use of GLScene component in Lazarus, using OpenGL4.5. export LIBGL_ALWAYS_SOFTWARE=1
- 再ログインします
GLSceneの基本的な使い方
コンポーネント
TGLSceneViewer(画像配置枠)
- [Buffer]-[BackgroundColor]プロパティ … 背景色
- [Camera]プロパティ … カメラを指定
TGLScene(オブジェクト配置)
カメラ
TGLCamera
- [TargetObject]プロパティ … ターゲットのオブジェクトを指定
- [Position]プロパティ … カメラの座標
- [SceneScale]プロパティ … 倍率
ライト
TGLLightSource
- [Position]プロパティ … ライトの座標
球形状
TGLSphere
テクスチャを貼り付ける- [Material]-[Texture]-[Disable]を[False]に変更
- [Material]-[Texture]-[ImageClassName]を[PicFile Image]に変更
- [Material]-[Texture]-[Image]で画像ファイルを指定
- [Material]-[Texture]-[TextureMode]を[tmAdd]に変更
- [Material]-[FrontProperties]-[Emission]で色を指定
ドーナツ形状
TGLAnnulus
- [BottomInnerRadius], [BottomRadius], [TopInnerRadius], [TopRadius],[Height]で形状を作成
- [PichAngle]プロパティ … 回転
- [Material]-[FrontProperties]-[Emission] … 色
ポリゴン(線)
TGLLines
- [Nodes]プロパティ … 線の座標を追加
- [LineColor]プロパティ … 色
- [NodeAspect]プロパティ … [lnaInvisible]に変更
TGLCadencer(進捗処理)
- [Scene]プロパティ … GLScene名を指定
- [SleepLength]プロパティ … スリープ長(単位:ミリ秒)(デフォルト:-1)
- [OnProgress]イベント … 進捗イベント(ここに画像処理を書き込む)
マウスによるカメラ移動
下記のプログラムを利用します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;