Model3DGroup CreateModel(Description description, double radius)
                {
                    Model3DGroup ans = new Model3DGroup();

                    Blades = new List <Blade>();
                    for (int i = 0; i < description.Count; i++)
                    {
                        var blade = new Blade(description.BladeType, radius, MyLib.ToRad(20), Reversed);
                        blade.Transform = blade.OriginTransform = MyLib.Transform(blade).Rotate(new Vector3D(0, 0, 1), (Reversed ? -1 : 1) * (AngleOffset + i * 2.0 * Math.PI / description.Count)).Value;
                        Blades.Add(blade);
                        ans.Children.Add(blade.Model);
                    }
                    SubTransforms.Add(new MatrixTransform3D());//theta
                    return(ans);
                }
Example #2
0
            protected override Model3D CreateModel(params object[] vs)
            {
                propeller           = new Propeller(Propeller.Types.Basic);
                propeller.Transform = propeller.OriginTransform = MyLib.Transform(propeller).TranslatePrepend(new Vector3D(0, 1.5, 0)).RotatePrepend(new Vector3D(1, 0, 0), MyLib.ToRad(-90)).Value;
                drill           = new Drill(1.5, 50);
                drill.Transform = drill.OriginTransform = MyLib.Transform(drill).TranslatePrepend(new Vector3D(1.5, 0, 0)).RotatePrepend(new Vector3D(0, 1, 0), MyLib.ToRad(90)).Value;
                var ans = new Model3DGroup();

                ans.Children.Add(CreateBodyModel());
                ans.Children.Add(propeller.Model);
                ans.Children.Add(drill.Model);
                propeller.DownwardWindSpeed = () => { return(Vector3D.DotProduct(RB.velocity, new Vector3D(-Math.Sin(RB.theta), Math.Cos(RB.theta), 0))); };
                this.SubTransforms.Add(new MatrixTransform3D());
                this.SubTransforms.Add(new MatrixTransform3D());
                //AddSphere(ans);
                return(ans);
            }
Example #3
0
        public void Update(double secs)
        {
            timePassed += secs;
            var ratio = timePassed / LifeTime;

            if (ratio >= 1)
            {
                Disappeared = true; return;
            }
            (Model as GeometryModel3D).Material = new DiffuseMaterial {
                Brush = new SolidColorBrush(Color.FromArgb((byte)(Color.A * (1 - ratio)), Color.R, Color.G, Color.B))
            };
            Position += secs * Speed;
            var angle = MyLib.Rand.NextDouble() * 2 * Math.PI;

            Speed    += secs * SpeedRandomness * new Vector3D(Math.Cos(angle), Math.Sin(angle), 0);
            Transform = MyLib.Transform(MatrixTransform3D.Identity).TranslatePrepend(Position - new Point3D()).ScalePrepend(new Vector3D(1, 1, 1) * (1 + (RadiusEnd - RadiusStart) / RadiusStart * ratio)).Value;
        }
                    Model3DGroup CreateModel(Description description, double scale, double angle, bool reversed)
                    {
                        var vs = description.Vertexes.Select(v => v.Multiply(scale));

                        if (reversed)
                        {
                            vs    = vs.Select(v => new Point3D(v.X, -v.Y, v.Z)).Reverse();
                            angle = -angle;
                        }
                        var front = My3DGraphics.NewModel().AddTriangles(vs, new[] { 3, 2, 0, 2, 1, 0 }).CreateModel(Brushes.Violet);
                        var back  = My3DGraphics.NewModel().AddTriangles(vs, new[] { 0, 1, 2, 0, 2, 3 }).CreateModel(Brushes.DarkViolet);

                        front.Transform = back.Transform = MyLib.Transform(front).Rotate(new Vector3D(1, 0, 0), angle).Value;
                        return(new Model3DGroup()
                        {
                            Children = { front, back }
                        });
                    }
Example #5
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);
                }
Example #6
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);
            }
