|
DelphiXE3 [3D-FMX] 3Dアプリケーションテスト(3) 2014/05/01 |
ここでは前回のテストプログラムを少し変更してみます。
まずは、画面上にグリッド(Grid3D)を配置し、地面?を表現するとします。プログラム内容によっては、3Dレイヤーの方が良い場合もあるかもしれません(但し3Dレイヤー上に作図する図は画面ドット(ピクセル)指定になるので注意が必要です)。グリッドは X-Y で表示されますので、X軸回転 -90°を行なって X-Z 表示するようにしておきます。
自機の影として、3Dパス図形(Path3D)を配置し、Path.Data で三角形を表現するようにして、X軸回転 -90°を行い、自機位置の真下(初期値は(0,5,-5)点)に表示するようにします。
影となる図形の色は、ライト材質ソース LightMaterialSource3 で指定するものとします。
障害物の影は 円盤(Disk) で表現するようにします。球(Sphere) を動的配列 bl で管理することと同様、円盤(Disk)も動的配列 dl で管理する事とします。数は bl の数=変数 bn と同じになりますので、これを参照します。
なお、影の大きさは、何も考えず、自機や障害物と同じ大きさにしています。
影の大きさで高さを示す=高さにより影の大きさを変える、という風にすればもう少しわかりやすくなるかもしれませんが、そうなると、画面を見ず、地面ばかりを見てしまう事にもなりかねませんので、ゲームとしては余り面白くなくなるかもしれません。
ゲームらしく、サイド側にもグリッドを貼り付けて、それにより高さを目視出来るようにするのも良いかもしれません。
さて、こういった 3Dアプリケーションを作成する場合には、どういう画面構成にするのか、どういった視点での画面表示にするのか、を考えて、どの位置にどういう図を作図するのか、というマッピング作業が重要になってくると思われます。
上記では、視点=カメラ位置というのは指定していませんので、中央からまっすぐに向こう側を見ている状態となります。
カメラ(Camera)を配置し、カメラからの視点で画面を見るようにして、カメラ(Camera)の位置を (0,0,-18)点にしたとします。中央の丸いものが自機です。
次に、カメラ Camera1 の位置を (0,0,-5)点にしたとします。
自機の初期値と同じ位置ですので当然、自機が見えません。けれども見え方・感じ方が随分違ってくるのが分かります。但し、こういうゲームの場合は、障害物と当たったかどうかが分かりにくくなります。
次に、カメラ Camera1 の位置を、自機の位置と同じにするよう、プログラム内で操作するようにしてみます。
procedure TForm1.Form3DKeyDown(Sender: TObject; var Key: Word;
var KeyChar: Char; Shift: TShiftState);
・・・
Cone1.Position.X := my_x ;
Cone1.Position.Y := my_y ;
Path3D1.Position.X := my_x ;
Camera1.Position.X := my_x ;
Camera1.Position.Y := my_y ;
・・・
end; |
自機の位置によって、画面全体もダイナミックに動いて表示されますので、より臨場感が増してきます。このプログラムでは、常に正面を向いて表示するようになっていますが、見る方向を変える事が出来るプログラムというのも簡単に実現出来ます。カメラ Camera1 の角度を変えるだけですので。但し、これをどういった操作方法で行うのか?が問題にはなってきます。ゲームソフトでは、コントローラの左右スティックで、移動とカメラ角度を変える事が出来るものが多いですが、パソコンのキーボードでは!? A-D-W-C のキーを使ったり、マウスと併用したり? DirectX の DirectInput で外部コントローラを使用するという事も考えられます(※マルチプラットフォーム環境では、DirectX=Windows専用なので、DirectXを使用するという事は考えられませんが…)。
カメラ位置・角度を変える事により、場面を斜めから見たような画面にする事も出来ます。例えば、
procedure TForm1.Form3DShow(Sender: TObject);
begin
Camera1.Position.X := 10 ;
Camera1.Position.Y := -10 ;
Camera1.Position.Z := -10 ;
Camera1.RotationAngle.Y := -45.0 ;
Camera1.RotationAngle.X := -45.0 ;
my_x := Cone1.Position.X ;
my_y := Cone1.Position.Y ;
my_z := Cone1.Position.Z ;
・・・ |
のようにして実行すると、画面は下図のようになります。
しかし、こういう画面になってくると、影の大きさを変えたり、自機の前後の移動も欲しくなったり、してきますね。
という訳で、ライト、各オブジェクト位置、カメラ位置、場面全体をどのように想定し、どのように画面表示したいのか、という事を考えて作り込む事が 3Dアプリケーションでは重要になってくると思われます。
勿論、ライト、各オブジェクト、カメラの位置や角度は状況によって変えていくというのも自由です。時間によってライトの角度を変えていく、カメラの位置・角度も自機によって変えていく、固定位置のオブジェクト、移動するオブジェクト、などなど、自由にプログラミングされると良いと思います。
ソース・実行プログラムのダウンロード(ZIP圧縮;3,247KB)
|
|
バッチファイル
BASIC
C言語のお勉強
拡張子な話
DOSプログラム
Delphi
>Dehi入門編
>Delphi2010
>DelphiXE3
▲2014/04/30
2014/05/01
▼2014/05/05
シェアウェア
Script!World
データベース
|