Beispiel #1
0
        protected override Model3D CreateModel(params object[] vs)
        {
            MyLib.AssertTypes(vs, typeof(Point3D), typeof(Vector3D), typeof(Color), typeof(double), typeof(double), typeof(double), typeof(double));
            Position        = (Point3D)vs[0];
            Speed           = (Vector3D)vs[1];
            Color           = (Color)vs[2];
            RadiusStart     = (double)vs[3];
            RadiusEnd       = (double)vs[4];
            LifeTime        = (double)vs[5];
            SpeedRandomness = (double)vs[6];
            const int      n         = 10;
            List <Point3D> positions = new List <Point3D>();

            for (int i = 0; i < n; i++)
            {
                positions.Add(new Point3D(RadiusStart * Math.Cos(2 * Math.PI * i / n), RadiusStart * Math.Sin(2 * Math.PI * i / n), 0));
            }
            List <int> triangleIndices = new List <int>();

            for (int i = 2; i < n; i++)
            {
                triangleIndices.AddRange(new[] { 0, i - 1, i });
            }
            return(My3DGraphics.NewModel().AddTriangles(positions, triangleIndices).CreateModel(new SolidColorBrush(Color)));
        }
Beispiel #2
0
 protected override Model3D CreateModel(params object[] vs)
 {
     SubTransforms.Add(new MatrixTransform3D());
     MyLib.AssertTypes(vs, typeof(Point3D));
     Position = (Point3D)vs[0];
     My3DGraphics.Cuboid.AddFaces(new Point3D(0.1, 0.1, 0.1), out List <Point3D> vertices, out List <int> triangleIndices, out List <Vector3D> normals);
     return(My3DGraphics.NewModel().AddTriangles(vertices, triangleIndices, normals).CreateModel(new SolidColorBrush(Colors.White)));
 }
 protected override Model3D CreateModel(params object[] vs)
 {
     MyLib.AssertTypes(vs, typeof(Propeller), typeof(Types), typeof(double), typeof(bool), typeof(double), typeof(double));
     Parent      = vs[0] as Propeller;
     Reversed    = (bool)vs[3];
     SpeedRatio  = (double)vs[4];
     AngleOffset = (double)vs[5];
     return(CreateModel(Descriptions[(Types)vs[1]], (double)vs[2]));
 }
Beispiel #4
0
            protected override Model3D CreateModel(params object[] vs)
            {
                MyLib.AssertTypes(vs, typeof(Body), typeof(Vector3D));
                var          parent = vs[0] as Body;
                var          offset = (Vector3D)vs[1];
                const double gap    = 2.5 + 1;

                leftTrack = new Track(parent, offset + new Vector3D(0, 0, -gap / 2));
                rigtTrack = new Track(parent, offset + new Vector3D(0, 0, gap / 2));
                //leftTrack.Transform = leftTrack.OriginTransform = MyLib.Transform(leftTrack).TranslatePrepend(new Vector3D(0, 0, -gap / 2)).Value;
                //rigtTrack.Transform = rigtTrack.OriginTransform = MyLib.Transform(rigtTrack).TranslatePrepend(new Vector3D(0, 0, gap / 2)).Value;
                var ans = new Model3DGroup();

                ans.Children.Add(leftTrack.Model);
                ans.Children.Add(rigtTrack.Model);
                return(ans);
            }
