Center of a ModelVisual3D

本文关键字:ModelVisual3D of Center | 更新日期: 2023-09-27 18:18:45

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

Center of a ModelVisual3D

可以计算所有点的平均值。p:

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

这就是你的中心。

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

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);
}

只要你知道怎么做就好了:

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);