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