2009-11-16 158 views
1

我的屏幕上有幾個3D矩形,我想圍繞Y軸旋轉。WPF 3d旋轉動畫

我想用鼠標按下,然後將3d物體旋轉到最大旋轉角度,但是當用戶移動他們的鼠標時,我想略微旋轉它,使它看起來像一個蹺蹺板(從Y軸上的-13至13度的範圍)。現在,我可以做到這一點,但是當我快速移動鼠標時,幀速率真的會受到影響。例如,當我單擊矩形的左側時,我會生成一個故事板和動畫對象,然後將3d對象旋轉到-13度。然後,當我將鼠標稍微向右移動,我想將它旋轉到-12.5,等等...

同樣,我能做到這一切,它只是性能受到很大!在某些情況下,它會下降到5-FPS ......這是不可接受的。

我的問題是我在做這個最好的方法嗎?你還可以爲屏幕上的用戶位置創建一個旋轉基礎的動畫?

感謝您提供任何幫助! 馬克

+0

你是在旋轉物體還是相機圍繞物體的中心點? – 2009-11-16 02:08:16

+0

對象,我不能移動相機,否則它會影響其他3D對象太 – Mark 2009-11-16 02:20:19

回答

0

MSDN呈現some tips在WPF 3D性能帶來什麼影響。如果您還沒有碰到它,請檢查「性能影響:高」列表中的項目。

編輯: 2009年3月,Josh Smith在CodeProject上發佈an article,涉及旋轉3D對象。也許你想檢查他的解決方案。

+0

感謝您的幫助,我也確實看到那些文章!我認爲Im做真的是唯一的出路,我只需要聰明地在幕後 – Mark 2009-11-18 21:50:53

2

我假設你正在做以下幾點:

  • 使用單獨的Model3D的對象,你是旋轉&包括它在一個Model3DGroup
  • 給它含有AxisAngleRotation3D
  • 動畫一個RotateTransform3D的AxisAngle3D的故事板中的軸屬性

如果我的假設是正確的,我認爲我們可以得出結論,問題是e由於CPU需要更新單個Axis值,重新計算Transform,並且更新MILCore可以忽略不計。

我能想到的幾種方法,可以提高渲染性能:

  1. 如果您的Model3D旋轉是一個GeometryModel3D支持由MeshGeometry3D,做盡可能多的,你可以簡化網格和材料用過的。它也可以幫助替換一個不同的網格進行特寫。

  2. 如果的Model3D旋轉是使用VisualBrush刷子,動畫期間暫時與含有的BitmapImage即Visual的VisualBrush底層作爲瞬間動畫開始的快照的圖像刷更換VisualBrush一個GeometryModel3D。當動畫結束時,放回VisualBrush。用戶可能不會注意到對象的內容在旋轉時會暫時凍結。 (請注意,如果您的Visual3D是Viewport2DVisual3D,則可以使用相同的技術。)

  3. 如果將正在旋轉的Model3D與其他對象組合到一個Model3DGroup中,但完全位於其他組的前面或後面,請將模型分離爲各自的Viewport3DVisual,並進行適當的分層以獲得所需的效果。

  4. 簡化照明或材料類型

  5. 監視實際幀速率,並且如果使用該故事板時會太低它,立即旋轉對象到鼠標指示不使用動畫。

+0

偉大的意見雷背後我的邏輯: 1:我真的需要大量的細節黯然 2:我需要的材料來產生光效果,當他們轉動,所以我真的不能代替他們 3:他們是分層seperatly 4:沒有做不到的,就像我在#1說,我真的需要大量的細節 5:不是一個壞主意!我可以做什麼,獲得幀率的最佳方法是什麼? 雖然很棒! – Mark 2009-11-19 08:57:07

+0

我會通過訂閱靜態的CompositionTarget.Rendering事件並使用DateTime.Now和減去測量時間來獲得幀速率。我的第一個啓發式可能是,如果在動畫運行期間如果連續超過三幀需要> 100ms渲染,則在接下來的30秒內禁用動畫。請注意,您希望從靜態方法或單例實例中執行此操作,以免多次訂閱Rendering事件並阻止GCed操作。 – 2009-11-19 10:30:29