本主題描述如何向 Windows Presentation Foundation (WPF) 圖形系統中的三維模型應用變換開發人員可以借助於變換功能來對模型進行重定位調整大小和重定向而無需更改用來定義模型的基值
三維坐標空間
Windows Presentation Foundation (WPF) 中的三維圖形內容封裝在 ViewportD 元素中該元素可以參與二維元素結構該圖形系統將 ViewportD 視為一個像 Windows Presentation Foundation (WPF) 中的許多其他元素一樣的二維可視化元素ViewportD 充當三維場景中的一個窗口(視區)更准確地說它是三維場景所投影到的圖面 盡管可以將 ViewportD 與其他二維繪圖對象用在同一個場景關系圖中但是不能在 ViewportD 中滲透二維和三維對象以下討論中所描述的坐標空間包含在 ViewportD 元素中
二維圖形的 Windows Presentation Foundation (WPF) 坐標系將原點定位在呈現圖面(通常是屏幕)的左上角在二維系統中x 軸上的正值朝右增加y 軸上的正值朝下增加但是在三維坐標系中原點位於屏幕的中心x 軸上的正值朝右增加但是 y 軸上的正值朝上增加z 軸上的正值從原點向外朝向觀察者增加
坐標系比較
由這些軸定義的空間是三維對象在 Windows Presentation Foundation (WPF) 中的固定參考框架當您在該空間中生成模型並創建光源和照相機以查看這些模型時一定要在向每個模型應用變換時將固定參考框架或全局空間與您為該模型創建的局部參考框架區分開另請記住根據光源和照相機設置全局空間中的對象可能會看上去完全不同或者根本不可見但是照相機的位置不會改變對象在全局空間中的位置
變換模型
當您創建模型時它們在場景中具有特定的位置為了在場景中移動旋轉這些模型或者更改這些模型的大小而更改用來定義模型本身的頂點是不切實際的相反正如在二維對象中一樣您可以向模型應用變換
每個模型對象都有一個可用來對模型進行移動重定向或調整大小的 Transform 屬性當您應用變換時實際上是按照由變換功能指定的向量或值(以適用者為准)來偏移模型的所有點換言之您已經變換了在其中定義模型的坐標空間(模型空間)但是您尚未更改在整個場景的坐標系(全局空間)中構成模型幾何形狀的值
平移變換
三維變換繼承自抽象基類 TransformD這些變換包括仿射變換類 TranslateTransformDScaleTransformD 和 RotateTransformDWindows Presentation Foundation (WPF) 三維系統還提供一個 MatrixTransformD 類使用該類可以用更簡明的矩陣操作來指定同樣的變換
TranslateTransformD 沿著您用 OffsetXOffsetY 和 OffsetZ 屬性指定的偏移向量所指示的方向來移動 ModelD 中的所有點例如假設立方體的一個頂點位於 ()則偏移向量 () 會將該頂點 () 移到 ()該立方體的頂點在模型空間中仍位於 ()但是現在該模型空間與世界空間的關系已經發生改變因此模型空間中的 () 是世界空間中的 ()
帶有偏移的平移
下面的代碼示例演示如何應用平移
縮放變換
ScaleTransformD 沿著指定的縮放向量相對於中心點來更改模型的比例可以指定等比縮放即在 XY 和 Z 軸上將模型縮放同樣的值來按比例更改模型的大小例如將該變換的 ScaleXScaleY 和 ScaleZ 屬性設置為 會將此模型二等分將這些屬性設置為 會將此模型在所有這三個軸上的值放大一倍
ScaleVector 示例
通過指定非等比變換(XY 和 Z 值不相等的縮放變換)可以使模型在一個或兩個維度上拉伸或收縮而不會影響其他維度例如如果將 ScaleXScaleY 和 ScaleZ 分別設置為 和
則將導致變換模型的高度增加一倍但是 X 和 Z 軸上的值仍保持不變
默認情況下ScaleTransformD 會導致頂點圍繞原點 () 拉伸或收縮但是如果要變換的模型不是從原點繪制的那麼在從原點縮放模型時模型將不會就地縮放相反當模型的頂點與縮放向量相乘時縮放操作對模型的平移和縮放都會產生影響
縮放中心示例
若要就地縮放模型請通過設置 ScaleTransformD 的 CenterXCenterY 和 CenterZ 屬性來指定模型的中心這可確保圖形系統縮放模型空間然後平移該空間使其在指定的 PointD 上居中相反如果模型是圍繞原點生成的而且您指定了一個不同的中心點則將看到模型會背離原點平移
旋轉變換
可以通過幾種不同的方法來旋轉三維模型典型的旋轉變換指定一個軸以及圍繞該軸的旋轉角度使用 RotateTransformD 類可以用 Rotation 屬性來定義 RotationD然後可以在 RotationD(在本例中為 AxisAngleRotationD)上指定 Axis 和 Angle 屬性來定義變換下面的幾個示例圍繞 Y 軸將模型旋轉 度
注意Windows Presentation Foundation (WPF) 三維是一個右手系統這意味著如果旋轉角度為正數則將圍繞該軸逆時針旋轉
對於指定了軸和角度的旋轉來說如果沒有為 RotateTransformD 上的 CenterXCenterY 和 CenterZ 屬性指定值則假設圍繞原點旋轉與縮放時一樣一定要記住旋轉時會變換模型的整個坐標空間如果模型不是圍繞原點創建的或者它以前經過平移則旋轉可能會圍繞原點轉動而不是就地旋轉
在指定了新中心的情況下旋轉
若要就地旋轉模型請將模型的實際中心指定為旋轉中心由於幾何形狀通常是圍繞原點建模的因此在依次執行下列操作時通常將獲取一組預期的變換結果調整模型大小(縮放該模型)
然後設置模型方向(旋轉該模型)最後將模型移到所需的位置(平移該模型)
旋轉示例
指定了軸和角度的旋轉非常適於靜態變換和某些動畫但是請考慮圍繞 X 軸將立方體模型旋轉 度然後圍繞 Z 軸將其旋轉 度您可以將這種變換描述為兩個離散的仿射變換也可以將其描述為一個矩陣但是對於按照這種方式定義的旋轉可能很難平滑地進行動畫處理盡管按照這兩種方法計算的模型起始位置和結束位置相同但是從計算的角度來看該模型經過的中間位置是不確定的四元數提供了一種用來在旋轉的起始位置和結束位置之間計算內插值的替代方法
四元數表示三維空間中的一個軸以及圍繞該軸的旋轉例如四元數可以表示 () 軸以及 度的旋轉角度四元數在定義旋轉方面的價值在於可以針對它們執行的兩個運算合成和內插應用於一個幾何形狀的兩個四元數的合成是指圍繞 axis 將幾何形狀旋轉 rotation 度然後圍繞 axis 將其旋轉 rotation 度通過使用合成運算可以將應用於幾何形狀的兩個旋轉合成在一起以便獲得一個代表合成結果的四元數由於四元數內插可以計算出從一個軸和方向到另一個軸和方向的平滑而又合理的路徑因此您可以從原始位置到合成的四元數之間進行內插以便實現從一個位置到另一個位置的平滑過渡從而可以對該變換進行動畫處理對於要進行動畫處理的模型可以通過針對 Rotation 屬性使用 QuaternionRotationD 來為旋轉指定目標 Quaternion
使用變換集合
在生成場景時通常會向模型應用多個變換向 TransformDGroup 類的 Children 集合中添加變換從而方便地將多個變換組合在一起以應用於場景中的各種模型通常可以很方便地在幾個不同的組中重用某個變換這與通過向每個實例應用一組不同的變換來重用模型大體相同請注意將變換添加到該集合中的順序至關重要集合中的變換是按照從第一個到最後一個的順序應用的
對變換進行動畫處理
Windows Presentation Foundation (WPF) 三維實現與二維圖形參與同一個計時和動畫系統換言之若要對三維場景進行動畫處理需要對其模型的屬性進行動畫處理可以直接對基元的屬性進行動畫處理但是通常很容易對用來更改模型位置或外觀的變換進行動畫處理由於可以向 ModelDGroup 對象及其各個模型應用變換因此可以向 ModelDGroup 的子級應用一組動畫向一組對象應用另一組動畫
若要對 Windows Presentation Foundation (WPF) 中的對象進行動畫處理可以創建時間線定義動畫(實際上是隨著時間的推移而更改某個屬性值)並指定要向其應用動畫的屬性此屬性必須是 FrameworkElement 的屬性由於三維場景中的所有對象都是 ViewportD 的子級因此要應用於場景的任何動畫所面向的屬性都是 ViewportD 屬性的屬性一定要仔細設計動畫的屬性路徑因為語法可能會極為冗長
假設您希望就地旋轉某個對象而且還希望應用擺動動作以公開要查看的對象的更多內容您可以選擇向模型應用 RotateTransformD並對模型從一個向量旋轉到另一個向量時所圍繞的軸進行動畫處理下面的代碼示例演示如何將 VectorDAnimation 應用於該變換的 RotationD 的 Axis 屬性並假設 RotateTransformD 是應用於具有 TransformGroup 的模型的幾個變換之一
使用類似的語法可以將其他變換屬性作為目標來移動或縮放該對象 例如可以在進行縮放變換時將 PointDAnimation 應用於 ScaleCenter 屬性以便使模型的形狀平滑地扭曲
盡管上面的幾個示例對 GeometryModelD 的屬性進行變換但是還可以對場景中其他模型的屬性進行變換 例如可以通過對應用於 Light 對象的平移進行動畫處理來創建移動燈光和陰影效果
這些效果可以顯著改變模型的外觀
由於照相機也是模型因此也可以對照相機的屬性進行變換 盡管您確實可以通過改變照相機的位置或平面距離來改變場景的外觀(實際上是變換整個場景的投影)但應注意對於觀察者來說以這種方法實現的許多效果不如將變換應用於場景中模型的地點或位置更有視覺意義
From:http://tw.wingwit.com/Article/program/net/201311/12454.html