Beispiel #5
0
                protected override Model3D CreateModel(params object[] vs)
                {
                    //const double suspensionHardness = 10;
                    MyLib.AssertTypes(vs, typeof(Body), typeof(Vector3D));
                    Parent = vs[0] as Body;
                    var offset = (Vector3D)vs[1];
                    //return TemporaryModel();
                    const double depth = 1, height = 1, lengthUp = 4, lengthDown = 2.5;
                    var          chain = new List <Tuple <Point3D, double, double, double> >
                    {                       //      relative position,                                  radius, mass,   suspension hardness
                        Tuple.Create(new Point3D(-lengthUp / 2, -height / 2 + 0.4, 0), 0.4, 0.02, 7.0 / 2),
                        Tuple.Create(new Point3D((lengthDown * 1 - lengthUp * 3) / 4 / 2, -height / 2 + 0.2, 0), 0.2, 0.025, 10.0 / 2),
                        Tuple.Create(new Point3D((lengthDown * 2 - lengthUp * 2) / 4 / 2, -height / 2 + 0.2, 0), 0.2, 0.03, 10.0 / 2),
                        Tuple.Create(new Point3D((lengthDown * 3 - lengthUp * 1) / 4 / 2, -height / 2 + 0.2, 0), 0.2, 0.03, 20.0 / 2),
                        Tuple.Create(new Point3D(lengthDown / 2, -height / 2 + 0.5, 0), 0.5, 0.045, 15.0 / 2),
                        Tuple.Create(new Point3D(lengthUp / 2, height / 2, 0), 0.2, 0.01, 10.0 / 2),
                        Tuple.Create(new Point3D(-lengthUp / 10, height / 2, 0), 0.3, 0.01, 10.0 / 2),
                    }.Select(p => new Tuple <Point3D, double, double, double>(p.Item1 + offset, p.Item2, p.Item3, p.Item4)).ToList();
                    Model3DGroup ans = new Model3DGroup();

                    foreach (var gv in chain)
                    {
                        var p    = gv.Item1;
                        var gear = new Gear(p, gv.Item2, gv.Item4 * 2, gv.Item3, Parent);
                        ans.Children.Add(gear.Model);
                        gears.Add(gear);
                    }
                    foreach (var i in new[] { 3, 4 })
                    {
                        groundGears.Add(gears[i]);
                    }
                    double chainLength = GetChainLength(gears);
                    int    count       = (int)(chainLength / 0.5);

                    for (int i = 0; i < count; i++)
                    {
                        var t = new Tooth(GetToothPosition(gears, (double)i / count));
                        ans.Children.Add(t.Model);
                        Teeth.Add(t);
                    }
                    return(ans);
                }
Beispiel #6
0
                protected override Model3D CreateModel(params object[] vs)
                {
                    MyLib.AssertTypes(vs, typeof(double), typeof(double), typeof(double), typeof(Color));
                    double r                    = (double)vs[0];
                    double coneAngle            = (double)vs[1];
                    double attackAngle          = (double)vs[2];
                    var    color                = (Color)vs[3];
                    double R                    = r / Math.Cos(coneAngle);
                    var    blade                = My3DGraphics.NewModel().AddTriangles(new[] { new Point3D(0, 0, 0), new Point3D(R, 0, 0), new Point3D(R, R / 7, 0), new Point3D(0, R / 30, 0) }, new[] { 0, 1, 2, 0, 2, 3, 3, 2, 0, 2, 1, 0 }).CreateModel(new SolidColorBrush(color));
                    var    bladeOriginTransform = blade.Transform;
                    double supportThickness     = R / 100;
                    var    support              = My3DGraphics.NewModel().AddTriangles(
                        new[] { new Point3D(0, 0, -supportThickness), new Point3D(R / 2, 0, -supportThickness), new Point3D(0, supportThickness, -supportThickness), new Point3D(R / 2, supportThickness, -supportThickness), new Point3D(0, 0, 0), new Point3D(R / 2, 0, 0), new Point3D(0, supportThickness, 0), new Point3D(R / 2, supportThickness, 0) },
                        ///6 7
                        ///4 5
                        ///
                        ///2 3
                        ///0 1
                        new[]
                    {
                        0, 2, 3, 0, 3, 1,
                        4, 5, 7, 4, 7, 6,
                        0, 1, 5, 0, 5, 4,
                        2, 6, 7, 2, 7, 3,
                        0, 4, 6, 0, 6, 2,
                        1, 3, 7, 1, 7, 5
                    }).CreateModel(new SolidColorBrush(Colors.Gray));
                    var supportOriginTransform = support.Transform;
                    var ans = new Model3DGroup();

                    ans.Children.Add(blade);
                    ans.Children.Add(support);
                    System.Diagnostics.Trace.WriteLine($"coneangle={coneAngle},{coneAngle / Math.PI * 180}");
                    setFoldingAction = new Action <double>(folding =>
                    {
                        double angle      = coneAngle + folding * (Math.PI / 2 - coneAngle);
                        blade.Transform   = MyLib.Transform(bladeOriginTransform).TranslatePrepend(new Vector3D(0.5 * R * Math.Cos(angle), 0, 0.5 * R * Math.Sin(angle))).RotatePrepend(new Vector3D(0, 1, 0), angle).TranslatePrepend(new Vector3D(-R / 2, 0, 0)).RotatePrepend(new Vector3D(1, 0, 0), attackAngle).Value;
                        support.Transform = MyLib.Transform(supportOriginTransform).Rotate(new Vector3D(0, 1, 0), -angle).Value;
                    });
                    setFoldingAction(0);
                    return(ans);
                }
