2012-11-06 17 views
0

我是新的3D圖形,也是WPF,需要結合這兩個在我目前的項目。我給MeshGeometry3D添加積分和法線,並將MeshGeometry3D加到GeometryModel3D。然後加GeometryModel3DModelVisual3D,最後加ModelVisual3DViewPort3D。現在,如果我需要旋轉,我在GeometryModel3D或ModelVisual3D上執行所需的變換,並最終再次將其添加到ViewPort3D。我運行到一個問題:在Windows上的3D圖形在WPF的C#

objViewPort3D.Remove(objModelVisual3D); 
objGeometryModel3D.Transform = new RotateTransform3D(new AxisAngleRotation3D(new Vector3D(0, 1, 0), angle += 15)); 
objModelVisual3D.Content = objGeometryModel3D; 
objViewPort3D.Children.Add(objModelVisual3D); 

爲什麼我必須做angle += 15並不僅僅是15每次15度旋轉呢?看起來存儲的模型未被Transform操作轉換,但轉換僅在通過ViewPort3D顯示時應用。我想要轉換實際上改變存儲的MeshGeometry3D對象中的座標,以便當我在下一次執行轉換時對先前轉換的模型執行轉換,而不是原始模型。我如何獲得這種行爲?

回答

1

我想你可以使用動畫

一些僞代碼:

角度= 0 功能的onClick: new_angle =角+ 30 動畫(角度,new_angle) 角= new_angle

0

正確,網格的位置不會被「變換」操作轉換。相反,Transform屬性定義渲染過程中網格的世界變換。

在3d圖形中,世界變換在對象渲染過程中將網格中的點從對象空間轉換爲世界空間。

object space to world space diagram http://robertokoci.com/images/posts/graphics/game/programming/matrix-unveiled/ObjectWorldSpace.png

(圖片來自World, View and Projection Matrix Unveiled

這將大大加快設置場景變換,讓渲染繪製網格在一個單一的變換不是改造網格的每個頂點,就像你想要的。

+0

感謝。但是我的要求是,一旦呈現,用戶可以選擇網格模型中的一個或多個頂點並拖動鼠標。在這種情況下,我需要相應地變形渲染模型並再次渲染。你會建議什麼? – user1790875

+0

那麼你可以做相反的事情。採取用戶點擊的點,並進行逆變換以映射回對象空間。 –

0

你必須做angle + = 15,因爲你每次都應用一個新的RotateTransform3D。

這可能幫助:

public RotateTransform3D MyRotationTransform { get; set; } 
... 
//constructor 
public MyClass() 
{ 
    MyRotationTransform = new RotateTransform3D(new AxisAngleRotation3D(new Vector3D(0, 1, 0), 0)); 

} 

//in your method 
MyRotationTransform.Rotation += 15; 
objGeometryModel3D.Transform = MyRotationTransform;