変換 (DirectComposition)

Note

Windows 10 上のアプリでは、DirectComposition ではなく Windows.UI.Composition API を使用することをお勧めします。 詳細については、ビジュアル レイヤーを使用したデスクトップ アプリの最新化に関するページを参照してください。

このトピックでは、2 次元 (2D) アフィン (線形) 変換に対する Microsoft DirectComposition のサポートについて考察し、DirectComposition でサポートされる変換の種類について説明します。

DirectComposition では 3D パースペクティブ変換もサポートされていますが、中間ビットマップを作成する必要があるため、DirectComposition ではこれを変換ではなく効果と見なしています。 3D パースペクティブ変換効果の詳細については、「効果」を参照してください。

このトピックのセクションは次のとおりです。

DirectComposition 2D 変換とは?

2D 変換を使用すると、ビジュアルを別の場所に移動 (平行移動)、拡大または縮小 (拡大縮小)、旋回 (回転)、形状の変形 (傾斜) を行うことで、2 次元でビジュアルの位置、サイズ、または性質を変更できます。

2D 変換を行うには、ビジュアルのポイントを同じ座標空間内のある位置から別の位置へ、またはある座標空間から別の座標空間へマッピングします。 このマッピングは、次のように、3 行 3 列から成る浮動小数点値のコレクションとして定義された、変換マトリックスと呼ばれる値のテーブルで記述できます。

M11Default: 1.0
M21Default: 0.0
M31OffsetX: 0.0

M12Default: 0.0
M22Default: 1.0
M32OffsetY: 0.0

0.0
0.0
1.0

アフィン 2D 変換の変換マトリックスは、上の変換マトリックスの 3 列目がない 3 行 2 列のマトリックスです。 次の表に、このマトリックスのレイアウトを示します。

M11Default: 1.0
M21Default: 0.0
M31OffsetX: 0.0

M12Default: 0.0
M22Default: 1.0
M32OffsetY: 0.0

Note

ステレオ コンテンツに 2D 変換を適用した場合、DirectComposition では特別な処理は行われません。 つまり、2D 変換を適用すると、3D コンテンツが歪んで見える可能性があります。

DirectComposition の 2D 座標空間

DirectComposition は左手系の 2D 座標空間が使用されます。つまり、正の x 軸の値は右方向に増加し、正の y 軸の値は下方向に増加します。 次の図に示すように、ビジュアルの位置付けは、原点 (x 軸と y 軸が交差する点 (0, 0)) が基準になります。

左手系座標空間の x 軸と y 軸

3 行 2 列の変換マトリックスの値を操作することで、オブジェクトを 2 次元で回転、拡大縮小、傾斜、平行移動できます。 たとえば、OffsetX を 100 に設定し、OffsetY を 200 に設定すると、オブジェクトは右に 100 ピクセル、下に 200 ピクセル移動します。

アフィン 2D 変換のサポート

次の表は、DirectComposition でサポートされているアフィン 2D 変換の種類について説明し、さまざまな種類の変換を実行するために使用できるインターフェイスの一覧を示しています。

変換/インターフェイス 説明
2D の回転 IDCompositionRotateTransform 指定した中心点を基準に、指定した角度でビジュアルを回転させます。 元の正方形の中心を基準に時計回りに 45 度回転させた正方形の図
2D の拡大縮小 IDCompositionScaleTransform 指定した中心点を基準に、指定した係数でビジュアルを拡大縮小します。 130% に拡大された正方形の図
2D の傾斜 IDCompositionSkewTransform X 軸と Y 軸に沿って指定した角度で、指定した中心点を基準にして、ビジュアルを傾斜させます。 y 軸から反時計回りに 30 度傾斜させた正方形の図
2D の平行移動 IDCompositionTranslateTransform ビジュアルの位置を x 軸方向と y 軸方向に変更します。 正の x 軸に沿って 20 単位、正の y 軸に沿って 10 単位移動させた正方形の図

マトリックス 2D 変換

IDCompositionMatrixTransform インターフェイスを使用すると、独自の 3 行 2 列アフィン 2D 変換マトリックスを定義し、それをビジュアルに適用できます。 このインターフェイスは、他の DirectComposition 変換インターフェイスでは利用できない種類のアフィン 2D 変換を適用する必要がある場合に役立ちます。 マトリックスを定義するには、D2D_MATRIX_3X2_F 構造体に値を指定し、それを IDCompositionMatrixTransform::SetMatrix メソッドに渡します。

変換グループ

変換グループを使用すると、複数の変換を 1 つにまとめることができます。 変換グループでは、変換オブジェクトのコレクションを定義し、このコレクション内で、各変換オブジェクトのマトリックスを指定の順序で乗算します。 その結果として得られた変換マトリックスが、ビジュアルに適用されます。 変換グループを適用すると、各変換を個別に適用した場合と同じ結果になります。

変換グループ内では、変換オブジェクトの順序が重要であることに注意してください。 たとえば、ビジュアルをまず回転し、次に拡大縮小し、その次に移動した場合の結果と、ビジュアルをまず移動し、次に回転し、その次に拡大縮小した場合の結果は異なります。 DirectComposition では常に、コレクション内で指定されている順序でビジュアルに変換が適用されます。

変換グループを作成するには、まずグループに含める変換オブジェクトを作成し、次に変換オブジェクト ポインターの配列を IDCompositionDevice::CreateTransformGroup メソッドに渡します。 変換グループを作成した後で、変換オブジェクトを追加または削除することはできません。。 ただし、コレクション内の個々の変換オブジェクトのプロパティは変更でき、その変更は結果の変換マトリックスに反映されます。

変換アニメーション

変換のプロパティはアニメーション化できます。 プロパティがアニメーション化されると、DirectComposition はプロパティの値を一度に変更するのではなく、時間の経過に合わせて変更します。 これは、画面切り替えを作成するときに特に便利です。 詳しくは、「アニメーション」をご覧ください。