轉換概觀

本主題討論 Direct2D 轉換的基本概念,並包含各種轉換的範例。 它包含下列部分:

什麼是 Direct2D 轉換?

轉換會指定如何將物件的點從一個座標空間對應到另一個座標空間,或從一個位置對應至相同座標空間內的另一個位置。 此對應是由轉換矩陣所描述,定義為三個數據列的集合,其中包含三個數據行的 FLOAT 值,如下表所示。

     
M11Default:1.0 M12Default:0.0 0.0
M21Default:0.0 M22Default:1.0 0.0
M31OffsetX:0.0 M32OffsetY:0.0 1.0

 

在此矩陣中,M11、M12、M21 和 M22 成員會定義可縮放、旋轉或扭曲物件的線性轉換;OffsetX 和 OffsetY 成員會定義在建立線性轉換之後要套用的轉譯。 對於 affine 轉換,第三個數據行中的值一律為 0.0、0.0 和 1.0。

因為 Direct2D 只支援線性) 轉換 (線性) ,所以其轉換矩陣會定義為 3-by-2 矩陣,省略上一個轉換矩陣中的第三個數據行。 下表顯示 Direct2D 轉換矩陣的配置。

   
M11Default:1.0 M12Default:0.0
M21Default:0.0 M22Default:1.0
M31OffsetX:0.0 M32OffsetY:0.0

 

在 Direct2D 中,這個 3-by-2 矩陣是由 D2D1_MATRIX_3X2 結構表示。 為了簡化常見的矩陣作業,Direct2D 也會提供名為 Matrix3x2F的類別,其衍生自 D2D1_MATRIX_3X2 結構。

Matrix3x2F的預設建構函式會將物件保留為未初始化。 若要擷取識別矩陣,請使用 Matrix3x2F::Identity

當識別轉換套用至物件時,它不會變更物件的位置、形狀或大小。 這類似于將數位乘以 1 的方式,不會變更數位。 換句話說,身分識別轉換會單獨保留點的座標,而且不會將點移轉至新的位置。 身分識別轉換以外的任何轉換都會修改物件的位置、形狀和/或大小。

轉換全都與座標有關,而且瞭解 Direct2D 座標空間對於瞭解轉換的使用很重要。

Direct2D 座標空間

Direct2D 使用左側座標空間;也就是說,正 X 軸值會向右增加,而正 Y 軸值會向下增加。 畫面上的所有專案都相對於原點,也就是 X 軸和 Y 軸 (與 0、0) 交集的點,如下圖所示。 Direct2D 轉譯目標會使用此座標空間。

左手座標空間的 X 軸和 Y 軸圖例

藉由操作轉換矩陣中的值,您可以旋轉、縮放、扭曲和移動 (轉譯) 物件。 例如,如果您將 OffsetX 設定為 100,並將 OffsetY 設定為 200,則會將物件移至右邊 100 圖元,然後向下移動 200 圖元。

若要顯示物件移動的效果,您必須套用轉譯轉換來轉譯目標、筆刷或幾何。 將轉換套用至轉譯目標會影響整個螢幕,同時將轉換套用至筆刷或幾何只會影響該特定筆刷或幾何。 若要建立轉換矩陣,請使用 Matrix3x2F 類別。

建立轉換矩陣

為了建立旋轉、縮放比例、扭曲和轉譯轉換, Matrix3x2F 類別提供下表所示的靜態方法。 資料表的 Example 資料行包含操作說明主題的連結,這些主題示範如何使用每個轉換方法。

方法 描述 例如 圖例
matrix3x2f::rotate 會建立具有指定角度和中心點的旋轉轉換。 如何旋轉物件 正方形旋轉 45 度,順時針旋轉原始正方形中央的圖例
matrix3x2f::scale 會建立具有指定縮放比例和中心點的縮放比例轉換。 如何調整物件 正方形縮放比例為 130% 的圖例
matrix3x2f::skew 會建立具有指定 X 軸和 Y 軸值和中心點的扭曲轉換。 如何扭曲物件 正方形扭曲 30 度從 Y 軸逆時針的圖例
matrix3x2f::translation 會建立轉譯轉換,並指定 X 軸和 Y 軸方向的位移。 如何轉譯物件 正 X 軸的正方形移動 20 個單位,沿著正 y 軸移動 10 個單位

 

轉譯目標轉換