Beispiel #7
0
            protected override Model3D CreateModel(params object[] vs)
            {
                MyLib.AssertTypes(vs, typeof(double), typeof(double));
                double r         = Radius = (double)vs[0];
                double n         = (double)vs[1];
                double coneAngle = ConeAngle = MyLib.ToRad(50);

                blades = new List <Blade>();
                Model3DGroup ans = new Model3DGroup();

                for (int i = 0; i < n; i++)
                {
                    double a     = Math.PI * 2 * i / n;
                    var    blade = new Blade(r, coneAngle, MyLib.ToRad(40), new[] { Colors.DarkGray, Colors.DarkSlateGray, Colors.DimGray, Colors.Gray, Colors.LightGray, Colors.LightSlateGray, Colors.SlateGray }[MyLib.Rand.Next(7)]);
                    blade.Transform = MyLib.Transform(new MatrixTransform3D()).Rotate(new Vector3D(0, 0, 1), a) /*.Translate(new Vector3D(0, 0, r * Math.Tan(coneAngle)))*/.Value;
                    blades.Add(blade);
                    ans.Children.Add(blade.Model);
                }
                return(ans);
            }
Beispiel #8
0
        protected override Model3D CreateModel(params object[] vs)
        {
            MyLib.AssertTypes(vs, typeof(Vector3D), typeof(Size3D), typeof(Brush));
            var anchor = Anchor = (Vector3D)vs[0];
            var size   = (Size3D)vs[1];
            var brush  = (Brush)vs[2];

            My3DGraphics.Cuboid.AddFaces(new Point3D(size.X / 2, size.Y / 2, size.Z / 2), out List <Point3D> vertices, out List <int> triangleIndices, out List <Vector3D> normals, "xy-z");
            vertices = vertices.Select(p => p + new Vector3D(size.X, size.Y, size.Z) / 2 + anchor).ToList();
            System.Diagnostics.Trace.Assert(vertices.Count == 5 * 4 && triangleIndices.Count == 5 * 6 && normals.Count == 5 * 4);
            for (int k = 0; k <= 0; k++)
            {
                for (int i = k * 6, j = (k + 1) * 6 - 1; i < j; i++, j--)
                {
                    var t = triangleIndices[i]; triangleIndices[i] = triangleIndices[j]; triangleIndices[j] = t;
                }
                for (int i = k * 4; i < (k + 1) * 4; i++)
                {
                    normals[i] *= -1;
                }
            }
            return(My3DGraphics.NewModel().AddTriangles(vertices, triangleIndices, normals).CreateModel(brush));
        }
 protected override Model3D CreateModel(params object[] vs)
 {
     MyLib.AssertTypes(vs, typeof(Types), typeof(double), typeof(double), typeof(bool));
     return(CreateModel(Descriptions[(Types)vs[0]], (double)vs[1], (double)vs[2], (bool)vs[3]));
 }