共用方式為


轉換概觀

本主題討論 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 成員會定義在進行線性轉換之後要套用的轉譯。 對於仿射轉換,第三個數據行中的值一律為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 類別提供下表所示的靜態方法。 表格的 [範例] 欄包含演示如何使用每個轉換方法的說明主題連結。

方法 描述 插圖
matrix3x2f::rotate 會建立具有指定角度和中心點的旋轉轉換。 如何旋轉物件 原方形的中心順時針旋轉 45 度的正方形圖例
matrix3x2f::scale 建立具有指定縮放因數和中心點的縮放轉換。 如何調整物件 方形圖例縮放 130%
matrix3x2f::skew 建立扭曲轉換,此轉換具有指定的 X 軸和 Y 軸值和中心點。 如何扭曲物件 正方形從 Y 軸反時針方向傾斜 30 度的插圖
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 參考