基礎知識

以下のトピックでは、3Dグラフィックスを組み込むプログラムを書く前に理解する必要のある技術的な概念をいくつか説明する。それらの項では、座標系と変換の一般的な説明を行っている。これは、モデル、照明、ビューイングパラメータの設定などの、幅広いアーキテクチャ上の詳細事項を説明するものではない。そうした事項の詳細については、「Direct3D保持モードアーキテクチャ」を参照すること。

3Dグラフィックスを作った経験がある場合には、Microsoft® Direct3D® 保持モードに特有の情報だけを調べるように以下のトピックを読むこと。

3D座標系

3Dグラフィックスアプリケーションでは、通常、左手座標系と右手座標系の2つのデカルト座標系を使用する。両方の座標系で、x軸の正方向は右側であり、y軸の正方向は上方である。z軸の正方向は、x軸の正方向に左手または右手の指を向け、それをy軸の正の方向に回転した方向になる。親指の方向、手前または奥が、この座標系でのz軸の正方向である。

この項は、Direct3Dの座標系とユーザのアプリケーションが使用できる座標タイプを説明する。

Direct3Dの座標系

Direct3Dはデフォルトでは左手座標系を使用する。つまり、下の図に示すように正のz軸が見る者から離れる方向を指す。

Direct3Dの座標系

左手座標系では、回転は、見る者を指す任意の軸の周囲を時計回りに回転する。

右手座標系で作業する必要のある場合、たとえば、右手座標系に従うアプリケーションを移植する場合には、Direct3Dに渡されるデータに2つの単純な変更を加えるだけで行うことができる。

注: DirectXバージョン6.0からは、IDirect3DRM3::SetOptionsを使用して、Direct3D保持モードに対して右手座標系を使用することを指示できる。IDirect3DRM3::SetOptionsを使用すると、データを変更する必要がなくなる。

DirectX バージョン6.0より前のバージョンでは、右手座標系を使用する場合、Direct3D保持モードに渡すデータを、次のように変更する必要がある。

U座標とV座標

Direct3Dは、テクスチャ座標も使用する。この座標(uとv)は、オブジェクト上にテクスチャをマップするときに使用する。vベクトルは、テクスチャの方向または向きを表し、z軸に沿って存在する。uベクトル(またはアップベクトル)は通常、y軸に沿って存在し、その原点は[0,0,0]にある。uとv座標の詳細については、「ラップ」を参照すること。

3D変換

3Dグラフィックスと機能するプログラムでは、幾何変換を使用して次のことが可能である。

