TrueCamera.png

FMX.Controls3D.TCamera は、(垂直)画角 が 45° に固定されてしまっていて、自由に ズームイン/アウト することができません。さらにいえば、平行投影(画角ゼロ) で描画することもできない。

そこで、画角の変更のみならず、複数のカメラで異なる画角を保持できるような仕組みを考えてみました。

しかし今回は、FMX のオリジナルソースが多数含まれるため、当サイト上では実装サンプルを公開できません。以下の QC からダウンロードをお願い致します。

117385: Can't change the camera's angle of view.
 - TrueCamera.zip
 ( XE4 と XE5 用の2つのプロジェクトが同梱されています)

結局その実現には、TCamera のみなからず、TContext3D や TViewport3D を含めた広範囲の改造を余儀なくされたため、クラスヘルパなどでは安易に書き換えられず、以下のソースを直接書き換えざるを得ませんでした。

・FMX.Controls3D.pas
・FMX.Types3D.pas
・FMX.Viewport3D.pas

しかもそれに伴い、上記に依存していた以下のソースも未編集のままプロジェクトへ含めて再コンパイルする必要があります。

・FMX.Canvas.D2D.pas
・FMX.Canvas.GPU.Helpers.pas
・FMX.Canvas.GPU.pas
・FMX.Context.DX9.pas
・FMX.Context.DX10.pas
・FMX.Effects.pas
・FMX.Filter.Custom.pas
・FMX.Filter.pas
・FMX.Forms.pas
・FMX.Import.pas
・FMX.Materials.Canvas.pas
・FMX.Materials.pas
・FMX.MaterialSources.pas
・FMX.Objects3D.pas
・FMX.Platform.Win.pas
・FMX.StrokeBuilder.pas
・FMX.TextLayout.GPU.pas

なお今回の実装は、Windows8 上での動作確認のみで、MacOS,Android,iOS 上では検証しておりません。ただ、OSに依存した部分にまでは手を入れていないので、原理的にはそのまま動くはずです。もっともその際は、さらに別の依存ソースをプロジェクトへ含める必要があるかもしれませんが。

そうして完成した新しい TCamera には、以下の新しいプロパティが追加されました。

・TCamera
 - ViewType :TViewType  ・・・投影のタイプ( 平行:ctOrthogonal / 透視:ctPerspective )
 - ScreenL :Single  ・・・スクリーンの左端 X 座標
 - ScreenR :Single  ・・・スクリーンの右端 X 座標
 - ScreenB :Single  ・・・スクリーンの下端 Y 座標
 - ScreenT :Single  ・・・スクリーンの上端 Y 座標
 - ScreenD :Single  ・・・スクリーンの Z 座標
 - ClipN :Single  ・・・手前のクリッピング面の Z 座標
 - ClipF :Single  ・・・奥のクリッピング面の Z 座標
 - AspectW :Integer  ・・・アスペクト比の幅
 - AspectH :Integer  ・・・アスペクト比の高さ
 - ScreenX :Single  ・・・スクリーン中心の X 座標
 - ScreenY :Single  ・・・スクリーン中心の Y 座標
 - ScreenW :Single  ・・・スクリーンの幅
 - ScreenH :Single  ・・・スクリーンの高さ
 - AngleL :Single  ・・・視野錐台の左面角度
 - AngleR :Single  ・・・視野錐台の右面角度
 - AngleB :Single  ・・・視野錐台の下面角度
 - AngleT :Single  ・・・視野錐台の上面角度
 - AngleW :Single  ・・・水平画角
 - AngleH :Single  ・・・垂直画角

各プロパティの意味は、下図をご参考にされると分かりやすいかと。 ただ、下図は OpenGL での解説図なので、FireMonkey の場合、同じ右手系ではありますが、Y軸 と Z軸 が逆向きになります。

平行投影カメラ
図1: 平行投影カメラの構造 ※出典:床井研究室

  透視投影カメラの構造
図2: 透視投影カメラの構造 ※出典:床井研究室

 

メッセージ

コメントを残す



(このメールアドレスは表示されません。)


Captcha認証コード

Captchaをクリックすると違う文字候補が出てきます。