Point3D panelCenter = new Point3D(0, 0, 0); //控制板操作状态的中心点 /// <summary> /// 获取屏幕点与地平面Y=0的交点 /// </summary> /// <param name="p">viewport3D上的屏幕点</param> private void getCrossPoint3D(Point p) { Matrix3D matrix2, matrixc; Vector3D v1, v2; Vector3D raxis; double rangle; //v1 = new Vector3D(0, 0, -1); PerspectiveCamera camera = mainViewport3D.Camera as PerspectiveCamera; matrixc = (camera.Transform as MatrixTransform3D).Matrix; Point3D pline = camera.Position; pline = matrixc.Transform(pline); Vector3D vline = camera.LookDirection; vline = matrixc.Transform(vline); double angx = Math.Atan((p.X - mainViewport3D.ActualWidth / 2) / (mainViewport3D.ActualWidth / 2) * Math.Tan(camera.FieldOfView / 2 / 180 * Math.PI)); double angy = Math.Atan((-p.Y + mainViewport3D.ActualHeight / 2) / (mainViewport3D.ActualWidth / 2) * Math.Tan(camera.FieldOfView / 2 / 180 * Math.PI)); v1 = new Vector3D(0, 0, -1); v2 = new Vector3D(Math.Tan(angx), Math.Tan(angy), -1); raxis = Vector3D.CrossProduct(v1, v2); raxis.Normalize(); raxis = matrixc.Transform(raxis); raxis.Normalize(); rangle = Vector3D.AngleBetween(v1, v2); if (rangle != 0) { matrix2 = new Matrix3D(); matrix2.Rotate(new Quaternion(raxis, rangle)); vline = matrix2.Transform(vline); vline.Normalize(); } _pcenter = Model3DHelper.calFlatXLine(new Vector3D(0, 1, 0), new Point3D(10000, 0, 10000), vline, pline); }
private void createPie(SettleNode node) { GeometryModel3D model, labelmodel; MeshGeometry3D mesh; MaterialGroup mat; Model3DGroup mgmodel = new Model3DGroup(); Model3DGroup mglabel = new Model3DGroup(); double sum = node.nodes.Sum(p => p.fee); double startAngle = 0, endAngle; double radius = 1; double holeradius = 0.5 * radius, heightratio = 1; int segcount = 1; int coloridx = 0; foreach (SettleNode e0 in node.nodes) { endAngle = startAngle + e0.fee / sum * 360; segcount = (int)Math.Abs((endAngle - startAngle) * 4); mesh = Model3DHelper.genPieSlice(radius, holeradius, heightratio, startAngle, endAngle, segcount, Model3DHelper.EPieType.棱形面); mat = (MaterialGroup)this.FindResource("matslice" + (coloridx % 12).ToString()); model = new GeometryModel3D(mesh, mat); mgmodel.Children.Add(model); Vector3D vec = new Vector3D(); vec.X = 1.1 * radius * Math.Cos((startAngle + endAngle) / 2 / 180 * Math.PI); vec.Y = model.Bounds.SizeY; /// 2; vec.Z = -1.1 * radius * Math.Sin((startAngle + endAngle) / 2 / 180 * Math.PI); mesh = (MeshGeometry3D)this.FindResource("meshText"); string text = e0.nodename + ":" + (e0.fee / sum).ToString("p1"); labelmodel = Model3DHelper.genTextPanel(mesh, Brushes.White, new SolidColorBrush(darkc[coloridx % 12]), 32, text, rotationY, 0.2, vec, 0.5, 0.38); mglabel.Children.Add(labelmodel); //重新绑定旋转 AxisAngleRotation3D axis3d = new AxisAngleRotation3D(); axis3d.Axis = new Vector3D(0, 1, 0); Binding anglebind = new Binding(); anglebind.Source = rotationY; anglebind.Path = new PropertyPath(AxisAngleRotation3D.AngleProperty); anglebind.Mode = BindingMode.OneWay; anglebind.Converter = new ConverterNegative(); BindingOperations.SetBinding(axis3d, AxisAngleRotation3D.AngleProperty, anglebind); ((labelmodel.Transform as Transform3DGroup).Children[1] as RotateTransform3D).Rotation = axis3d; startAngle = endAngle; coloridx++; } mgRight.Children.Add(mgmodel); mgRight.Children.Add(mglabel); }
/// <summary> /// 装载公用的mesh资源,此类资源是程序化生成的 /// </summary> private void loadMeshResource() { MeshGeometry3D mesh = Model3DHelper.genCylinder3DMesh(); mesh.Freeze(); this.Resources.Add("meshCyl", mesh); mesh = Model3DHelper.genCylinder3DTopMesh(); mesh.Freeze(); this.Resources.Add("meshCylTop", mesh); mesh = Model3DHelper.genCube3DMesh(); mesh.Freeze(); this.Resources.Add("meshCube", mesh); mesh = Model3DHelper.genTextVPlaneMesh(); mesh.Freeze(); this.Resources.Add("meshText", mesh); mesh = Model3DHelper.genTextHPlaneMesh(); mesh.Freeze(); this.Resources.Add("meshTextH", mesh); mesh = Model3DHelper.genSphereMesh(0, 1); mesh.Freeze(); this.Resources.Add("meshSphere", mesh); mesh = Model3DHelper.genCone3DMesh(new Point3D(0, 1, 0), new Point3D(0, -1, 0), 0, 1); mesh.Freeze(); this.Resources.Add("meshCone", mesh); mesh = Model3DHelper.genBoxTopMesh(); mesh.Freeze(); this.Resources.Add("meshBoxTop", mesh); mesh = Model3DHelper.genBoxMidMesh(); mesh.Freeze(); this.Resources.Add("meshBoxMid", mesh); mesh = Model3DHelper.genCylTopMesh(); mesh.Freeze(); this.Resources.Add("meshSCylTop", mesh); mesh = Model3DHelper.genCylMidMesh(); mesh.Freeze(); this.Resources.Add("meshSCylMid", mesh); mesh = Model3DHelper.genPlantMesh(); mesh.Freeze(); this.Resources.Add("meshHD", mesh); mesh = Model3DHelper.genPlantWindMesh(); mesh.Freeze(); this.Resources.Add("meshFD", mesh); }
///<summary>初始化</summary> public void initModel() { //构建文字圆柱 //MeshGeometry3D meshtop, meshmain; //meshtop = Share.Model3DHelper.genCylinder3DTopMesh(); //meshmain = Share.Model3DHelper.genCylinder3DMainMesh(); //GeometryModel3D modeltop, modelmain; //modeltop = Share.Model3DHelper.genTextPanel2(meshtop, mbrush, Brushes.Black, 36, price.ToString("f4"), 1, false, new Thickness(0.5, 0, 0.5, 0)); //double w, h; //h = 200; //w = ((Math.PI * scaleVec.X / scaleVec.Y) * h); //bool isrotation = w / Math.PI < h; //modelmain = Share.Model3DHelper.genTextPanel2(meshmain, mbrush, Brushes.Black, 36, energy.ToString("f0"), w / h, isrotation, isrotation ? new Thickness(1.5, 0.5, 1.5, 0.5) : new Thickness(3, 0, 3, 0)); //Model3DGroup mmg = new Model3DGroup(); //mmg.Children.Add(modeltop); //mmg.Children.Add(modelmain); //zmodel = mmg; //构建圆边方柱 //MeshGeometry3D meshtop, meshmain; //meshtop = Share.Model3DHelper.genBoxTopMesh(); //meshmain = Share.Model3DHelper.genBoxMidMesh(); //GeometryModel3D modeltop, modelmain; //modeltop = Share.Model3DHelper.genTextPanel2(meshtop, mbrush, Brushes.Black, 36, price.ToString("f4"), 1, false, new Thickness(0.5, 0, 0.5, 0)); //double w, h; //h = 200; //w = ((Math.PI * scaleVec.X / scaleVec.Y) * h); //bool isrotation = w / Math.PI < h; //modelmain = Share.Model3DHelper.genTextPanel2(meshmain, mbrush, Brushes.Black, 36, energy.ToString("f0"), w / h, isrotation, isrotation ? new Thickness(1.5, 0.5, 1.5, 0.5) : new Thickness(3, 0, 3, 0)); //Model3DGroup mmg = new Model3DGroup(); //mmg.Children.Add(modeltop); //mmg.Children.Add(modelmain); //zmodel = mmg; //构建园边柱 //MeshGeometry3D meshtop = (MeshGeometry3D)Application.Current.FindResource("meshSCylTop"); //MeshGeometry3D meshmid = (MeshGeometry3D)Application.Current.FindResource("meshSCylMid"); //MaterialGroup mat = new MaterialGroup(); //mat.Children.Add(new DiffuseMaterial(mbrush)); //mat.Children.Add(new SpecularMaterial(Brushes.White, 80)); ////Vector3D basescale = new Vector3D(1.0 / meshmid.Bounds.SizeX, 1.0 / (meshmid.Bounds.SizeY+meshtop.Bounds.SizeY), 1.0 / meshmid.Bounds.SizeZ); //缩放为与常用的一致,2*2*2 //Point3D basePoint = new Point3D(meshmid.Bounds.X + meshmid.Bounds.SizeX / 2, meshmid.Bounds.Y, meshmid.Bounds.Z + meshmid.Bounds.SizeZ / 2);//底面中心 ////Vector3D zscale = new Vector3D(scaleVec.X * basescale.X, scaleVec.Y * basescale.Y, scaleVec.Z * basescale.Z); //Vector3D zscale = new Vector3D(scaleVec.X, scaleVec.Y, scaleVec.Z); //Vector3D ztranslate = absoluteTranslateVec + new Vector3D(0, 1, 0); //Transform3DGroup tg = new Transform3DGroup(); //tg.Children.Add(new ScaleTransform3D(zscale, basePoint)); //tg.Children.Add(new TranslateTransform3D(ztranslate)); //zmodel = Model3DHelper.genBoxCylModelGroup(tg, mat, meshtop, meshmid); //foreach (GeometryModel3D one in (zmodel as Model3DGroup).Children) //{ // one.SetValue(ToolTipService.ToolTipProperty, this); //} ////zmodel.SetValue(ToolTipService.ToolTipProperty, this); //构建无文字圆柱 MeshGeometry3D mesh = (MeshGeometry3D)Application.Current.FindResource("meshCyl"); MaterialGroup mat = new MaterialGroup(); mat.Children.Add(new DiffuseMaterial(mbrush)); mat.Children.Add(new SpecularMaterial(Brushes.White, 80)); zmodel = new GeometryModel3D(mesh, mat); zmodel.SetValue(ToolTipService.ToolTipProperty, this); Vector3D basescale = new Vector3D(1.0 / zmodel.Bounds.SizeX, 1.0 / zmodel.Bounds.SizeY, 1.0 / zmodel.Bounds.SizeZ); //缩放为与常用的一致,2*2*2 Point3D basePoint = new Point3D(zmodel.Bounds.X + zmodel.Bounds.SizeX / 2, zmodel.Bounds.Y, zmodel.Bounds.Z + zmodel.Bounds.SizeZ / 2);//底面中心 Vector3D zscale = new Vector3D(scaleVec.X * basescale.X, scaleVec.Y * basescale.Y, scaleVec.Z * basescale.Z); Vector3D ztranslate = absoluteTranslateVec + new Vector3D(0, -zmodel.Bounds.Y, 0); Transform3DGroup tg = new Transform3DGroup(); tg.Children.Add(new ScaleTransform3D(zscale, basePoint)); tg.Children.Add(new TranslateTransform3D(ztranslate)); zmodel.Transform = tg; MeshGeometry3D meshlabel = (MeshGeometry3D)Application.Current.FindResource("meshText"); Vector3D vecTranslate = new Vector3D(absoluteTranslateVec.X, absoluteTranslateVec.Y + zmodel.Bounds.SizeY, absoluteTranslateVec.Z); string label = nodename + "\r\n" + fee.ToString("f0"); double scale = layerScale; int rownums = MyFunction.StringContainsSubstringNums(label, "\r\n"); double temp=2;//新疆怪需求 double panelheight = 0.2 * scale * (rownums + 1) * temp; zlabel = Model3DHelper.genTextPanel(meshlabel, Brushes.Transparent, new SolidColorBrush(Colors.Yellow), 36, label, null, panelheight, vecTranslate, 0.5, 0); if (haveChild) foreach (SettleNode e0 in nodes) e0.initModel(); }