インポートした 3D モデルに簡単なカスタマイズを適用する
チュートリアル:3D モデルをインポートする(FireMonkey) への移動
目次
このチュートリアルでは、インポートした 3D モデルの倍率、回転角、光源、位置を変更する方法を示します。
インポートした 3D モデルの調整
フォームを作成し必要な 3D モデルをフォームにインポート(「FireMonkey アプリケーションに 3D モデルをインポートする」を参照)したら、以下の手順に従ってモデルを調整します。
フォーム デザイナを使用する
モデルに付加された青い制御キューブを使って、FireMonkey のフォーム デザイナで位置と回転角を調整できます。制御キューブは、モデルが[構造]ビューで選択されたときに表示されます。
- モデルを削除するには、制御キューブでドラッグ アンド ドロップ操作を実行します。
- インポートしたモデルを回転させるには、制御キューブの 3 つの青いハンドルを使用します。各ハンドルでは、空間内の関連する平面内で(つまり、x、y、z 軸の周りに)モデルを回転できます。ハンドルをクリックすると、その色が赤になり、アクティブ ハンドルであることを示します。
[オブジェクト インスペクタ]を使用する
[オブジェクト インスペクタ]で以下のようにプロパティを設定することで、設計時にモデルの拡大/縮小、移動、回転を行えます。
- インポートしたモデルを拡大/縮小するには、各平面に関連した Scale プロパティの各座標(X、Y、Z)を設定します。
- モデルを移動するには、各平面に関連した Position プロパティの各座標(X、Y、Z)を設定します。
- 回転角を変更するには、モデルの RotationAngle プロパティを設定します。
3D モデルのプロパティをプログラムで調整する
- 3D マルチデバイス アプリケーションを使用している場合は、「3D アプリケーション内に 2D インターフェイスを作成する」で説明している手順に従って、フォームに 2D コントロールを追加します。
- フォームに以下の 2D コンポーネントを追加します。
-
- 3 つの TLabel と、各平面での回転角を変更するための 3 つの TTrackBar を持つ TGroupBox。Text プロパティを、TGroupBox については Rotate model に変更し、3 つのラベルについては X、Y、Z に変更します。
- 3 つの TLabel、各軸でのモデルの倍率を変更するための 3 つの TTrackBar、モデルの拡大/縮小時にアスペクト比を保存するかどうかを選択するための TCheckBox を持つ TGroupBox。Text プロパティを、TGroupBox については Scale model に変更し、3 つのラベルについては X、Y、Z に変更し、TCheckBox については Preserves aspect に変更します。
- シーンでの光源のオン/オフを切り替えるための TButton。このボタンの Text プロパティを ON に変更します。
- フォームは次のようになります。
-
- [オブジェクト インスペクタ]で以下を行います。 :
- 各 TTrackBar をダブルクリックして OnChange イベントのハンドラを付加し、ボタンをダブルクリックして機能を追加します。
[Rotate model]グループ ボックスのトラックバーの実装
// Delphi 版の実装
procedure TForm1.TrackBar1Change(Sender: TObject);
begin
Model3D1.RotationAngle.X:=TrackBar1.Value;
end;
procedure TForm1.TrackBar2Change(Sender: TObject);
begin
Model3D1.RotationAngle.Y:=TrackBar2.Value;
end;
procedure TForm1.TrackBar3Change(Sender: TObject);
begin
Model3D1.RotationAngle.Z:=TrackBar3.Value;
end;
// C++ 版の実装
void __fastcall TForm3D1::TrackBar1Change(TObject *Sender)
{
Model3D1->RotationAngle->X=TrackBar1->Value;
}
void __fastcall TForm3D1::TrackBar2Change(TObject *Sender)
{
Model3D1->RotationAngle->Y=TrackBar2->Value;
}
void __fastcall TForm3D1::TrackBar3Change(TObject *Sender)
{
Model3D1->RotationAngle->Z=TrackBar3->Value;
}
[Scale model]グループ ボックスのトラックバーの実装
// Delphi 版の実装
procedure TForm1.TrackBar4Change(Sender: TObject);
begin
if(CheckBox1.IsChecked)then
begin
// 3 つのすべての平面(X、Y、Z)に同じ倍率を使用する
Model3D1.Scale.X:=TrackBar4.Value;
Model3D1.Scale.Y:=TrackBar4.Value;
Model3D1.Scale.Z:=TrackBar4.Value;
// Y と Z のトラックバーの値を更新する
TrackBar5.Value:=TrackBar4.Value;
TrackBar6.Value:=TrackBar4.Value;
end
else
begin
// X 軸上のモデルのみ拡大/縮小する
Model3D1.Scale.X:=TrackBar4.Value;
end;
end;
procedure TForm1.TrackBar5Change(Sender: TObject);
begin
if(CheckBox1.IsChecked)then
begin
// 3 つのすべての平面(X、Y、Z)に同じ倍率を使用する
Model3D1.Scale.X:=TrackBar5.Value;
Model3D1.Scale.Y:=TrackBar5.Value;
Model3D1.Scale.Z:=TrackBar5.Value;
// X と Z のトラックバーの値を更新する
TrackBar4.Value:=TrackBar5.Value;
TrackBar6.Value:=TrackBar5.Value;
end
else
begin
// Y 軸上のモデルのみ拡大/縮小する
Model3D1.Scale.Y:=TrackBar5.Value;
end;
end;
procedure TForm1.TrackBar6Change(Sender: TObject);
begin
if(CheckBox1.IsChecked)then
begin
// 3 つのすべての平面(X、Y、Z)に同じ倍率を使用する
Model3D1.Scale.X:=TrackBar6.Value;
Model3D1.Scale.Y:=TrackBar6.Value;
Model3D1.Scale.Z:=TrackBar6.Value;
// X と Y のトラックバーの値を更新する
TrackBar4.Value:=TrackBar6.Value;
TrackBar5.Value:=TrackBar6.Value;
end
else
begin
// Z 軸上のモデルのみ拡大/縮小する
Model3D1.Scale.Z:=TrackBar6.Value;
end;
end;
// C++ 版の実装
void __fastcall TForm3D1::TrackBar4Change(TObject *Sender)
{
if(CheckBox1->IsChecked
{
// 3 つのすべての平面(X、Y、Z)に同じ倍率を使用する
Model3D1->Scale->X=TrackBar4->Value;
Model3D1->Scale->Y=TrackBar4->Value;
Model3D1->Scale->Z=TrackBar4->Value;
// Y と Z のトラックバーの値を更新する
TrackBar5->Value=TrackBar4->Value;
TrackBar6->Value=TrackBar4->Value;
}
else
// X 軸上のモデルのみ拡大/縮小する
Model3D1->Scale->X=TrackBar4.Value;
}
void __fastcall TForm3D1::TrackBar5Change(TObject *Sender)
{
if(CheckBox1->IsChecked
{
// 3 つのすべての平面(X、Y、Z)に同じ倍率を使用する
Model3D1->Scale->X=TrackBar5->Value;
Model3D1->Scale->Y=TrackBar5->Value;
Model3D1->Scale->Z=TrackBar5->Value;
// X と Z のトラックバーの値を更新する
TrackBar4->Value=TrackBar5->Value;
TrackBar6->Value=TrackBar5->Value;
}
else
// Y 軸上のモデルのみ拡大/縮小する
Model3D1->Scale->Y=TrackBar5.Value;
}
void __fastcall TForm3D1::TrackBar6Change(TObject *Sender)
{
if(CheckBox1->IsChecked
{
// 3 つのすべての平面(X、Y、Z)に同じ倍率を使用する
Model3D1->Scale->X=TrackBar6->Value;
Model3D1->Scale->Y=TrackBar6->Value;
Model3D1->Scale->Z=TrackBar6->Value;
// X と Y のトラックバーの値を更新する
TrackBar4->Value=TrackBar6->Value;
TrackBar5->Value=TrackBar6->Value;
}
else
// Z 軸上のモデルのみ拡大/縮小する
Model3D1->Scale->Z=TrackBar6.Value;
}
シーンにおける光源をオン/オフするためのボタンの実装
// Delphi 版の実装
procedure TForm1.Button1Click(Sender: TObject);
begin
if(Button1.Text='OFF')then
begin
Light1.Enabled:=false;
Button1.Text:='ON'
end
else
begin
Light1.Enabled:=true;
Button1.Text:='OFF'
end;
end;
// C++ 版の実装
void __fastcall TForm3D1::Button1Click(TObject *Sender)
{
if(Button1->Text=="OFF"){
Light1->Enabled=False;
Button1->Text="ON";
}
else {
Light1->Enabled=True;
Button1->Text="OFF";
}
}
[[