示例#1
0
        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);
        }
示例#2
0
        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);
        }
示例#3
0
        /// <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);
        }
示例#4
0
        ///<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();
        }