4×4行列を使用して、任意の点を別の点に変換することができる。以下の例では、行列を使用して点(x,y,z)を変換して新しい点(x', y', z')を作り出している。

4×4行列を使った点の変換

以下の操作を(x, y, z)および行列に実行して点(x', y', z')を作り出す。

行列変換による操作

最も普通の変換は、平行移動、回転およびスケーリングである。これらの効果を作り出す行列を1つの行列に結合して、複数の変換を一度に計算することができる。たとえば、1つの行列を作成して、一連の点を平行移動し回転することができる。

行列は行順に指定される。たとえば、次の行列は、配列で表すことも可能である。

以下の配列で表される行列サンプル

この行列に対応する配列は、以下のようになる。

D3DMATRIX scale = {
    D3DVAL(s),    0,            0,            0,
    0,            D3DVAL(s),    D3DVAL(t),    0,
    0,            0,            D3DVAL(s),    D3DVAL(v),
    0,            0,            0,            D3DVAL(1)
};

この項では、Direct3を介してユーザのアプリケーションが使用できる3D変換を説明する。

このマニュアルの他の部分でも変換について説明している。保持モードのビューポートだけを取り扱った項「変換」に変換の一般的な説明がある。フレーム中の変換の説明については、「変換」を参照すること。以上の各項では、保持モードAPIを説明しているが、変換のアーキテクチャと数学は、保持モードと直接モードの両方に適用される。

平行移動

以下の変換は、点(x, y, z)を新しい点(x', y', z')に平行移動する。

点を変換する行列

回転

この項で説明する変換は、左手座標系に対するものなので、ユーザが他で目にした変換行列とは異なる場合もある。

以下の変換は、点(x, y, z)をx軸の回りで回転し、新しい点(x', y', z')を作り出す。

x軸の回りで点を回転させる行列

以下の変換は、点をy軸の回りで回転させる。

y軸の回りで点を回転させる行列

以下の変換は、点をz軸の回りで回転させる。

z軸の回りで点を回転させる行列

以上の例の行列で、ギリシャ文字のシータは、ラジアン単位で指定された回転角を表すことに注意する。角度は、原点方向に回転軸に沿って見る方向で、時計回りに計る。

スケーリング

以下の変換は、x、y、zの各方向の任意の値によって点(x, y, z)を新しい点(x', y', z')にスケーリングする。

点をスケーリングする行列

ポリゴン

Direct3Dの3次元オブジェクトは、メッシュで構成される。メッシュとは、面の集合であり、各面は単純なポリゴンで表される。基本的なポリゴンのタイプは、三角形である。保持モードアプリケーションでは、4頂点以上のポリゴンを指定できるにもかかわらず、システムは、オブジェクトをレンダリングする前にポリゴンを三角形に変換する。直接モードアプリケーションでは、三角形を使用しなければならない。

この項では、ユーザのアプリケーションがDirect3Dポリゴンをどのように使用するかを説明する。

図形要件

三角形はよく使用されるポリゴンのタイプである。三角形は、レンダラがポリゴンに要求する2条件 (常に凸であり、常に平坦である) を満たすからである。ポリゴンは、ポリゴンの任意の2点を直線で結んだとき、その直線がまたポリゴンの内部に存在する場合に凸であるという。

凸凹状のポリゴンの図

三角形の3頂点は、常に平面を表すが、もう1つの頂点を追加することによって、非平面のポリゴンを作成することは簡単である。

非平面のポリゴンの図

面法線と頂点法線

メッシュ中の各面には、垂直面の法線ベクトルがある。法線ベクトル の方向は、頂点が定義されている順序と座標系が、左手座標系か右手座標系かによって決定される。面の法線ベクトルが見る者の方向に向かっている場合には、その側の面が前になる。Direct3Dでは、面の前側だけが可視であり、前面は、その中で頂点が時計回りに定義されるものになる。

ポリゴンの面の頂点と法線ベクトルの図

Direct3Dアプリケーションは面法線を指定する必要はない。必要なときはシステムが面法線を自動的に計算する。システムは、フラットシェーディングモードでは面法線を、グーローシェーディングモードでは頂点法線を使用する。また、Direct3Dは照明効果とテクスチャ効果の制御にも頂点法線を使用する。

頂点法線と面法線の図

シェーディングモード

フラットシェーディングモードでは、システムは、1つの頂点の色をプリミティブの他の面のすべてに再現する。グーローとフォンシェーディングモードでは、頂点法線は、ポリゴンオブジェクトが円滑に見えるようにするために使用する。グーローシェーディングでは、隣接の頂点の色と輝度は、頂点を隔てている空間に渡って補間される。フォンシェーディングでは、システムが面上の各ピクセルに対する適切なシェーディング値を算出する。

フォンシェーディングは、現在サポートされていない。

アプリケーションは、普通、オブジェクトを滑らかに見せ、また計算も効率的であるので、グーローシェーディングを使用する。ただし、グーローシェーディングは、フォンシェーディングが見逃さない細部を見逃す場合がある。この例として挙げたのが次の図である。ここでは、スポットライトがポリゴンの表面に完全に吸収されてしまっている。

グーローシェーディングとフォンシェーディングを比較した面上のスポットライトの図

この場合、フォンシェーディングモードは、各ピクセルに対する値を計算し、スポットライトを表示する。グーローシェーディングモードは、頂点の間を補間するので、スポットライトはすべて省略され、あたかもスポットライトが存在しないかのように面がレンダリングされる。

フラットシェーディングモードでは、次のピラミッドは隣接する面の間に鋭いエッジがあるように表示される。システムは、自動的に面法線を生成する。しかし、グーローまたはフォンシェーディングモードでは、シェーディング値がエッジ全体に補間され、最終的に曲面のサーフェスが表示される。

フラットシェーディングモードのピラミッド

グーローまたはフォンシェーディングモードを使用して曲面を表示し、また、鋭いエッジを持つ複数のオブジェクトを含めたい場合、ユーザのアプリケーションでは、次の図で示すように鋭いエッジを必要とする面の任意の交わりで頂点法線を再現する必要がある。

平面ではなくシェーディングに鋭いエッジを保持するために必要な頂点法線

単一のオブジェクトに、曲面と平面の両方を持つようにするのに加えて、グーローシェーディングモードは、平坦なサーフェスを、フラットシェーディングモードよりも現実感のあるように光で照らす。フラットシェーディングモードでのサーフェスは一様な色であるが、グーローシェーディングモードでは、光が面全般に正しく当たるようにできる。この効果は近くに点ソースがある場合に、特に目に付くことになる。グーローシェーディングモードは、多くのDirect3Dアプリケーションが求めるシェーディングモードである。

三角形補間要素

システムは、面をレンダリングするとき三角形全体で三角形の頂点の特性を補間する。三角形補間要素は次のとおりである。

これらの三角形補間要素はすべて、現在のシェーディングモードによって変わる。

フラット 補間は行われない。その代わり、三角形の最初の頂点の色が面全体に適用される。
グーロー 線形補間が3つの頂点すべての間で実行される。
フォン 頂点パラメータが、現在の照明を使用して、面の各ピクセルに対して再計算される。フォンシェーディングモードは、現在サポートされていない。

色補間要素と反射色補間要素の処理は色モデルによって異なる。RGB色モデル(D3DCOLOR_RGB)では、システムは赤色、緑色、および青色成分を使って補間を行う。モノクロモデル(D3DCOLOR_MONO)では、システムは頂点色の青色成分のみ使用する。

たとえば、頂点1の色の赤成分が0.8、頂点2の赤成分が0.4であるとすると、グーローシェーディングモードとRGB色モデルでは、システムは補間を使用して、それらの頂点の線分の中点にあるピクセルに赤成分の0.6を割り当てる。

色のアルファ成分は、別個の補間要素として処理される。デバイスドライバが透明性を、テクスチャブレンディングまたは点描による2とおりの方法で実装できるからである。

アプリケーションは、D3DPRIMCAPS構造体のdwShadeCapsメンバを使用して、現在のデバイスドライバがサポートする補間の形式を確認することができる。

三角形の展開図と扇形

各三角形の3頂点すべてを指定することなく、三角形展開図と三角形扇形を使用して全面を指定することができる。たとえば、以下の三角形の展開図を定義するには、7つの頂点しか必要としない。

三角形の展開図とその頂点のサンプル

システムが、頂点のv1、v2、v3を使用して最初の三角形を、v2、v4、v3を使用して2番目の三角形を、v3、v4、v5を使用して3番目の三角形を、v4、v6、v5を使用して4番目の三角形を、という手順で描画していく。2番目と4番目の三角形の頂点が順序通りでないことに注意する。これは、すべての三角形が時計回りの方向に描画することを保証するために必要となる。

三角形扇形は、すべての三角形が1つの頂点を共有する点を除けば、三角形展開図に類似している。

三角形扇形の図

システムは、頂点v1、v2、v3を使用して最初の三角形を、v3、v4、v1を使用して2番目の三角形を、v1、v4、v5を使用して3番目の三角形を、という手順で描画していく。

D3DTRIANGLE構造体のwFlagsメンバを使用して、三角形展開図と扇形を作成するフラグを指定することができる。

ベクトル、頂点、および4元数

Direct3D全体を通じて、頂点は位置と方向を表す。プリミティブ中の各頂点は、その位置を与えるベクトルと、その方向を与える法線ベクトル、テクスチャ座標、および色によって記述される(保持モードでは、D3DRMVERTEX構造体が以上の値を格納する)。

4元数は、ベクトルを定義する [x, y, z] 値に4番目の要素を追加する。4元数は、3D回転に使用される行列メソッドに代わるものである。4元数は、3D空間での軸とその軸を中心とする回転を表す。たとえば、4元数は、(1,1,2)軸と1ラジアンの回転を表すこともできる。4元数は、重要な情報を伝えるが、その本当の威力は、それに対して実行できる2つの操作の合成補間にある。

4元数に合成を実行するのは、結合することと類似している。2つの4元数の合成は、以下のように表される。

2つの4元数の合成を表す式

図形に適用される2つの4元数の合成は、「軸2の回りに回転2で図形を回転させた後、軸1の回りに回転1で回転させる」ことを意味する。この場合、Qが単一の軸の回りの回転を表し、その結果がq2に適用された後、q1が図形に適用される。

4元数補間を使用すると、アプリケーションは、1つの軸と方向から別の軸と方向へ、滑らかで合理性のあるパスを算出することができる。したがって、q1とq2の間の補間は、1つの方向から別の方向へアニメーションを動かす簡単な方法を提供する。

合成と補間を同時に使用すると、複雑に見えるが、実は単純な方法で図形を処理することができる。たとえば、指定の方向に回転させたい図形があるものと仮定する。軸2を中心にr2度回転させた後、軸1を中心にr1度回転させたいことまではわかっているが、最終的な4元数はわからない。合成を使用して、図形上の2つの回転を合成し、結果として単一の4元数を得ることができる。その後、元の4元数から合成された4元数まで補間して、一方から他方への滑らかな移行を実現する。

Direct3D保持モードには、4元数を使用する上で、ユーザの助けになる関数がいくつか含まれている。たとえば、D3DRMQuaternionFromRotation関数は、回転値を回転軸を定義するベクトルに追加し、結果をD3DRMQUATERNION構造体が定義する4元数に返す。また、D3DRMQuaternionMultiply関数は、4元数を合成して、D3DRMQuaternionSlerpは、2つの4元数間で球面線形補間を実行する。

保持モードアプリケーションは、以下の関数を使用してベクトルと4元数を使用する作業を簡単にすることができる。

Zバッファとオーバーレイ

Zバッファの順序は、オーバーレイが互いにクリッピングするその順序を決める。オーバーレイは、他のすべてのスクリーンコンポーネントの先頭にくるものと仮定されている。指定 Zオーダーを持たないオーバーレイは、プライマリサーフェスの同じ領域でオーバーレイを行うときに予測できない動作をする。Zバッファがないと、Direct3D保持モードはオーバーレイをソートしない。指定 Zオーダーを持たないオーバーレイはZオーダー0を持つものとされ、レンダリングする順序で現れる。オーバーレイのZオーダーの可能な範囲は、プライマリサーフェスのすぐ上である0から、見る人にできる限り近い40億までである。Zオーダー2のオーバーレイは、Zオーダー1のオーバーレイを覆い隠す。どのオーバーレイも、他のオーバーレイと同一のZオーダーを持つことはできない。


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