変換の概要Transform overview

3D グラフィックスの多くの低レベル数学演算は、行列変換によって処理されます。Matrix transformations handle a lot of the low level math of 3D graphics.

ジオメトリ パイプラインは、頂点を入力として受け取ります。The geometry pipeline takes vertices as input. 変換エンジンは、ワールド変換、ビュー変換、射影変換を頂点に適用し、結果をクリッピングして、すべてをラスタライザーに渡します。The transform engine applies the world, view, and projection transforms to the vertices, clips the result, and passes everything to the rasterizer.

変換と空間Transform and space 説明Description
モデル空間内のモデル座標Model coordinates in model space パイプラインの最初の処理では、モデルの頂点はローカル座標系を基準として相対的に宣言されます。At the head of the pipeline, a model's vertices are declared relative to a local coordinate system. これはローカルの原点と方向です。This is a local origin and an orientation. この座標の方向は、一般に "モデル空間" と呼ばれます。This orientation of coordinates is often referred to as model space. 個々の座標は "モデル座標" と呼ばれます。Individual coordinates are called model coordinates.
ワールド空間へのワールド変換World transform into world space ジオメトリ パイプラインの最初のステージでは、モデルの頂点が、ローカル座標系からシーン内のすべてのオブジェクトで使われる座標系に変換されます。The first stage of the geometry pipeline transforms a model's vertices from their local coordinate system to a coordinate system that is used by all the objects in a scene. 頂点の方向を再設定する処理はワールド変換と呼ばれ、モデル空間から "ワールド空間" という新しい方向への変換が行われます。The process of reorienting the vertices is called the World transform, which converts from model space to a new orientation called world space. ワールド空間内の各頂点は、 "ワールド座標" を使って宣言されます。Each vertex in world space is declared using world coordinates.
ビュー空間 (カメラ空間) へのビュー変換View transform into view space (camera space) 次のステージでは、3D ワールドを記述する頂点が、カメラを基準とする方向に変換されます。In the next stage, the vertices that describe your 3D world are oriented with respect to a camera. つまり、アプリケーションでシーンの視点を選択すると、ワールド空間座標が再配置されてカメラの視点を中心に回転し、ワールド空間から "ビュー空間" ( "カメラ空間" とも呼ばれます) に切り替わります。That is, your application chooses a point-of-view for the scene, and world space coordinates are relocated and rotated around the camera's view, turning world space into view space (also known as camera space). これが、ワールド空間からビュー空間に変換するビュー変換です。This is the View transform, which converts from world space to view space.
射影空間への射影変換Projection transform into projection space 次のステージは射影変換です。これにより、ビュー空間から射影空間への変換が行われます。The next stage is the Projection transform, which converts from view space to projection space. パイプラインのこの部分では、シーンに奥行き感を与えるために、オブジェクトが通常はビューアーからの距離に基づいてスケーリングされます。つまり、近くのオブジェクトは遠くのオブジェクトよりも大きく見えるように調整されます。In this part of the pipeline, objects are usually scaled with relation to their distance from the viewer in order to give the illusion of depth to a scene; close objects are made to appear larger than distant objects. わかりやすくするために、このドキュメントでは、射影変換後に頂点が存在する空間を "射影空間" と呼びます。For simplicity, this documentation refers to the space in which vertices exist after the projection transform as projection space. グラフィックスの解説書によっては、射影空間を "透視射影変換後の同次空間" と呼ぶ場合もあります。Some graphics books might refer to projection space as post-perspective homogeneous space. すべての射影変換でシーン内のオブジェクトのサイズが変更されるとは限りません。Not all projection transforms scale the size of objects in a scene. このような射影は、 "アフィン変換""直行変換" と呼ばれることがあります。A projection such as this is sometimes called an affine or orthogonal projection.
スクリーン空間でのクリッピングClipping in screen space パイプラインの最後の部分では、画面に表示されない頂点がすべて削除されます。これにより、表示されないオブジェクトの色や影の計算にラスタライザーが時間を費やすことはなくなります。In the final part of the pipeline, any vertices that will not be visible on the screen are removed, so that the rasterizer doesn't take the time to calculate the colors and shading for something that will never be seen. このプロセスを "クリッピング" と呼びます。This process is called clipping. クリッピング後、残りの頂点はビューポート パラメーターに従ってスケーリングされ、スクリーン座標に変換されます。After clipping, the remaining vertices are scaled according to the viewport parameters and converted into screen coordinates. 結果として得られる頂点は "スクリーン空間" に存在し、シーンがラスタライズされるときに画面に表示されます。The resulting vertices, seen on the screen when the scene is rasterized, exist in screen space.

 

