アーキテクチャ

この節では、Microsoft® Direct3D® 保持モードオブジェクトおよびCOMアーキテクチャについて解説する。次の項目について説明する。

Direct3D保持モードオブジェクト

Direct3D保持モードへのアクセスは、わずかな数のオブジェクトを通して行われる。以下の表にこれらのオブジェクトをリストアップし、それぞれについて簡単に説明する。

オブジェクト 説明
Direct3DRMAnimation2 多くの場合、Direct3DRMFrame3オブジェクトに関連して、変換をいかに変更するかを定義する。 したがって、このオブジェクトを使用してDirect3DRMVisualDirect3DRMLightおよびDirect3DRMViewport2オブジェクトの位置、方向およびスケールのアニメーションを行うことができる。Direct3DRMAnimationオブジェクトと同じだが、アニメーションのキーとフレームにアクセスできる。
Direct3DRMAnimationArray 配列のアニメーション数、および要求したアニメーションへのインターフェイスを取得する。
Direct3DRMAnimationSet2 Direct3DRMAnimation2オブジェクトをグループ化する。Direct3DRMAnimationSetオブジェクトと同じだが、構成要素アニメーションにアクセスできる。
Direct3DRMClippedVisual レンダリング前に、ビジュアルを任意のプレーンにクリッピングできる。
Direct3DRMDevice3 レンダラのビジュアル表示先を表す。Direct3DRMDevice2オブジェクトを拡張して、ユーザによるマテリアルの設定と取得を可能にした。Direct3DRMDevice2Direct3DRMDeviceオブジェクトと同じ機能を持つが、透明度の制御が拡張されている。
Direct3DRMFace2 メッシュ上の1つのポリゴンを表す。
Direct3DRMFrame3 シーンにオブジェクトを配置し、ビジュアルオブジェクトの位置や向きを定義する。フレーム軸、境界ボックス、およびマテリアルに対するアクセスを有効にすることによって、Direct3DRMFrameオブジェクトを拡張する。光線ピックもサポートする。Direct3DRMFrame2オブジェクトを拡張して、変換、トラバーサル、フォグ処理の機能を追加した。
Direct3DRMInterpolator アクションを格納し、中間値を自動計算してオブジェクトにそのアクションを適用する。
Direct3DRMLight 5種類の照明の1つを定義し、シーンのビジュアルオブジェクトを彩色するために用いられる。
Direct3DRMMaterial2 サーフェスの反射特性を定義する。Direct3DRMMaterialオブジェクトと同じだが、マテリアルのプロパティを、より細かく調整できる。
Direct3DRMMesh ポリゴンの面のセットを含む。面や頂点のグループを操作するために使うことができる。
Direct3DRMMeshBuilder3 メッシュにある個々の頂点や面を操作することができる。Direct3DRMMeshBuilderオブジェクトを拡張して、法線に対する制御を強化し、メッシュの面を取得可能にした。Direct3DRMMeshBuilder2オブジェクトを拡張して、IDirect3DRM3インターフェイスによる作成時に、直接モードのDrawPrimitiveインターフェイスを使用するようにした。
Direct3DRMObject Direct3Dの他のすべての保持モードオブジェクトによって基本クラスとして用いられる。すべてのオブジェクトに共通な特徴を保持している。
Direct3DRMObject2 Direct3Dの他のすべての保持モードオブジェクトによって基本クラスとして用いられる。すべてのオブジェクトに共通な特徴を保持している。Direct3DRMObjectを拡張して、オブジェクトにデータを、より柔軟に関連付けられるようにした。
Direct3DRMPickedArray 与えられた2Dの点に対応するビジュアルオブジェクトを識別する。
Direct3DRMPicked2Array 与えられた光線の交線に対応するビジュアルオブジェクトを識別する。
Direct3DRMProgressiveMesh “メッシュを段階的に詳細なものにする方法を記述するレコード”と“粗いベースメッシュ”で構成される。これは、一般的なレベルの詳細項目をメッシュ上でセットするとともに、リモートソースからのメッシュを段階的にダウンロードすることも可能にする。
Direct3DRMShadow2 影を定義する。Direct3DRMShadowオブジェクトと同じだが、影のプロパティを設定したり、作成後に取得することができる。
Direct3DRMTexture3 色の付いたピクセルが矩形に並んで構成される。Direct3DRMTextureオブジェクトと同じであるが、現在実行しているファイル以外のファイルからリソースをロードでき、テクスチャはメモリのイメージから作成でき、またミップマップを生成できる点が異なる。Direct3DRMTexture2オブジェクトを拡張して、テクスチャ管理を詳細に行えるようにした。
Direct3DRMUserVisual システムが提供しない機能を実現する。アプリケーションによって定義される。
Direct3DRMViewport2 3Dシーンがどのように2Dウィンドウにレンダリングされるかを定義する。Direct3DRMViewportオブジェクトと同じだが、クリアする対象を指定できる。
Direct3DRMVisual シーンにレンダリングすることができる。ビジュアルオブジェクトは可視状態でなくてもよい。たとえば、フレームをビジュアルオブジェクトとして追加することもできる。
Direct3DRMWrap 面やメッシュのテクスチャ座標を計算する。

