Microsoft DirectX 8.0 (C++) |
Microsoft® Direct3D® では、ジョイント部が滑らかにブレンドされているセグメント化されたポリゴン オブジェクト、特にキャラクタをレンダリングすることで、シーンを一層リアルに表現することができる。これらのエフェクトを一般にスキニングと呼ぶ。このエフェクトは、追加のワールド トランスフォーム行列を頂点の単一セットに適用し、その結果生成される複数のトランスフォーム後の頂点間で線形ブレンドを実行してレンダリング用のジオメトリの単一セットを生成することで実現される。次のバナナのイラストは、この例を示している。
この画像は、ジオメトリ ブレンディングの処理がどのようなものであるかを示している。1 回のレンダリングの呼び出しで、システムはバナナの頂点を取得し、この頂点に対して回転しないトランスフォームと単純な回転のトランスフォームを 1 回ずつ実行して、その結果曲がったバナナを生成する。システムは、ライティングが有効な場合に、頂点法線だけでなく頂点位置座標もブレンドする。アプリケーションは 2 つのブレンディング方法に限定されるわけではない。Direct3D は、最大 4 つのワールド行列 (標準ワールド行列の D3DTS_WORLD など) 間でジオメトリをブレンドできる。
注 ライティングが有効になっている場合、頂点法線が、対応するワールド ビュー行列の逆行列によってトランスフォームされる。この際、重み付けは、頂点位置座標の計算の場合と同様に行われる。D3DRS_NORMALIZENORMALS レンダリング ステートが TRUE に設定されている場合は、結果の法線ベクトルがシステムによって正規化される。
可動結合部のあるモデルの場合、ジオメトリ ブレンディングを使用せずに部分ごとにレンダリングされることが多い。たとえば、人間の腕の 3D モデルを考える。最も単純にして、腕には身体につながる上腕と手につながる下腕がある。2 本の腕はともに肘につながっており、下腕はこの位置座標で回転する。アプリケーションで腕をレンダリングする場合、上腕と下腕の頂点データは保持され、それぞれに個別のワールド トランスフォーム行列が適用される。次のサンプル コードは、これを示している。
typedef struct _Arm { VERTEX upper_arm_verts[200]; D3DMATRIX matWorld_Upper; VERTEX lower_arm_verts[200]; D3DMATRIX matWorld_Lower; } ARM, *LPARM; ARM MyArm; // これは初期化する必要がある。
腕をレンダリングするには、次のコードで示すように、レンダリングの呼び出しを 2 回実行する。
// 上腕をレンダリングする。 d3dDevice->SetTransform( D3DTS_WORLD, &MyArm.matWorld_Upper ); d3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, numFaces ); // 下腕をレンダリングして、腕を関節でつなぐワールド行列を更新する。 // 肘で pi/4 ラジアン (45°) ずつ回転するようにする。 MyArm.matWorld_Lower = RotateMyArm(MyArm.matWorld, pi/4); d3dDevice->SetTransform( D3DTS_WORLD, &MyArm.matWorld_Lower ); d3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, numFaces );
次の画像は、このテクニックを使ってバナナを修正したものである。
ブレンドされたジオメトリと、ブレンドされていないジオメトリの違いは明らかである。この例でもその違いははっきりわかる。実際のアプリケーションでは、各モデルをジョイントしても、それほどジョイント部が目立つことはない。しかし、ジョイント部が見苦しく表示されることもある。これは、モデル デザイナにとっては常に課題である。
Direct3D のジオメトリ ブレンディングでは、従来のセグメント モデル シナリオを使用することもできる。しかし、分割されている個々のオブジェクトの表示品質を上げるには、レンダリング時のブレンディング計算が必要となる。これらの追加処理による影響を最小限に抑えるために、Direct3D ジオメトリ パイプラインは、可能な限りオーバーヘッドを発生させないでジオメトリをブレンドできるように最適化される。アプリケーションでは Direct3D のジオメトリ ブレンディング サービスを有効に使用することで、パフォーマンスへの深刻な影響を避けながら、キャラクタをより本物らしく表現することができる。