轉譯目標是繼承自 ID2D1RenderTarget 介面的資源。 它會建立繪製的資源,並執行實際的繪圖作業。 它也提供轉換座標空間的方法。 您可以呼叫 ID2D1RenderTarget::SetTransform 方法,將指定的轉換套用至轉譯目標。 所有後續的繪圖作業都會發生在轉換的空間中。

若要轉譯內容,請使用轉譯目標的繪圖方法。 開始繪製之前,請先呼叫 BeginDraw 方法。 若要完成轉譯內容,請呼叫 EndDraw 方法。 如需範例,請參閱 如何將多個轉換套用至物件

筆刷轉換

您可以藉由呼叫 SetTransform來調整筆刷上的轉換。 針對此轉換,您可以將筆刷視為大型紙張,以及 (文字、幾何、矩形等不同轉譯基本類型) 樣板。 當您調整筆刷轉換時,就像是在樣板底下滑動大型紙張一樣,而不會變更樣板本身的位置。 您可以使用這項技術,讓文字從黃色淡出到黑色到 3D 空間。

當筆刷轉換是身分識別轉換時,筆刷會出現在與繪製它們的轉譯目標相同的座標空間中。 筆刷轉換可讓呼叫端改變筆刷座標如何對應至此空間。

在 Direct2D 中,筆刷空間的指定方式與Windows Presentation Foundation (WPF) 不同。 在 Direct2D 中,筆刷空間不是相對於所繪製的物件,而是由筆刷轉換轉換所轉換的目前轉譯目標座標系統。 若要讓筆刷填滿 WPF 中完成的物件,您必須將筆刷空間原點轉譯為物件周框方塊的左上角,然後調整筆刷空間,讓基底磚填滿物件的周框方塊。

如需筆刷轉換的詳細資訊,請參閱 Direct2D 筆刷概觀

幾何轉換

當您調整、移動、平移或扭曲幾何時,可以直接將轉換套用至特定幾何,而不是會影響整個螢幕的轉譯目標轉換。 轉譯目標轉換通常會影響幾何的筆劃和填滿。 相較之下,幾何轉換只會影響幾何的填滿,因為轉換會在筆觸之前套用至幾何。

注意

從Windows 8開始,如果您將筆劃類型設定為D2D1_STROKE_TRANSFORM_TYPE_FIXEDD2D1_STROKE_TRANSFORM_TYPE_HAIRLINE,則世界轉換不會影響筆劃。

 

您可以呼叫 ID2D1Factory::CreateTransformedGeometry 來建立 ID2D1TransformedGeometry 物件,以調整幾何上的轉換。 如需幾何轉換的詳細資訊,請參閱 Direct2D 幾何概觀

轉譯目標轉換如何影響剪輯

轉譯目標上的轉換會影響座標軸對齊剪輯周框方塊的計算方式。 呼叫 PushAxisAlignedClip 時, clipRect 參數會由轉譯目標上設定的目前世界轉換進行轉換。 將轉換套用至 clipRect之後,會計算 clipRect 的軸對齊周框方塊。 為了提高效率,內容會裁剪到這個軸對齊周框方塊,而不是傳入的原始 clipRect 。 下圖顯示旋轉轉換如何套用至轉譯目標、產生的 clipRect,以及計算軸對齊周框方塊。

  1. 假設下圖中的矩形是對齊螢幕圖元的轉譯目標。

    矩形 (轉譯目標) 圖例

  2. 將旋轉轉換套用至轉譯目標。 在下圖中,黑色矩形代表原始轉譯目標,而紅色虛線矩形代表轉換的轉譯目標。

    原始矩形和旋轉矩形的圖例, (轉換的轉譯目標)

  3. 呼叫 PushAxisAlignedClip之後,旋轉轉換會套用至clipRect。 在下圖中,藍色矩形代表已轉換的 clipRect

    旋轉矩形內較小的藍色矩形 (裁剪) 圖例, (轉換的轉譯目標)

  4. 會計算軸對齊周框方塊。 在下圖中,綠色虛線矩形代表周框方塊。 所有內容都會裁剪到這個軸對齊周框方塊。

    小藍色矩形上的綠色周框圖例, (裁剪)

摘要

Direct2D 可讓您輕鬆地使用簡化的座標空間和相關類別來轉換二維物件。 藉由使用各種類型的轉換,您可以轉譯、旋轉、扭曲及調整物件,以達到許多令人驚豔的視覺效果。

Direct2D 參考