Android用VRアプリを作成する(センサーにも対応) ~Delphiでお手軽プログラミング
はじめに
Android用VR(Virtual Reality)アプリケーションを作成します。(Delphiだとソースコードは超短いです。)両眼視差(右目と左目は位置が違う為、ずれが発生し、その違い[視差]により奥行きを感じる)とセンサーを使ってVRを再現します。
Android機用のVRゴーグルは980円くらいでアマゾンなどで販売されています。

新規アプリケーションの準備
Delphiを起動し「ファイル」→「新規作成「→「マルチデバイスアプリケーション - Delphi」を選択します。

空のアプリケーション を選択します。

コンポーネントを追加
ツールパレットからTOrientationSensorをフォームへドラッグします。
ツールパレットからTLightMaterialSourceをフォームへドラッグします。

ツールパレットからTGridPanelLayoutをフォームへドラッグします。

GridPanelLayout1のAlignプロパティをClientに設定します。

GridPanelLayout1のRowCollectionプロパティの「・・・」ボタンを押します。

行1を選択し、削除ボタンを押します。

以下のようになったら×ボタンで閉じます。

ツールパレットからTViewport3DをGridPanelLayout1の上にドラッグドロップします。

Viewport3D1のAlignプロパティをClientにします。
ツールパレットからTViewport3DをGridPanelLayout1の上にもう1つドラッグドロップします。

Viewport3D2のAlignプロパティをClientにします。

ツールパレットからTCameraをViewport3D1の上にドラッグドロップします。

ツールパレットからTCameraをViewport3D2の上にドラッグドロップします。

ツールパレットからTLightをViewport3D1の上にドラッグドロップします。

ツールパレットからTLightをViewport3D2の上にドラッグドロップします。

すべて保存ボタンを押します。

保存ボタンを押します。

名前を付けて保存ダイアログが出ますので、保存ボタンを押します。

ソースコードの記述
(参考:キーボードのF12を押すと、ソース画面とデザイン画面が切り替わります。)構造のForm1をクリックし、オブジェクトインスペクタの「イベント」タブをクリックし、OnCreateの右側をダブルクリックします。

usesにFMX.Objects3Dを追加します。

FormCreateに以下ソースコードを追加します。

procedure TForm1.FormCreate(Sender: TObject); var i:integer; cube:TCube; x,y,z:single; begin Viewport3D1.UsingDesignCamera:=False; Viewport3D2.UsingDesignCamera:=False; //ViewPort3DにCUBEをランダムに配置する Randomize; for i := 1 to 99 do begin x:=Random(50)-25; y:=Random(20)-10; z:=Random(50)-25; cube:=TCube.Create(self); cube.MaterialSource:=LightMaterialSource1; cube.Position.X:=x; cube.Position.Y:=y; cube.Position.Z:=z; cube.Parent:=Viewport3D1; cube:=TCube.Create(self); cube.MaterialSource:=LightMaterialSource1; cube.Position.X:=x; cube.Position.Y:=y; cube.Position.Z:=z; cube.Parent:=Viewport3D2; end; //両眼視差が発生するようにメラの座標を設定 Camera1.Position.X:=-0.4; Camera2.Position.X:= 0.4; Camera1.Position.Z:=0; Camera2.Position.Z:=0; //ライトの方向を調整 Light1.RotationAngle.X:=285; Light2.RotationAngle.X:=285; Light1.RotationAngle.Y:=330; Light2.RotationAngle.Y:=330; //センサーをオンにする OrientationSensor1.Active:=True; //センサーの更新間隔を33ミリ秒にする OrientationSensor1.Sensor.UpdateInterval:=33; end;
キーボードのF12キーを押し、デザインモードに切り替えOrientationSensor1をクリックします。
オブジェクトインスペクタの「イベント」タブを選択し、OnSensorChoosingの右側をダブルクリックします。

以下ソースコードを追加します。

procedure TForm1.OrientationSensor1SensorChoosing(Sender: TObject; const Sensors: TSensorArray; var ChoseSensorIndex: Integer); var i: Integer; begin for i := 0 to High(Sensors) do begin if TCustomOrientationSensor.TProperty.TiltX in TCustomOrientationSensor(Sensors[i]).AvailableProperties then begin ChoseSensorIndex := i; Exit; end; end; ChoseSensorIndex := 0; end;
キーボードのF12キーを押してデザインモードに切り替えます。
ツールパレットからTTimerをフォームでドラッグドロップします。

Timer1を選択して、オブジェクトインスペクタの「プロパティ」タブをクリックし、Intervalを33にします。

Timer1を選択して、オブジェクトインスペクタの「イベント」タブをクリックし、OnTimerの右側をダブルクリックします。

以下ソースコードを追加します。

procedure TForm1.Timer1Timer(Sender: TObject); var x,y:single; begin x:=-OrientationSensor1.Sensor.TiltX-90; y:=OrientationSensor1.Sensor.TiltZ+360; Camera1.RotationAngle.Y:=y; Camera2.RotationAngle.Y:=y; Camera1.RotationAngle.X:=x; Camera2.RotationAngle.X:=x; end;
プロジェクトマネージャのターゲットプラットフォームのAndroidをダブルクリックします。

メニューバーのプロジェクト⇒オプションをクリックします。
アプリケーション⇒向きをクリックします。
「カスタムの向きを有効にする」にチェックを入れます。
横(ホームボタンが右)、横(ホームボタンが左)にチェックを入れて、アプリケーションが縦向きにならないようにします。
OKボタンをクリックします。

実機をPCにつなぎ、実行ボタン(右向きの三角ボタン)をクリックすると、 ソースコードがコンパイル、apkファイルが実機に転送されAndroid上で動きます。

VRゴーグルにAndroid実機セットしてゴーグルを装着すれば3D体験ができます。