电竞比分网-中国电竞赛事及体育赛事平台

分享

WPF的三維變換應用(4)

 xyjackxjw 2013-05-09

WPF的三維變換應用(4)

2008-08-27 18:26 佚名 MSDN 我要評論(0) 字號:T | T
一鍵收藏,隨時查看,分享好友!

本主題描述如何向 Windows Presentation Foundation (WPF) 圖形系統(tǒng)中的三維模型應用變換。開發(fā)人員可以借助于變換功能來對模型進行重定位、調整大小和重定向,而無需更改用來定義模型的基值。

AD: 2013大數(shù)據(jù)全球技術峰會低價搶票中

注意:Windows Presentation Foundation (WPF) 三維是一個右手系統(tǒng),這意味著,如果旋轉角度為正數(shù),則將圍繞該軸逆時針旋轉。

對于指定了軸和角度的旋轉來說,如果沒有為 RotateTransform3D 上的 CenterX、CenterY 和 CenterZ 屬性指定值,則假設圍繞原點旋轉。與縮放時一樣,一定要記住旋轉時會變換模型的整個坐標空間。如果模型不是圍繞原點創(chuàng)建的,或者它以前經過平移,則旋轉可能會圍繞原點“轉動”,而不是就地旋轉。

在指定了新中心的情況下旋轉


若要“就地”旋轉模型,請將模型的實際中心指定為旋轉中心。由于幾何形狀通常是圍繞原點建模的,因此,在依次執(zhí)行下列操作時通常將獲取一組預期的變換結果:調整模型大小(縮放該模型),然后設置模型方向(旋轉該模型),最后將模型移到所需的位置(平移該模型)。

旋轉示例


指定了軸和角度的旋轉非常適于靜態(tài)變換和某些動畫。但是,請考慮圍繞 X 軸將立方體模型旋轉 60 度,然后圍繞 Z 軸將其旋轉 45 度。您可以將這種變換描述為兩個離散的仿射變換,也可以將其描述為一個矩陣。但是,對于按照這種方式定義的旋轉,可能很難平滑地進行動畫處理。盡管按照這兩種方法計算的模型起始位置和結束位置相同,但是,從計算的角度來看,該模型經過的中間位置是不確定的。四元數(shù)提供了一種用來在旋轉的起始位置和結束位置之間計算內插值的替代方法。

四元數(shù)表示三維空間中的一個軸以及圍繞該軸的旋轉。例如,四元數(shù)可以表示 (1,1,2) 軸以及 50 度的旋轉角度。四元數(shù)在定義旋轉方面的價值在于可以針對它們執(zhí)行的兩個運算:合成和內插。應用于一個幾何形狀的兩個四元數(shù)的合成是指“圍繞 axis2 將幾何形狀旋轉 rotation2 度,然后圍繞 axis1 將其旋轉 rotation1 度”。通過使用合成運算,可以將應用于幾何形狀的兩個旋轉合成在一起,以便獲得一個代表合成結果的四元數(shù)。由于四元數(shù)內插可以計算出從一個軸和方向到另一個軸和方向的平滑而又合理的路徑,因此您可以從原始位置到合成的四元數(shù)之間進行內插,以便實現(xiàn)從一個位置到另一個位置的平滑過渡,從而可以對該變換進行動畫處理。對于要進行動畫處理的模型,可以通過針對 Rotation 屬性使用 QuaternionRotation3D 來為旋轉指定目標 Quaternion。

使用變換集合
在生成場景時,通常會向模型應用多個變換。向 Transform3DGroup 類的 Children 集合中添加變換,從而方便地將多個變換組合在一起以應用于場景中的各種模型。通常,可以很方便地在幾個不同的組中重用某個變換,這與通過向每個實例應用一組不同的變換來重用模型大體相同。請注意,將變換添加到該集合中的順序至關重要:集合中的變換是按照從第一個到最后一個的順序應用的。

對變換進行動畫處理
Windows Presentation Foundation (WPF) 三維實現(xiàn)與二維圖形參與同一個計時和動畫系統(tǒng)。換言之,若要對三維場景進行動畫處理,需要對其模型的屬性進行動畫處理。可以直接對基元的屬性進行動畫處理,但是通常很容易對用來更改模型位置或外觀的變換進行動畫處理。由于可以向 Model3DGroup 對象及其各個模型應用變換,因此可以向 Model3DGroup 的子級應用一組動畫,向一組對象應用另一組動畫。

若要對 Windows Presentation Foundation (WPF) 中的對象進行動畫處理,可以創(chuàng)建時間線、定義動畫(實際上是隨著時間的推移而更改某個屬性值)并指定要向其應用動畫的屬性。此屬性必須是 FrameworkElement 的屬性。由于三維場景中的所有對象都是 Viewport3D 的子級,因此要應用于場景的任何動畫所面向的屬性都是 Viewport3D 屬性的屬性。一定要仔細設計動畫的屬性路徑,因為語法可能會極為冗長。

假設您希望就地旋轉某個對象,而且還希望應用擺動動作以公開要查看的對象的更多內容。您可以選擇向模型應用 RotateTransform3D,并對模型從一個向量旋轉到另一個向量時所圍繞的軸進行動畫處理。下面的代碼示例演示如何將 Vector3DAnimation 應用于該變換的 Rotation3D 的 Axis 屬性,并假設 RotateTransform3D 是應用于具有 TransformGroup 的模型的幾個變換之一。

 

 

使用類似的語法可以將其他變換屬性作為目標來移動或縮放該對象。 例如,可以在進行縮放變換時將 Point3DAnimation 應用于 ScaleCenter 屬性,以便使模型的形狀平滑地扭曲。

盡管上面的幾個示例對 GeometryModel3D 的屬性進行變換,但是還可以對場景中其他模型的屬性進行變換。 例如,可以通過對應用于 Light 對象的平移進行動畫處理來創(chuàng)建移動燈光和陰影效果,這些效果可以顯著改變模型的外觀。

由于照相機也是模型,因此也可以對照相機的屬性進行變換。 盡管您確實可以通過改變照相機的位置或平面距離來改變場景的外觀(實際上是變換整個場景的投影),但應注意,對于觀察者來說,以這種方法實現(xiàn)的許多效果不如將變換應用于場景中模型的地點或位置更有“視覺意義”。

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多