轉換概觀
本主題討論 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 轉譯目標會使用此座標空間。
藉由操作轉換矩陣中的值,您可以旋轉、縮放、扭曲和移動 (轉譯) 物件。 例如,如果您將 OffsetX 設定為 100,並將 OffsetY 設定為 200,則會將物件移至右邊 100 圖元,然後向下移動 200 圖元。
若要顯示物件移動的效果,您必須套用轉譯轉換來轉譯目標、筆刷或幾何。 將轉換套用至轉譯目標會影響整個螢幕,同時將轉換套用至筆刷或幾何只會影響該特定筆刷或幾何。 若要建立轉換矩陣,請使用 Matrix3x2F 類別。
建立轉換矩陣
為了建立旋轉、縮放比例、扭曲和轉譯轉換, Matrix3x2F 類別提供下表所示的靜態方法。 資料表的 Example 資料行包含操作說明主題的連結,這些主題示範如何使用每個轉換方法。
方法 | 描述 | 例如 | 圖例 |
---|---|---|---|
matrix3x2f::rotate | 會建立具有指定角度和中心點的旋轉轉換。 | 如何旋轉物件 | |
matrix3x2f::scale | 會建立具有指定縮放比例和中心點的縮放比例轉換。 | 如何調整物件 | |
matrix3x2f::skew | 會建立具有指定 X 軸和 Y 軸值和中心點的扭曲轉換。 | 如何扭曲物件 | |
matrix3x2f::translation | 會建立轉譯轉換,並指定 X 軸和 Y 軸方向的位移。 | 如何轉譯物件 |
轉譯目標轉換
轉譯目標是繼承自 ID2D1RenderTarget 介面的資源。 它會建立繪製的資源,並執行實際的繪圖作業。 它也提供轉換座標空間的方法。 您可以呼叫 ID2D1RenderTarget::SetTransform 方法,將指定的轉換套用至轉譯目標。 所有後續的繪圖作業都會發生在轉換的空間中。
若要轉譯內容,請使用轉譯目標的繪圖方法。 開始繪製之前,請先呼叫 BeginDraw 方法。 若要完成轉譯內容,請呼叫 EndDraw 方法。 如需範例,請參閱 如何將多個轉換套用至物件。
筆刷轉換
您可以藉由呼叫 SetTransform來調整筆刷上的轉換。 針對此轉換,您可以將筆刷視為大型紙張,以及 (文字、幾何、矩形等不同轉譯基本類型) 樣板。 當您調整筆刷轉換時,就像是在樣板底下滑動大型紙張一樣,而不會變更樣板本身的位置。 您可以使用這項技術,讓文字從黃色淡出到黑色到 3D 空間。
當筆刷轉換是身分識別轉換時,筆刷會出現在與繪製它們的轉譯目標相同的座標空間中。 筆刷轉換可讓呼叫端改變筆刷座標如何對應至此空間。
在 Direct2D 中,筆刷空間的指定方式與Windows Presentation Foundation (WPF) 不同。 在 Direct2D 中,筆刷空間不是相對於所繪製的物件,而是由筆刷轉換轉換所轉換的目前轉譯目標座標系統。 若要讓筆刷填滿 WPF 中完成的物件,您必須將筆刷空間原點轉譯為物件周框方塊的左上角,然後調整筆刷空間,讓基底磚填滿物件的周框方塊。
如需筆刷轉換的詳細資訊,請參閱 Direct2D 筆刷概觀。
幾何轉換
當您調整、移動、平移或扭曲幾何時,可以直接將轉換套用至特定幾何,而不是會影響整個螢幕的轉譯目標轉換。 轉譯目標轉換通常會影響幾何的筆劃和填滿。 相較之下,幾何轉換只會影響幾何的填滿,因為轉換會在筆觸之前套用至幾何。
注意
從Windows 8開始,如果您將筆劃類型設定為D2D1_STROKE_TRANSFORM_TYPE_FIXED或D2D1_STROKE_TRANSFORM_TYPE_HAIRLINE,則世界轉換不會影響筆劃。
您可以呼叫 ID2D1Factory::CreateTransformedGeometry 來建立 ID2D1TransformedGeometry 物件,以調整幾何上的轉換。 如需幾何轉換的詳細資訊,請參閱 Direct2D 幾何概觀。
轉譯目標轉換如何影響剪輯
轉譯目標上的轉換會影響座標軸對齊剪輯周框方塊的計算方式。 呼叫 PushAxisAlignedClip 時, clipRect 參數會由轉譯目標上設定的目前世界轉換進行轉換。 將轉換套用至 clipRect之後,會計算 clipRect 的軸對齊周框方塊。 為了提高效率,內容會裁剪到這個軸對齊周框方塊,而不是傳入的原始 clipRect 。 下圖顯示旋轉轉換如何套用至轉譯目標、產生的 clipRect,以及計算軸對齊周框方塊。
假設下圖中的矩形是對齊螢幕圖元的轉譯目標。
將旋轉轉換套用至轉譯目標。 在下圖中,黑色矩形代表原始轉譯目標,而紅色虛線矩形代表轉換的轉譯目標。
呼叫 PushAxisAlignedClip之後,旋轉轉換會套用至clipRect。 在下圖中,藍色矩形代表已轉換的 clipRect。
會計算軸對齊周框方塊。 在下圖中,綠色虛線矩形代表周框方塊。 所有內容都會裁剪到這個軸對齊周框方塊。
摘要
Direct2D 可讓您輕鬆地使用簡化的座標空間和相關類別來轉換二維物件。 藉由使用各種類型的轉換,您可以轉譯、旋轉、扭曲及調整物件,以達到許多令人驚豔的視覺效果。
相關主題