Example #7
0
 public Body() : base()
 {
     propeller.IsOnGround = () => IsOnGround();
     Kernel.Heart.Beat1  += (secs) =>
     {
         //if (IsOnGround()) System.Diagnostics.Trace.WriteLine("A");
         MaintainRotationY(secs);
         MaintainRotationZ(secs);
         //drill.Folding = System.Math.Abs(System.DateTime.Now.Ticks % 100000000 - 50000000) / 50000000.0;
         {
             RB.position.Z = RB.velocity.Z = 0;
             RB.force      = new Vector3D();
             RigidBodyUpdating?.Invoke(secs, RB);
             RB.force += new Vector3D(0, -RB.mass * Constants.Gravity, 0);
             RB.force += new Vector3D(-Math.Sin(RB.theta) * propeller.LiftForce(), Math.Cos(RB.theta) * propeller.LiftForce(), 0);
             NextRB    = new RigidBody(RB);
             MaintainRigidBody(secs);
         }
         {
             double frictionAcceleration = (TrackSpeed > 0 ? -1 : 1) * (TrackFriction /*+ 0.5 * Math.Abs(TrackSpeed)*/);
             double acceleration         = 0;
             if (IsOnGround() && Keyboard.IsDown(System.Windows.Input.Key.A, System.Windows.Input.Key.D))
             {
                 if (!Keyboard.IsDown(RotationY > Math.PI / 2 ? System.Windows.Input.Key.D : System.Windows.Input.Key.A))
                 {
                     acceleration += Math.Min(MaxTrackAcceleration, MaxTrackPower / Math.Max(Math.Abs(TrackSpeed), double.MinValue));
                 }
                 else
                 {
                     frictionAcceleration += (TrackSpeed > 0 ? -1 : 1) * MaxTrackAcceleration;
                 }
             }
             NextTrackSpeed  = TrackSpeed;
             NextTrackSpeed += acceleration * secs;
             if ((NextTrackSpeed > 0) != (NextTrackSpeed + frictionAcceleration * secs > 0))
             {
                 NextTrackSpeed = 0;
             }
             else
             {
                 NextTrackSpeed += frictionAcceleration * secs;
             }
         }
         const double lookOffset = 1.3;
         MyLib.SmoothTo(ref Kernel.CameraProperties.position, RB.position + new Vector3D(0, 0, 30 / Math.Pow(0.4 + SetZ(RB.position - Kernel.CameraProperties.position, 0).Length * 0.1, 0.5)), secs, 0.2);
         var target = RB.position + 0.1 * RB.velocity - Kernel.CameraProperties.position;
         target /= Math.Abs(target.Z);
         var len       = Math.Sqrt(Math.Pow(target.X, 2) + Math.Pow(target.Y, 2));
         var targetLen = Math.Min(len, lookOffset);
         target.X *= targetLen / len;
         target.Y *= targetLen / len;
         MyLib.SmoothTo(ref Kernel.CameraProperties.lookDirection, target, secs, 0.2);
         //this.Folding = 1;
         //for(int i=0;i<1;i++)
         {
             var color    = (byte)MyLib.Rand.Next(200, 210);
             var position = RB.position + new Vector3D(-Math.Cos(RotationY) * 1, 1, MyLib.Rand.NextDouble() / 2 + 0.5);
             var speed    = new Vector3D(2 * -Math.Cos(RotationY) + MyLib.Rand.NextDouble() - 0.5, 5 + MyLib.Rand.NextDouble() - 0.5, 0);
             Fumes.Instance.AddFums(position, speed
                                    , Color.FromArgb(50, color, color, color)
                                    , 0.1, 2, 2, speed.Length * 1.5);
         }
     };
     Kernel.Heart.Beat2 += () =>
     {
         RotationY = NextRotationY;
         MyLib.Set(SubTransforms, TransformIndexRotateAroundY, true).RotatePrepend(new Vector3D(0, -1, 0), RotationY).Done();
         MyLib.Set(SubTransforms, TransformIndexRotateAroundZ, true).RotatePrepend(new Vector3D(0, 0, 1), RB.theta).Done();
         RB              = NextRB;
         TrackSpeed      = NextTrackSpeed;
         OriginTransform = MyLib.Transform(new MatrixTransform3D()).Translate(RB.position - new Point3D()).Value;
         UpdateTransform();
     };
 }
Example #8
0
 public void Reset(Vector3D anchor)
 {
     this.Transform = MyLib.Transform(OriginTransform).TranslatePrepend(anchor - Anchor).Value;
 }