モダンなWindows C++開発で3Dオブジェクトを扱う方法を学ぶ
目次
概要
アプリケーション開発では、2D/3Dの数学計算を使用して、3Dオブジェクトを2D投影法で表示することができます。そのためには多くのコーディングが必要になりますが、独自の3Dコマンドを持つOpenGLやDirectXを使用して表示することができます。また、3DエンジンSDKを使用して移植することもできます。さらにDelphi/C++Builder向けに提供されているFireMonkeyフレークワークのViewport3Dコンポーネントを利用することで3Dを簡単に表示することができます。Viewport3Dコンポーネントを使用することで、設計時や実行時に、3Dオブジェクトの図形、位置、色、マテリアルなどを変更することができ、さらにテクスチャマテリアルやライトマテリアルを追加することができ、またDummyオブジェクトを使用してそれらをグループ化することもできます。
FireMonkeyは実行時でのGPU使用をサポートしています。すべての基本的な3Dオブジェクトは、ツールパレットの「3D Shapes」カテゴリで見つけることができます。下図の3DオブジェクトをViewportにドラッグするだけで、3Dオブジェクトを備えたWindowsアプリケーションができあがります。
実行時での3Dオブジェクトの作成
基本的な3D Shapesのオブジェクトは、ViewPort3Dコンポーネントにドラッグして作成することができ、アプリケーションのUIデザインにおいて、位置、回転、サイズ、およびその他のプロパティを調整することもできます。また、実行時に作成することもできます。親オブジェクトは、ViewPort3D、Dummyオブジェクト、その他の3Dオブジェクトのいずれかでなければなりません。
以下は、TCubeを使用したサンプルコードの例です。
TCube *cube;
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if(cube==NULL)
{
cube=new TCube(Viewport3D1);
cube->Parent=Viewport3D1;
}
}
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
cube->Free(); // must be removed from the memory at the end
}
ここでは、一部の3D Shapesのオブジェクトを紹介いたします。
TPlane
TPlaneは、Viewport3Dコンポーネントで使用され、3D FireMonkeyフォーム上に配置可能な2D平面を実装するクラスであり、3Dフォームで使用できる2D平面を表します。TPlaneは、3Dの回転と配置をサポートしており、ツールパレットから追加できるビジュアルオブジェクトです。
Plane1->BeginUpdate();
Plane1->Width=10;
Plane1->Height=10;
Plane1->SubDivisionsHeight=10;
Plane1->SubDivisionsWidth=10;
Plane1->Position->X=0;
Plane1->Position->Y=0;
Plane1->Position->Z=0;
Plane1->Rotation->X=0;
Plane1->Rotation->Y=0;
Plane1->Rotation->Z=0;
Plane1->MaterialSource =TextureMaterialSource1; //MaterialSources should be defined or dragged
Plane1->EndUpdate();
TDisk
TDiskは、Viewport3Dコンポーネントで使用され、3D FireMonkeyフォーム上に配置可能な3Dの平らな円盤の形を実装するクラスで、ツールパレットから追加することができるビジュアルオブジェクトです。また色を変更したり、円盤にテクスチャを追加するには、[ http://docwiki.embarcadero.com/Libraries/Rio/ja/FMX.Objects3D.TDisk.MaterialSource MaterialSource]プロパティを使用します。 円盤の表面のなめらかさを指定する場合には、SubdivisionsAxes、SubdivisionsCapを設定します。
Disk1->BeginUpdate();
Disk1->Width=10;
Disk1->Height=10;
Disk1->SubDivisionsHeight=10;
Disk1->SubDivisionsWidth=10;
Disk1->Position->X=0;
Disk1->Position->Y=0;
Disk1->Position->Z=0;
Disk1->Rotation->X=0;
Disk1->Rotation->Y=0;
Disk1->Rotation->Z=0;
Disk1->MaterialSource = LightMaterialSource1; //MaterialSources should be defined or dragged on to form
Disk1->EndUpdate();
TCube
TCubeは、3D FireMonkeyフォーム上に配置可能な3D 立方体(3D ワイヤフレームで作成)を実装するクラスで、ツールパレットから追加することができるビジュアルオブジェクトです。
色を変更したり、立方体にテクスチャを追加するには、MaterialSourceプロパティを使用します。 立方体の表面のなめらかさを指定する場合には、SubdivisionsDepth、SubdivisionsHeight、SubdivisionsWidth を設定します。
Cube1->BeginUpdate();
Cube1->Width=10;
Cube1->Height=10;
Cube1->Depth=10;
Cube1->SubDivisionsHeight=10;
Cube1->SubDivisionsWidth=10;
Cube1->Position->X=0;
Cube1->Position->Y=0;
Cube1->Position->Z=0;
Cube1->Rotation->X=0;
Cube1->Rotation->Y=0;
Cube1->Rotation->Z=0;
Cube1->MaterialSource = LightMaterialSource1; //MaterialSources should be defined or dragged on to form
Cube1->EndUpdate();
TRectangle3D
TRectangle3Dは、3D FireMonkeyフォーム上に配置可能な3D 四角形の形で押し出された 3D 図形を実装するクラスで、ツールパレットから追加することができるビジュアル オブジェクトです。
Rectangle3D1->BeginUpdate();
Rectangle3D1->Width=10;
Rectangle3D1->Height=10;
Rectangle3D1->Depth=10;
Rectangle3D1->SubDivisionsHeight=10;
Rectangle3D1->SubDivisionsWidth=10;
Rectangle3D1->Position->X=0;
Rectangle3D1->Position->Y=0;
Rectangle3D1->Position->Z=0;
Rectangle3D1->Rotation->X=0;
Rectangle3D1->Rotation->Y=0;
Rectangle3D1->Rotation->Z=0;
Rectangle3D1->MaterialSource = LightMaterialSource1; //MaterialSources should be defined or dragged on to form
Rectangle3D1->EndUpdate();
TSphere
TSphereは、3D FireMonkeyフォーム上に配置可能な3D 球体(3D ワイヤフレームで作成)を実装するクラスで、ツール パレットから追加することができるビジュアル オブジェクトです。
色を変更したり、球体にテクスチャを追加するには、MaterialSource プロパティを使用します。 球体の表面のなめらかさを指定する場合には、SubdivisionsAxes、SubdivisionsHeightを設定します。
Sphere1->BeginUpdate();
Sphere1->Width=10;
Sphere1->Height=10;
Sphere1->Depth=10;
Sphere1->SubDivisionsHeight=10;
Sphere1->SubDivisionsWidth=10;
Sphere1->Position->X=0;
Sphere1->Position->Y=0;
Sphere1->Position->Z=0;
Sphere1->Rotation->X=0;
Sphere1->Rotation->Y=0;
Sphere1->Rotation->Z=0;
Sphere1->MaterialSource = LightMaterialSource1; //MaterialSources should be defined or dragged on to form
Sphere1->EndUpdate();
TCylinder
TCylinderは、3D FireMonkeyフォーム上に配置可能な3D 円柱の形を実装するクラスで、ツール パレットから追加することができるビジュアル オブジェクトです。
色を変更したり、円柱にテクスチャを追加するには、MaterialSource プロパティを使用します。円柱の表面のなめらかさを指定する場合には、SubdivisionsAxes、SubdivisionsCap、SubdivisionsHeightを設定します。
Cylinder1->BeginUpdate();
Cylinder1->Width=10;
Cylinder1->Height=10;
Cylinder1->Depth=10;
Cylinder1->SubDivisionsWidth=10;
Cylinder1->Position->X=0;
Cylinder1->Position->Y=0;
Cylinder1->Position->Z=0;
Cylinder1->Rotation->X=0;
Cylinder1->Rotation->Y=0;
Cylinder1->Rotation->Z=0;
Cylinder1->MaterialSource = LightMaterialSource1; //MaterialSources should be defined or dragged on to form
Cylinder1->EndUpdate();
TEllipse3D
TEllipse3D は、3D FireMonkeyフォーム上に配置可能な3D 楕円の形で押し出された 3D 図形を実装するクラスで、ツール パレットから追加することができるビジュアル オブジェクトです。
Ellipse3D1->BeginUpdate();
Ellipse3D1->Width=10;
Ellipse3D1->Height=10;
Ellipse3D1->Depth=10;
Ellipse3D1->SubDivisionsHeight=10;
Ellipse3D1->SubDivisionsWidth=10;
Ellipse3D1->Position->X=0;
Ellipse3D1->Position->Y=0;
Ellipse3D1->Position->Z=0;
Ellipse3D1->Rotation->X=0;
Ellipse3D1->Rotation->Y=0;
Ellipse3D1->Rotation->Z=0;
Ellipse3D1->MaterialSource = LightMaterialSource1; //MaterialSources should be defined or dragged on to form
Ellipse3D1->EndUpdate();
TCone
TConeは、3D FireMonkeyフォーム上に配置可能な3D 円錐形(3D ワイヤフレームで作成)を実装するクラス、ツール パレットから追加することができるビジュアル オブジェクトです。
色を変更したり、円錐形にテクスチャを追加するには、MaterialSourceプロパティを使用します。円錐形の表面のなめらかさを指定する場合には、SubdivisionsAxes、SubdivisionsCap、SubdivisionsHeight を設定します。
TText3D
TText3Dは、3D FireMonkeyフォーム上に配置可能な3D テキスト描画の形で押し出された 3D 図形を実装するクラスで、ツール パレットから追加することができるビジュアル オブジェクトです。
「3D Shapes」カテゴリに属するすべてのFireMonkey 3Dオブジェクトは、こちらで参照できます。