ModelVisual3D的中心

时间:2011-12-23 12:46:17

标签: c# .net wpf 3d

我有一个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

3 个答案:

答案 0 :(得分:2)

您可以计算所有点的平均值。 P代码:

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

avg /= count

这是你的中心。

在简单的物理模拟中,您可以为每个点添加权重。

答案 1 :(得分: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);
}

答案 2 :(得分: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);