インターポレータは、アクションを格納した後、中間値を自動計算してオブジェクトにアクションを適用する方法を提供する。たとえば、ユーザは時間0で赤を、時間10で緑をシーンの背景色にセットすることができる。その後、インターポレータは自動的に、連続するシーンに色合いを付けて赤から緑に混合するようにできる。インターポレータを使用して、色を混合し、異なる位置間でオブジェクトを円滑に移動し、メッシュをモーフィングし、またほかのさまざまな変換も行うことができる。
Direct3D保持モード実装では、インターポレータは、ユーザがアニメートできるオブジェクトパラメータの種類を増加させるIDirect3DRMAnimation2インターフェイスの一般化である。IDirect3DRMAnimation2インターフェイスがオブジェクトの位置、サイズ、および方向のアニメーションを可能にする一方で、IDirect3DRMInterpolatorインターフェイスはさらに色、メッシュ、テクスチャ、およびマテリアルのアニメーションをイネーブルにする。
この項では、次の項目について説明する。
インターポレータが格納するアクションは、キーと呼ばれる。キーは、格納されたプロシージャ呼び出しで、それに関連したインデックスを持つ。インターポレータは、自動的に中間のキー値を計算する。
サポートされているインターポレート可能なインターフェイスメソッドの1つを呼び出して、キーをインターポレータの中に格納する。メソッドとメソッドに渡されるパラメータ値がキーを構成する。「インターポレータがサポートするメソッド」に、サポートされているメソッドの一覧がある。
インターポレータ内部に格納されている各キーには、インデックス値がある。キーが記録されるとき、キーには、現在のインターポレータインデックス値のスタンプが押される。このキーのインデックス値は、この値をいったん設定すると絶対に変ることはない。
オブジェクトは、関連タイプのインターポレータに接続することができる。たとえば、Meshは、MeshInterpolatorに接続できる。インターポレータには、以下のタイプがある。
- FrameInterpolator
- LightInterpolator
- MaterialInterpolator
- MeshInterpolator
- TextureInterpolator
- ViewportInterpolator
あるインターポレータを別のインターポレータに接続することも可能である。インターポレータのインデックスを変更すると、任意の接続する先のインターポレータのインデックスに同じ値をセットすることになる。
MeshInterpolatorsの場合、MeshInterpolatorオブジェクトのIDirect3DRMMeshインターフェイス上で、SetVerticesを呼び出すことによって、MeshInterpolatorオブジェクトにSetVerticesキーを追加することに注意する。SetVerticesで使用されるグループインデックスは、Meshオブジェクトまたはインターポレータが適用されるオブジェクト中の有効なグループインデックスに対応しなければならない。
例として、フレームの位置を補間したい場合を考える。この場合、2つのインターフェイスIDirect3DRMInterpolatorおよびIDirect3DRMFrame3を持つFrameInterpolatorオブジェクトが必要になる。
pd3drm->CreateObject(CLSID_CDirect3DRMFrameInterpolator, 0,
IID_IDirect3DRMInterpolator, &pInterp); pInterp->QueryInterface(IID_IDirect3DRMFrame3, &pFrameInterp);
位置キーをインターポレータに追加するには、IDirect3DRMInterpolator::SetIndexを呼び出してインターポレータの内部インデックスを設定し、IDirect3DRMFrame3インターフェイスのSetPositionメソッドを呼び出してその位置を記録する。このメソッドは、実際のフレームではなく、インターポレータに適用される。関数呼び出しとそのパラメータが、現在のインデックス付きの新しいキーとして格納される。
pInterp->SetIndex(keytime); pFrameInterp->SetPosition(NULL, keypos.x, keypos.y, keypos.z);
1つまたは複数のオブジェクトのメソッドが、後に続くIDirect3DRMInterpolator::SetIndexを使用してインデックスを設定する処理を繰り返すことによって、複数のキーを追加することができる。実際のフレームを介して逆方向にアクションを再生するには、そのフレームをインターポレータに接続する。
pInterp->AttachObject(pRealFrame);
ここで、IDirect3DRMInterpolator::Interpolateを呼び出して、補間された位置を使用してpRealFrameの位置をセットする。
pInterp->Interpolate(time, NULL,
D3DRMINTERPOLATIONSPLINE | D3DRMINTERPOLATION_OPEN);
インターポレータは、最も近いSetPositionキーどうしを(この場合、Bスプラインを使用して)補間して算出した位置を渡し、接続されているフレームのSetPositionメソッドを呼び出す。
または、直接形式のInterpolateを使用して、オブジェクトを2番目のパラメータとして渡すことができる。この操作は、接続されているオブジェクトのすべてに優先する。
pInterp->Interpolate(time, pRealFrame, D3DRMINTERPOLATIONSPLINE | D3DRMINTERPOLATION_OPEN);
同じインターポレータを使用して方向、スケール、速度、およびカラーキーなどの他のキーを格納することができる。各プロパティは、平行のタイムライン上に存在し、Interpolateの呼び出しは、各プロパティの補間された値を接続されているフレームに割り当てる。
複数のメソッドを補間することも可能である。たとえば、SetGroupColorおよびSetVerticesの各キーを同じインターポレータに格納することも可能である。異なるメソッドのキーどうしを補間することはできないので、キーチェインと呼ばれる並行実行スレッドに格納される。また、SetGroupColor(0, black)およびSetGroupColor(2, white)などの異なるグループから2つのキーを指定する場合は、キーが異なるグループに適用されるので、インターポレータがSetGroupColor(1, gray)の中間アクションを生成することは無意味である。この場合、キーは別個のチェインにも格納される。
ビューポート
フレーム
メッシュ
ライト
テクスチャ
マテリアル
*は、このパラメータに対して異なる値のキーが別のチェインに挿入されることを示す。
サポートされていないキーを設定しようとすると、致命的ではないが、D3DRMERR_BADOBJECTエラーの原因となる。
インターポレータは、ある範囲のインデックス値を受け付ける。このインデックスの範囲は、以下の規則により指示される。
- 範囲の始点は、すべてのキーインデックス値と現在のインデックスの中の最小値である。
- 範囲の終点は、すべてのキーインデックス値と現在のインデックスの中の最大値である。
IDirect3DRMInterpolator::Interpolateのd3drmInterpFlagsパラメータに、次のオプションから1つ以上を指定して、補間を実行する。
インターポレータがCLOSEDで実行される場合、補間は循環的になる。キーは、実際には、インデックス範囲に等しい時間で永遠に繰り返される。アニメーションとの互換性をとるために、インデックス範囲の終点に等しいインデックスのキーは、すべて無視される。
補間がOPENの場合には、各キーチェインの最初と最後のキーがインデックス範囲外の補間値を修正する。
NEAREST、LINEAR、SPLINEオプションは、各キーチェインで補間がどのように行われるかを指定する。中間値はキーチェイン間の値から計算され、キーデータのポイントを滑らかに結合する。NEARESTが指定されると、一番近いキーの値が使用される。LINEARは、線形補間を2つの最も近いキーの間で行う。SPLINEは、Bスプライン混合関数を4つの最も近いキーに対して使用する。
次の2つのオプションは、IDirect3DRMMesh::SetVerticesの補間だけに影響する。
- VERTEXCOLORは、頂点の色を補間するように指定する。
- SLERPNORMALSは、頂点の法線が球面補間されるように指定する(現在未実装)。
トップに戻る
© 1999 Microsoft and/or its suppliers. All rights reserved. Terms of Use.