フレーム

フレームという用語は、オブジェクトの物理フレームを参照していることに由来している。保持モードにおけるフレームの役割は、ウィンドウシステムにおけるウィンドウの役割に似ている。オブジェクトは、単にワールド空間に置かれるのではなく、関連する参照フレームとの空間的なリレーションシップ(相互関係)を記述することによってシーンに配置される。フレームはオブジェクトをシーンに配置する。また、ビジュアルオブジェクトを表示するときには、フレームから位置や向きを取得する。

保持モードのシーンは、親フレームを持たないフレームが定義する。すなわち、フレーム階層の最上位フレームが定義する。また、このフレームはルートフレームまたはマスタフレームと呼ばれることもある。シーンは、他のすべてのオブジェクトに対して参照フレームを定義する。シーンの作成は、IDirect3DRM3::CreateFrameメソッドを呼び出して、最初のパラメータをNULLに指定して行うことができる。

IDirect3DRMFrame3インターフェイスは、IDirect3DRMFrame2インターフェイスの拡張である。また、IDirect3DRMFrame2は、マテリアル、境界ボックス、およびフレーム付きの軸の使用を可能にするメソッドを備えている。IDirect3DRMFrame2は、光線ピックもサポートする。

IDirect3DRMFrame3::SetAxesおよびIDirect3DRMViewport2::SetProjectionメソッドで、D3DRMPROJECTIONTYPE構造体の右手投影タイプを使用して、右手投影を可能にできる。

関連情報については、「IDirect3DRMFrame3」を参照すること。

この項では、フレームとその使用法について説明する。

階層

シーンのフレームは階層構造になっている。フレームは親フレームや子フレームを持つことができる。親フレームを持たないフレームはルートフレームと呼ばれ、シーンを定義する。

子フレームは、親フレームに対して相対的な位置と向きを示している。親フレームが移動すると、子フレームも移動する。

フレームの位置や向きは、シーン上の他のフレームからの相対値で設定することができる。絶対位置を設定する必要がある場合は、ルートフレームからの相対値が使用できる。また、ある親フレームからフレームを削除し、IDirect3DRMFrame3::AddChildメソッドにより、いつでも他のフレームに追加することができる。子フレームを完全に削除するにはIDirect3DRMFrame3::DeleteChildメソッドを使用する。子フレームや親フレームを取得するには、IDirect3DRMFrame3::GetChildrenおよびIDirect3DRMFrame3::GetParentメソッドを使用する。

フレームは、他のフレームのビジュアルオブジェクトとして追加でき、与えられた階層構造を、シーン全体に渡って何度も利用することが可能になる。新しい階層はインスタンスと呼ばれる。パフォーマンスの低下を防ぐため、親フレームを子フレームに入れ込まないように注意が必要である。保持モードは、実行時に巡回階層のチェックを行わない。巡回階層の作成は、IDirect3DRMFrame3インターフェイスのメソッドではできず、フレームをビジュアルオブジェクトとして追加するときにのみ可能である。

変換

フレームの位置や向きは、親フレームへの相対的な線形変換と考えることもできる。この変換は親フレームから子フレームへの相対ベクトルを取得し、親フレームへの相対ベクトルを求める。

変換は4×4行列で表すことができ、座標は4要素の行ベクトル [x, y, z,1] で表すことができる。

子フレームにおける座標をvchildとすると、同じ座標を親フレームvparentで表す式は、次のように定義される。

親フレームの定義

Tchildは、子フレームの変換行列である。

子フレームからルートフレームまでのすべての親フレームの変換は、子フレームがワールド座標を生成する変換と結び付けられている。このワールド変換は、レンダリングの前に、子フレーム上のビジュアルオブジェクトに対して適用される。子フレームに対する相対座標は、モデル座標と呼ばれることがある。ワールド変換が行われた座標は、ワールド座標と呼ばれる。

フレームの変換は、IDirect3DRMFrame3::AddTransformIDirect3DRMFrame3::AddScaleIDirect3DRMFrame3::AddRotationIDirect3DRMFrame3::AddTranslationの各メソッドによって、直接変更することができる。それぞれのメソッドにはD3DRMCOMBINETYPE列挙型のメンバを渡し、どのようにアプリケーションが提供した行列を現在のフレームの行列と合成するかを指定する。

IDirect3DRMFrame3::GetRotationIDirect3DRMFrame3::GetTransformメソッドは、フレームの回転軸と変換行列を取得する。フレームの回転を変更するには、IDirect3DRMFrame3::SetRotationメソッドを利用する。

ワールド座標とモデル座標を変換するには、IDirect3DRMFrame3::TransformIDirect3DRMFrame3::InverseTransformメソッドを使用する。

変換のさらに一般的な説明は、ビューポートだけを取り扱った項「変換」にある。変換の数学の概要については、「3D変換」を参照すること。

運動(モーション)

各フレームは固有の回転や速度で動く。回転も移動もしないフレームでは、これらの属性は0である。これらの属性は、シーンをレンダリングしてオブジェクトを動かす前に使用され、単純なアニメーションを作成することもできる。

コールバック関数

フレームは、より複雑なアニメーションを実現するため、コールバック関数をサポートしている。アプリケーションが登録したコールバック関数は、モーション属性が適用される前にフレームから呼び出される。階層に複数のフレームがあり、それぞれがコールバック関数に関連付けられている場合は、子フレームの前に親フレームが呼び出される。このような階層では、コールバック関数のすべてが呼び出されるまで、レンダリングは実行されない。

コールバック関数を追加するには、IDirect3DRMFrame3::AddMoveCallbackメソッドを使用する。コールバック関数を削除するには、IDirect3DRMFrame3::DeleteMoveCallbackメソッドを使用する。

これらのコールバック関数を用いると、プログラム済みのアニメーションシーケンスに新しい位置や向きを設定したり、シーン上の他のオブジェクトの位置によってビジュアルオブジェクトの動作を動的にインプリメントすることができる。


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