変換は、オブジェクト ジオメトリをある座標空間から別の座標空間に変換するために使われます。Transforms are used to convert object geometry from one coordinate space to another. Direct3D では、行列を使って 3D 変換を実行します。Direct3D uses matrices to perform 3D transforms. 行列は 3D 変換を作成します。Matrices create 3D transforms. 複数の行列を結合することで、複数の変換を含む 1 つの行列を作成できます。You can combine matrices to produce a single matrix that encompasses multiple transforms.

モデル空間、ワールド空間、ビュー空間の間で座標を変換することができます。You can transform coordinates between model space, world space, and view space.

行列変換Matrix Transforms

3D グラフィックスを使用するアプリケーションでは、幾何学変換を使って次の操作を実行できます。In applications that work with 3D graphics, you can use geometrical transforms to do the following:

  • オブジェクトの位置を、別のオブジェクトからの相対的な位置で表現する。Express the location of an object relative to another object.
  • オブジェクトを回転し、サイズを変更する。Rotate and size objects.
  • 視点、向き、奥行きを変更する。Change viewing positions, directions, and perspectives.

次の方程式に示すように、4x4 行列を使うことで任意の点 (x,y,z) を別の点 (x', y', z') に変換できます。You can transform any point (x,y,z) into another point (x', y', z') by using a 4x4 matrix, as shown in the following equation.

任意の点を別の点に変換する方程式

(x, y, z) と行列に対して次の方程式を実行すると、点 (x', y', z') が生成されます。Perform the following equations on (x, y, z) and the matrix to produce the point (x', y', z').

新しい点を求める方程式

最も一般的な変換は、平行移動、回転、スケーリングです。The most common transforms are translation, rotation, and scaling. これらの効果を生成する行列を結合して 1 つの行列にすると、複数の変換を一度に計算できます。You can combine the matrices that produce these effects into a single matrix to calculate several transforms at once. たとえば、一連の点に平行移動と回転を適用する 1 つの行列を作成することができます。For example, you can build a single matrix to translate and rotate a series of points.

行列は、行、列の順番に記述されます。Matrices are written in row-column order. 各軸に対して頂点を均等にスケーリングする処理は均等スケーリングと呼ばれ、これを実行する行列は数学的に次のように表記されます。A matrix that evenly scales vertices along each axis, known as uniform scaling, is represented by the following matrix using mathematical notation.

均等スケーリングの行列を表す式

C++ の場合、Direct3D は行列構造体を使って、行列を 2 次元配列として宣言します。In C++, Direct3D declares matrices as a two-dimensional array, using a matrix struct. 次の例は、D3DMATRIX 構造体を初期化して、均等スケーリング行列 (スケール ファクター "s") として動作するように設定する方法を示しています。The following example shows how to initialize a D3DMATRIX structure to act as a uniform scaling matrix (scale factor "s").

D3DMATRIX scale = {
    5.0f,            0.0f,            0.0f,            0.0f,
    0.0f,            5.0f,            0.0f,            0.0f,
    0.0f,            0.0f,            5.0f,            0.0f,
    0.0f,            0.0f,            0.0f,            1.0f
};

翻訳Translate

次の方程式は、点 (x, y, z) を新しい点 (x', y', z') に平行移動します。The following equation translates the point (x, y, z) to a new point (x', y', z').

新しい点を求める平行移動行列の方程式

C++ では、平行移動行列を手動で作成することができます。You can manually create a translation matrix in C++. 次の例は、頂点を平行移動する行列を作成する関数のソース コードを示しています。The following example shows the source code for a function that creates a matrix to translate vertices.

D3DXMATRIX Translate(const float dx, const float dy, const float dz) {
    D3DXMATRIX ret;

    D3DXMatrixIdentity(&ret);
    ret(3, 0) = dx;
    ret(3, 1) = dy;
    ret(3, 2) = dz;
    return ret;
}    // End of Translate

スケールScale

次の方程式は、点 (x, y, z) を x 方向、y 方向、z 方向に任意の値でスケーリングして、新しい点 (x', y', z') を求めます。The following equation scales the point (x, y, z) by arbitrary values in the x-, y-, and z-directions to a new point (x', y', z').

新しい点を求めるスケーリング行列の方程式

回転Rotate

ここで説明する変換は左手座標系を想定しているため、他の場所に記述されている変換行列とは異なる場合があります。The transforms described here are for left-handed coordinate systems, and so may be different from transform matrices that you have seen elsewhere.

次の方程式は、x 軸を中心に点 (x, y, z) を回転し、新しい点 (x', y', z') を求めます。The following equation rotates the point (x, y, z) around the x-axis, producing a new point (x', y', z').

新しい点を求める x 軸回転行列の方程式

次の方程式は、y 軸を中心に点を回転します。The following equation rotates the point around the y-axis.

