2011-12-23 50 views
2

我有一個帶有一些立方體的ModelVisual3D。如果我想旋轉整個組的中心,我該怎麼做?ModelVisual3D的中心

這裏是我的代碼:

RotateTransform3D rt; 
AxisAngleRotation3D ar; 
Transform3DGroup grp; 

rt = new RotateTransform3D(); 
ar = new AxisAngleRotation3D();      

ar.Axis = new Vector3D(1, 0, 0); 
ar.Angle = x; //x a value 0-360 
rt.Rotation = ar; 
rt.CenterX = //*Here i need the center of the ModelVisual3D X* 
rt.CenterY = //*Here i need the center of the ModelVisual3D Y* 
rt.CenterZ = //*Here i need the center of the ModelVisual3D Z* 

grp = new Transform3DGroup(); 
grp.Children.Add(rt); 

cubes.Transform = grp; //cubes is the ModelVisual3D object that i want to rotate 

回答

2

可以計算所有點的平均值。 P代碼:

Point avg 
for (point in points) 
    avg = avg + point 
    ++count 

avg /= count 

這是您的中心。

在簡單的物理模擬中,您會爲每個點添加一個權重。

1
public Point3D GetCenter(ModelVisual3D model) 
{ 
    var rect3D = Rect3D.Empty; 
    UnionRect(model, ref rect3D); 
    _center = new Point3D((rect3D.X + rect3D.SizeX/2), (rect3D.Y + rect3D.SizeY/2), (rect3D.Z + rect3D.SizeZ/2)); 
    return _center; 
} 

private void UnionRect(ModelVisual3D model, ref Rect3D rect3D) 
{ 
    for (int i = 0; i < model.Children.Count; i++) 
    { 
     var child = model.Children[i] as ModelVisual3D; 
     UnionRect(child, ref rect3D); 
    } 
    if (model.Content != null) 
     rect3D.Union(model.Content.Bounds); 
} 
+0

歡迎計算器!提供示例代碼的簡短說明總是更好,以提高發布準確性:) – 2012-11-02 01:46:53

0

簡單,一旦你知道如何:

Rect3D d1 = MeshGeometry3D_1.Bounds; 
d1.Union(MeshGeometry3D_2.Bounds); 
// to the center of the block: 
Vector3D cVect = new Vector3D(d1.SizeX/2, d1.SizeY/2, d1.SizeZ/2);   
columnModel.Transform = new TranslateTransform3D(-cVect);