2015-10-20 102 views
0

我需要旋轉和平移對象。我有一個問題,我只能做其中的一個。我使用此代碼:旋轉和平移對象

RotateTransform3D myRotate = new RotateTransform3D(new AxisAngleRotation3D(new Vector3D(0, 0, 1), Convert.ToDouble(180)), new Point3D(0, 0, 0)); 
TranslateTransform3D myTranslate = new TranslateTransform3D(0, 0, 100); 
ModelVisual3D device3D2 = new ModelVisual3D(); 
device3D2.Content = Display3d(MODEL_PATH2); 
device3D2.Transform = myRotate; 
device3D2.Transform = myTranslate; 
viewPort3d.Children.Add(device3D2); 

問題是它只做最後一次轉換。我的意思是,如果我應用「myRotate」第二個,它旋轉對象,但它不適用「myTranslate」操作。我需要做兩個轉換。

我也使用HelixToolkit。

+0

我對這個框架一無所知,但很明顯問題是你正在設置'Transform'屬性,然後改變它。因此,在使用(通過視口)時,只使用最後一個。必須有一種方法來組合* transform對象,或者創建一個集合。 – musefan

+0

是的,你是對的,謝謝!但...任何想法如何改善? :) – Imrik

+0

有一個快速的樣子,但看不出任何明顯的。就我個人而言,我可能會玩Intellisense並尋找看起來可能幫助的類/方法,然後嘗試它們 – musefan

回答

1

你必須直接與Transform場混亂,而不是更換整個Transform,即transform.positiontransform.rotationtransform.localPositiontransform.localEulerAnglestransform.scaletransform.localScale

device3D2.Transform.rotation *= new Quaternion.AngleAxis(180f, new Vector3(0f, 0f, 1f)); 
device3D2.Transform.Translate(0, 0, 100); 
0

您需要使用Transform3DGroup對象。然後向其中添加不同的轉換:

Transform3DGroup myTransformer = new Transform3DGroup; 
RotateTransform3D myRotate = new RotateTransform3D(new AxisAngleRotation3D (new Vector3D(0, 0, 1), Convert.ToDouble(180)), new Point3D(0, 0, 0)); 
TranslateTransform3D myTranslate = new TranslateTransform3D(0, 0, 100); 
myTransformer.Children.Add(myRotate); 
myTransformer.Children.Add(myTranslate); 
ModelVisual3D device3D2 = new ModelVisual3D(); 
device3D2.Content = Display3d(MODEL_PATH2); 
device3D2.Transform = myTransformer; 
viewPort3d.Children.Add(device3D2); 

注意添加單個轉換器的順序。