新しい点を求める y 軸回転行列の方程式

次の方程式は、z 軸を中心に点を回転します。The following equation rotates the point around the z-axis.

新しい点を求める z 軸回転行列の方程式

これらの行列の例において、ギリシャ文字シータはラジアン単位の回転角度を表しています。In these example matrices, the Greek letter theta stands for the angle of rotation, in radians. 角度は、回転軸に沿って原点を見た状態で時計回りに測定されます。Angles are measured clockwise when looking along the rotation axis toward the origin.

次のコードは、X 軸周りの回転を処理する関数を示しています。The following code shows a function to handle rotation about the X axis.

    // Inputs are a pointer to a matrix (pOut) and an angle in radians.
    float sin, cos;
    sincosf(angle, &sin, &cos);  // Determine sin and cos of angle

    pOut->_11 = 1.0f; pOut->_12 =  0.0f;   pOut->_13 = 0.0f; pOut->_14 = 0.0f;
    pOut->_21 = 0.0f; pOut->_22 =  cos;    pOut->_23 = sin;  pOut->_24 = 0.0f;
    pOut->_31 = 0.0f; pOut->_32 = -sin;    pOut->_33 = cos;  pOut->_34 = 0.0f;
    pOut->_41 = 0.0f; pOut->_42 =  0.0f;   pOut->_43 = 0.0f; pOut->_44 = 1.0f;

    return pOut;
}

マトリックスの連結Concatenating Matrices

行列を使う利点の 1 つは、2 つ以上の行列を掛け合わせて、それらの効果を組み合わせることができる点にあります。One advantage of using matrices is that you can combine the effects of two or more matrices by multiplying them. つまり、モデルを回転した後で別の場所へ平行移動する場合でも、2 つの行列を適用する必要はありません。This means that, to rotate a model and then translate it to some location, you don't need to apply two matrices. 代わりに、回転行列と平行移動行列を掛け合わせて、両方の効果を含む合成行列を生成します。Instead, you multiply the rotation and translation matrices to produce a composite matrix that contains all their effects. このプロセスは行列の連結と呼ばれ、次の方程式によって記述できます。This process, called matrix concatenation, can be written with the following equation.

行列の連結の方程式

この方程式では、C は作成される合成行列を表し、M ~ Mₙ は個々の行列を表します。In this equation, C is the composite matrix being created, and M₁ through Mₙ are the individual matrices. ほとんどの場合、連結される行列は 2 ~ 3 個だけですが、数に制限はありません。In most cases, only two or three matrices are concatenated, but there is no limit.

行列の乗算を実行する順序は非常に重要です。The order in which the matrix multiplication is performed is crucial. 上の式は、行列が左から右へ連結されることを示しています。The preceding formula reflects the left-to-right rule of matrix concatenation. つまり、合成行列の作成に使われる各行列の視覚効果は、左から右へ順番に適用されます。That is, the visible effects of the matrices that you use to create a composite matrix occur in left-to-right order. ここで、典型的なワールド行列の例を考えてみましょう。A typical world matrix is shown in the following example. たとえば、よくある空飛ぶ円盤を表すワールド行列を作成するとします。Imagine that you are creating the world matrix for a stereotypical flying saucer. 空飛ぶ円盤に期待されるのは、その中心点 (モデル空間の y 軸) で回転しながら、シーン内の別の場所に平行移動するという動作です。You would probably want to spin the flying saucer around its center - the y-axis of model space - and translate it to some other location in your scene. この効果を実現するには、まず回転行列を作成し、それに平行移動行列を掛け合わせます。この方程式を次に示します。To accomplish this effect, you first create a rotation matrix, and then multiply it by a translation matrix, as shown in the following equation.

回転行列と平行移動行列に基づく回転の方程式

この式では、Ry は y 軸周りの回転行列を表し、Tw はワールド座標の別の場所への平行移動を表します。In this formula, Ry is a matrix for rotation about the y-axis, and Tw is a translation to some position in world coordinates.

2 つのスカラー値を乗算する場合とは異なり、行列の乗算は非可換であるため、行列を乗算する順序には重要な意味があります。The order in which you multiply the matrices is important because, unlike multiplying two scalar values, matrix multiplication is not commutative. 行列を逆の順序で乗算すると、空飛ぶ円盤をワールド空間の場所へ平行移動させてから、ワールド原点を中心に回転させるという視覚効果になります。Multiplying the matrices in the opposite order has the visual effect of translating the flying saucer to its world space position, and then rotating it around the world origin.

どのような種類の行列を作成する場合でも、期待どおりの効果を得るためには、左から右という規則を覚えておくことが重要です。No matter what type of matrix you are creating, remember the left-to-right rule to ensure that you achieve the expected effects.

関連トピックRelated topics

変換Transforms