日期:2014-05-18  浏览次数:20977 次

一个矩形,围绕一条轴转动,这样的动画,能否实现?

轴是垂直方向的。如下图,然后,矩形围绕轴,旋转。

这样的动画,如何实现?


XML code



             |
             |
             |
             |
             |
             |
             |            -------------------
             |           |                   |
             |           |                   |
             |           |                   |
             |            -------------------
             |
             |
             |
             |
             |








------解决方案--------------------
是不是这意思?做的不精确,回头再研究。
C# code

    public partial class MainWindow : Window
    {
        int i = 0;
        MatrixTransform3D mt3d = new MatrixTransform3D();
        public MainWindow()
        {
            InitializeComponent();
            Viewport3D viewport = new Viewport3D();
            ModelVisual3D modelvisual = new ModelVisual3D();
            Model3DGroup modelgroup = new Model3DGroup();
            GeometryModel3D geomodel = new GeometryModel3D();
            GeometryModel3D geomodel2 = new GeometryModel3D();
            MeshGeometry3D mgeo = new MeshGeometry3D();
            MeshGeometry3D mgeo2 = new MeshGeometry3D();
            viewport.Camera = new PerspectiveCamera(new Point3D(0, 0.5, 8), new Vector3D(0, 0, -1), new Vector3D(0.5, 0, -1), 45);
            mgeo.Positions.Add(new Point3D(-0.5, -0.5, -0.5));
            mgeo.Positions.Add(new Point3D(0.5, -0.5, 0.5));
            mgeo.Positions.Add(new Point3D(0.5, 0.5, 0.5));
            mgeo.Positions.Add(new Point3D(0.5, 0.5, 0.5));
            mgeo.Positions.Add(new Point3D(-0.5, 0.5, -0.5));
            mgeo.Positions.Add(new Point3D(-0.5, -0.5, -0.5));

            mgeo2.Positions.Add(new Point3D(-1.5, 1, -1));
            mgeo2.Positions.Add(new Point3D(1.5, 1, -1));
            mgeo2.Positions.Add(new Point3D(1.5, 1.1, -1));
            mgeo2.Positions.Add(new Point3D(1.5, 1.1, -1));
            mgeo2.Positions.Add(new Point3D(-1.5, 1.1, -1));
            mgeo2.Positions.Add(new Point3D(-1.5, 1, -1));
            geomodel.Geometry = mgeo;
            geomodel.Material = new DiffuseMaterial(Brushes.Black);
            geomodel.Transform = mt3d;
            geomodel.BackMaterial = new DiffuseMaterial(Brushes.Black);
            geomodel2.Geometry = mgeo2;
            geomodel2.Material = new DiffuseMaterial(Brushes.Black);
            modelgroup.Children.Add(geomodel);
            modelgroup.Children.Add(geomodel2);
            modelvisual.Content = modelgroup;
            viewport.Children.Add(modelvisual);
            grid1.Children.Add(viewport);
            CompositionTarget.Rendering += new EventHandler(CompositionTarget_Rendering);
        }

        void CompositionTarget_Rendering(object sender, EventArgs e)
        {
            double m11 = Math.Cos(i * 0.01);
            double m12 = Math.Sin(i * 0.01);
            Matrix3D matrix = new Matrix3D();
            matrix.M11 = 0;
            matrix.M12 = m11;
            matrix.M13 = m12;
            matrix.M21 = 1;
            matrix.M22 = 0;
            matrix.M23 = 0;
            matrix.M31 = 0;
            matrix.M32 = -m12;
            matrix.M33 = m11;
            matrix.OffsetY = 0.9 * (1 - m11 + m12);
            matrix.OffsetZ = 0.9 * (1 - m12 - m11);
            mt3d.Matrix = matrix;
            i++;
        }
    }