多くのオブジェクトは、配列オブジェクトと呼ばれる配列にグループ化することができる。配列オブジェクトによって、グループ全体に操作を適用することが容易になる。配列オブジェクトを使うことができるCOM(Component Object Model)インターフェイスには、GetElementGetSizeメソッドが含まれている。これらのメソッドは、配列要素へのポインタと配列のサイズを受け取る。配列インターフェイスの詳細については、「インターフェイスリファレンス」を参照すること。

オブジェクトとインターフェイス

IObjectName::QueryInterfaceは、オブジェクトがそのインターフェイスをサポートしている場合のみ、有効なインターフェイスへのポインタを取得する。したがって、IDirect3DRMDevice3::QueryInterfaceを使ってIDirect3DRMWinDeviceインターフェイスを受け取ることはできるが、IDirect3DRMVisualインターフェイスを受け取ることはできない。

オブジェクト名 サポートされるインターフェイス
Direct3DRMAnimation2 IDirect3DRMAnimation2
Direct3DRMAnimationSet2 IDirect3DRMAnimationSet2
Direct3DRMClippedVisual IDirect3DRMClippedVisual, IDirect3DRMVisual
Direct3DRMDevice3 IDirect3DRMDevice3, IDirect3DRMWinDevice
Direct3DRMFace2 IDirect3DRMFace2
Direct3DRMFrame3 IDirect3DRMFrame3, IDirect3DRMVisual
Direct3DRMInterpolator IDirect3DRInterpolator
Direct3DRMLight IDirect3DRMLight
Direct3DRMMaterial2 IDirect3DRMMaterial2
Direct3DRMMesh IDirect3DRMMesh, IDirect3DRMVisual
Direct3DRMMeshBuilder3 IDirect3DRMMeshBuilder3, IDirect3DRMVisual
Direct3DRMProgressiveMesh IDirect3DRMProgressiveMesh, IDirect3DRMVisual
Direct3DRMShadow2 IDirect3DRMShadow2, IDirect3DRMVisual
Direct3DRMTexture3 IDirect3DRMTexture3, IDirect3DRMVisual
Direct3DRMUserVisual IDirect3DRMUserVisual, IDirect3DRMVisual
Direct3DRMViewport2 IDirect3DRMViewport2
Direct3DRMWrap IDirect3DRMWrap

次のサンプルでは、1つのDirect3DRMDevice3オブジェクトに2つのインターフェイスを生成する方法を説明している。IDirect3DRM3::CreateObjectメソッドは、初期化されていないDirect3DRMDevice3オブジェクトを生成する。オブジェクトの初期化は、IDirect3DRMDevice3::InitFromClipperメソッドによって行われる。IDirect3DRMDevice3::QueryInterfaceメソッドの呼び出しは、Direct3DRMDevice3オブジェクトへの2つめのインターフェイス(WM_PAINTおよびWM_ACTIVATEメッセージへの応答時に用いられるIDirect3DRMWinDeviceインターフェイス)を生成する。

d3drmapi->CreateObject(CLSID_CDirect3DRMDevice, NULL,
    IID_IDirect3DRMDevice3,(LPVOID FAR*)&dev1);
dev1->InitFromClipper(lpDDClipper, IID_IDirect3DRMDevice3, 
    r.right, r.bottom);
dev1->QueryInterface(IID_IDirect3DRMWinDevice, (LPVOID*) &dev2);

2つのインターフェイスが同一のオブジェクトを参照しているかどうかを判定するには、それぞれのインターフェイスについてQueryInterfaceメソッドを使って、返されるポインタの値を比較する。ポインタの値が等しい場合、インターフェイスは同じオブジェクトを参照している。

すべてのDirect3D保持モードオブジェクトは、前述したリスト中のインターフェイスに加え、IDirect3DRMObjectインターフェイスとIDirect3DRMObject2インターフェイス、IUnknownインターフェイスをサポートしている。IDirect3DRMObjectは配列オブジェクトを提供しない。配列オブジェクトは、必要がないため、クラス識別子(CLSID)を持っていない。IDirect3DRM3::CreateObjectメソッドの呼び出しでは、配列オブジェクトを作成することはできない。その代わり、各インターフェイスについて以下の生成メソッドを使用する。

