チュートリアル:FireMonkey 3D アプリケーションでのカメラの使用方法

提供: RAD Studio
移動先: 案内検索

FireMonkey チュートリアル への移動


このチュートリアルでは、簡単な FireMonkey 3D アプリケーションでのカメラの使用方法を示します。 TCamera オブジェクトを使用して、シーンの視点と、シーンでのオブジェクトの投影を定義する方法を説明します。

FireMonkey 3D アプリケーションの作成

TCamera を使用するには、FireMonkey 3D アプリケーションを作成する必要があります。それには、次の手順に従います。

  1. [ファイル|新規作成|マルチデバイス アプリケーション - Delphi|3D アプリケーションを選択します。
  2. フォーム デザイナを開くには、[プロジェクト マネージャ].pas ユニットをダブルクリックしたあと、コード エディタの下端にある[デザイン]タブをクリックします。

コンポーネントの追加と調整

  1. [ツール パレット]から、以下の FireMonkey 3D コンポーネントを追加します([検索]フィールドにコンポーネント名を入力し、Enter キーを押します)。 TCamera オブジェクト 3 つ、TCube オブジェクト 2 つ、TLight オブジェクト 2 つ。
    • TCube オブジェクトは、さまざまなカメラから見ることができる 3D オブジェクトです。
    • TCamera オブジェクトは、3D オブジェクトの観察位置を定義するのに使用されます。
    • TLight オブジェクトは、カメラの位置に応じて、3D オブジェクトの光線に影響を及ぼします。
  2. 実行時に Form1 からカメラを取り去るよう変更できるようにするには、[オブジェクト インスペクタ]で Form1 の UsingDesignCameraFalse に設定します。

コントロール パネル:

  1. カメラの位置と回転角に応じてシーンの視点と投影がどう変化するかを観察できるように、TCameraオブジェクトのプロパティを変更できるコントロール パネルを作成します。
    1. 3D アプリケーション内に 2D インターフェイスを作成する」チュートリアルで説明している手順で 2D コントロール パネルを作成します。
    2. 追加した 2D 平面に 3 個の TGroupBox オブジェクトを追加します。
    3. 1 つ目の TGroupBox オブジェクトの Text プロパティを Camera に設定し、3 個の TRadioButton オブジェクト(Camera1、Camera2、Camera3)を追加します。
    4. 2 つ目の TGroupBox オブジェクトの Text プロパティを Position に設定し、3 個の TTrackBar オブジェクト(X、Y、Z 座標)を追加します。
    5. 3 つ目の TGroupBox オブジェクトのテキスト プロパティを、RotationAngle に設定し、3 個の TTrackBar オブジェクト(X、Y、Z 座標)を追加します。
    6. TTrackBar オブジェクトの値を確認するために、[Position]と[RotationAngle]の各グループ ボックスに TLabel オブジェクトを追加します。' '

すべてのコンポーネントを追加したら、[デザイン]タブは次のようになります。


Designwindow.png

カメラを調整するコードの作成

1. 変数 FIsChangingCamera およびプロシージャ RB_Use_CameraChange を、フォーム宣言 private セクションに次のように追加します:
  // Delphi code for the form class declaration
private
  { Private declarations }
  FIsChangingCamera : boolean;
  procedure RB_Use_CameraChange(Sender:TObject);
// C++ code for the form class declaration
private:  // User declarations
  bool FIsChangingCamera;
  void RB_Use_CameraChange(TObject *Sender);

private の論理型インスタンス変数 FIsChangingCamera は、ボタン クリックのイベント ハンドラがカメラのプロパティを更新中であることをプログラムに知らせることで、トラック バーのイベント ハンドラが同時にカメラを更新しないようにするためのものです。

RB_Use_CameraChange 手続きは、3 つのどのカメラにも使用できる、プロパティを変更するための 1 つのメソッドです。 RB_Use_CameraChange メソッドの実装は次のようになっています。

// Delphi code for the RB_Use_CameraChange method implementation
procedure TForm23.RB_Use_CameraChange(Sender: TObject);
begin
  FIsChangingCamera := true;
  try
     Form23.Camera := Sender as TCamera;
     TrackBar1.Value := Camera.Position.X;
     TrackBar2.Value := Camera.Position.Y;
     TrackBar3.Value := Camera.Position.Z;
  finally
     FIsChangingCamera := false;
  end;
end;
// C++ code for the RB_Use_CameraChange method implementation
void TForm23::RB_Use_CameraChange(TObject *Sender)
{
  FIsChangingCamera = True;
  try {
    Form23->Camera = dynamic_cast<TCamera*>(Sender);
    TrackBar_PositionX->Value = Form23->Camera->Position->X;
    TrackBar_PositionY->Value = Form23->Camera->Position->Y;
    TrackBar_PositionZ->Value = Form23->Camera->Position->Z;
  }
  __finally {
    FIsChangingCamera = False;
  }
}
2. 次に、カメラのプロパティに TTrackBar オブジェクトと TRadioButton オブジェクトの値を代入するコードを書く必要があります。
  { The Delphi implementation for changing the coordinates of the camera position }
  procedure TForm23.RB_Use_Camera1Click(Sender: TObject);
  begin
    RB_Use_CameraChange(Camera1);
  end;

  procedure TForm23.RB_Use_Camera2Click(Sender: TObject);
  begin
    RB_Use_CameraChange(Camera2);
  end;

  procedure TForm23.RB_Use_Camera3Click(Sender: TObject);
  begin
    RB_Use_CameraChange(Camera3);
  end;

  { The Delphi implementation for changing the coordinates of the camera position }
  procedure TForm23.TrackBar_PositionChange(Sender: TObject);
  begin
    if not FIsChangingCamera then
    begin
      TForm23.Camera.Position.X := TrackBar_PositionX.Value;
      TForm23.Camera.Position.Y := TrackBar_PositionY.Value;
      TForm23.Camera.Position.Z := TrackBar_PositionZ.Value;
    end;
    { Updating the displayed values of the coordinates }
    Label_Position.Text := Format('X: %d, Y: %d, Z: %d',
      [Round(TForm23.Camera.Position.X), Round(TForm23.Camera.Position.Y),
      Round(TForm23.Camera.Position.Z)]);
  end;

  { The Delphi implementation for changing the rotation angle of the camera }
  procedure TForm23.TrackBar_RotationAngleChange(Sender: TObject);
  begin
    if not FIsChangingCamera then
    begin
      TForm23.Camera.RotationAngle.X := TrackBar_RotationAngleX.Value;
      TForm23.Camera.RotationAngle.Y := TrackBar_RotationAngleY.Value;
      TForm23.Camera.RotationAngle.Z := TrackBar_RotationAngleZ.Value;
    end;
    { Updating the displayed values of the coordinates }
    Label_RotationAngle.Text := Format('X: %d, Y: %d, Z: %d', 
      [Round(TForm23.Camera.RotationAngle.X), [Round(TForm23.Camera.RotationAngle.Y),
      Round(TForm23.Camera.RotationAngle.Z)]);
    end;
  end;
// C++ code for choosing the camera
void __fastcall TForm23::RadioButton1Click(TObject *Sender)
{
   RB_Use_CameraChange(Camera1);
}
//----------------------------------------------------------
void __fastcall TForm23::RadioButton2Click(TObject *Sender)
{
   RB_Use_CameraChange(Camera2);
}
//----------------------------------------------------------
void __fastcall TForm23::RadioButton3Click(TObject *Sender)
{
   RB_Use_CameraChange(Camera3);
}

// C++ code for changing the coordinates of the camera position
void __fastcall TForm23::TrackBar_PositionChange(TObject *Sender)
{
  if (!Form23->FIsChangingCamera) {
    Form23->Camera->Position->X = TrackBar_PositionX->Value;
    Form23->Camera->Position->Y = TrackBar_PositionY->Value;
    Form23->Camera->Position->Z = TrackBar_PositionZ->Value;
  }
  // Update the displayed values of the coordinates
  TVarRec vr[] = {
    round(Form23->Camera->Position->X),
    round(Form23->Camera->Position->Y),
    round(Form23->Camera->Position->Z)
  };
  PositionLabel->Text = Format("X: %d, Y: %d, Z: %d",vr,3);
}

// C++ code for changing the rotation angle of the camera
void __fastcall Form23::TrackBar_RotationAngleChange(
      TObject *Sender)
{
  if (!Form23->FIsChangingCamera) {
    Form23->Camera->RotationAngle->X =
      TrackBar_RotationAngleX->Value;
    Form23->Camera->RotationAngle->Y =
      TrackBar_RotationAngleY->Value;
    Form23->Camera->RotationAngle->Z =
      TrackBar_RotationAngleZ->Value;
  }
  // Update the displayed values of the coordinates
  TVarRec vr[] = {
    round(Form23->Camera->RotationAngle->X),
    round(Form23->Camera->RotationAngle->Y),
    round(Form23->Camera->RotationAngle->Z)
  };
  RotationLabel->Text = Format("X: %d, Y: %d, Z: %d",vr,3);
}

アプリケーションを実行する前に、フォームの Camera プロパティを Camera2 に設定します。 これで、Camera2 がデフォルトの視点に設定されます。 プロジェクトの実行後は、作成したコントロール パネルからカメラとそのプロパティを変更することで、視点を変更できます。

アプリケーションの実行

プロジェクトを実行します。 プロジェクトのメイン ウィンドウが表示されます。 オブジェクトを見ているカメラが Camera2 であることを確認します。 カメラおよびカメラの位置や回転角を変更して、オブジェクトを見ている視点の変化を確認します。 TLight オブジェクトがカメラの位置に応じて 3D オブジェクトの照明にどう影響を及ぼすかを観察します。


Camera2.png

関連項目

サンプル