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); }
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); }
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 } }); }
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); }
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); }
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(); }; }
public void Reset(Vector3D anchor) { this.Transform = MyLib.Transform(OriginTransform).TranslatePrepend(anchor - Anchor).Value; }