配列インターフェイス 生成メソッド
IDirect3DRMAnimationArray IDirect3DRMAnimationSet2::GetAnimations
IDirect3DRMDeviceArray IDirect3DRM3::GetDevices
IDirect3DRMFaceArray IDirect3DRMMeshBuilder3::GetFaces
IDirect3DRMFrameArray IDirect3DRMPickedArray::GetPick, IDirect3DRMPicked2Array::GetPickまたはIDirect3DRMFrame3::GetChildren
IDirect3DRMLightArray IDirect3DRMFrame3::GetLights
IDirect3DRMObjectArray IDirect3DRMInterpolator::GetAttachedObjects
IDirect3DRMPickedArray IDirect3DRMViewport2::Pick
IDirect3DRMPicked2Array IDirect3DRMFrame3::RayPick
IDirect3DRMViewportArray IDirect3DRM3::CreateFrame
IDirect3DRMVisualArray IDirect3DRMFrame3::GetVisuals

オブジェクトと参照カウント

オブジェクトが生成されると、その参照カウントがインクリメントされる。アプリケーションがオブジェクトの子を作成したり、メソッドがオブジェクトへのポインタを返したりするたびに、システムはそのオブジェクトの参照カウントを増加させる。オブジェクトは、参照カウントが0になるまで削除されることはない。オブジェクトに対する操作が完了したら、Releaseメソッドを呼び出して、参照カウントを必ずデクリメントする。たとえば、IDirect3DRM3::CreateMeshBuilderを呼び出してIDirect3DRMMeshBuilder3オブジェクトを作成し、IDirect3DRMMeshBuilder3::GetFacesを呼び出してIDirect3DRMFaceArrayオブジェクトを取得したとする。この場合、アプリケーションを終了する前に、IDirect3DRMMeshBuilder3オブジェクトのReleaseメソッドを呼び出し、IDirect3DRMFaceArrayオブジェクトのReleaseメソッドも呼び出す。Releaseメソッドを呼び出さないと、オブジェクトは適切に解放されず、リソースが浪費される。オブジェクトを解放するサンプルについては、Direct3D保持モードのサンプルコードを参照すること。

Direct3D保持モードには、内部参照カウントと外部参照カウントがある。テクスチャなどのオブジェクトを作成またはインポートし、フレームやメッシュなどのシーンにオブジェクトを適用すると、作成またはインポートしたオブジェクトのインターフェイスのコピーは解放できる。オブジェクトを使用するシーンが完了すると、そのオブジェクトはD3DRMによって自動的に解放される。たとえば、メッシュビルダオブジェクトを作成すると、参照カウントは1にセットされる。次に、オブジェクトをフレームに追加すると、参照カウントは2にセットされる。その後、メッシュビルダオブジェクトへのポインタのコピーを解放すると、メッシュビルダオブジェクトの参照カウントは1に戻される。さらに、そのフレームを含むシーンを解放すると、メッシュビルダオブジェクトの参照カウントはデクリメントされて0になり、オブジェクトが解放される。もう1つ例を示す。テクスチャをインポートすると、テクスチャオブジェクトの参照カウントは1にセットされる。テクスチャをメッシュに適用すると、参照カウントは2になる。テクスチャオブジェクトへのポインタのコピーを解放すると、参照カウントは1に戻る。メッシュを解放すると、テクスチャオブジェクトの参照カウントはデクリメントされて解放される。

シーンに適用した後でオブジェクトを解放したら、アプリケーションは参照カウントを追跡する必要はなく、シーンのルートだけ追跡すればよい。保持モードは他の参照カウントを自動的に追跡する。この場合、クリーンアップが完了してアプリケーションを終了する前に、アプリケーションは、シーン、ビューポート、デバイスを解放するだけでよい。アプリケーションがビューポートを解放すると、システムはカメラの参照カウントを自動的に調整する。

子オブジェクトやビジュアルオブジェクトの参照カウントは、フレームに追加されるときに増やされる。IDirect3DRMFrame3::AddChildメソッドを使用して、ある親オブジェクトから別の親に子オブジェクトを移動すると、システムは自動的に参照カウントを操作する。

アプリケーションがビジュアルオブジェクトをシーンにロードした後は、シーンがオブジェクトの参照カウントを管理する。アプリケーションにとっては、ビジュアルオブジェクトはもう不要となり、解放することができる。

ラップの作成と適用は、どのオブジェクトの参照カウントも増加させない。ラッピングは、単にテクスチャの座標を計算するだけの便利なメソッドにすぎないためである。


トップに戻る トップに戻る
© 1999 Microsoft and/or its suppliers. All rights reserved. Terms of Use.