예제 #1
0
 private Shape3D ConvertShapeNode(ShapeNode node, float[,] transformation)
 {
     AppearanceNode appearance = (AppearanceNode)node.appearance.Node;
     MaterialNode material = appearance.material.Node as MaterialNode;
     if (node.geometry.Node is SphereNode) {
         SphereNode sphereNode = (SphereNode)node.geometry.Node;
         Sphere3D sphere = new Sphere3D();
         //sphere.Position = new Graph3D.Framework.Math.Vector3D(0, 0, 0);
         sphere.Radius = sphereNode.radius.Value;
         SetAppearance(sphere, appearance);
         return sphere;
     }
     if (node.geometry.Node is BoxNode) {
         return null;
     }
     if (node.geometry.Node is IndexedFaceSetNode) {
         IndexedFaceSetNode faceSetNode = (IndexedFaceSetNode)node.geometry.Node;
         Shape3DComposite composite = new Shape3DComposite();
         int facesCount = 0;
         for (int i = 0; i < faceSetNode.coordIndex.length; i++)
             if (faceSetNode.coordIndex[i] == -1) facesCount++;
         MFVec3f coords = ((CoordinateNode)faceSetNode.coord.Node).point;
         for (int faceOffsetIndex = 0; faceOffsetIndex < faceSetNode.coordIndex.length; faceOffsetIndex++) {
             Triangle3D triangle;
             triangle = new Triangle3D();
             SFVec3f a = coords[faceSetNode.coordIndex[faceOffsetIndex]];
             SFVec3f b = coords[faceSetNode.coordIndex[faceOffsetIndex + 1]];
             SFVec3f c = coords[faceSetNode.coordIndex[faceOffsetIndex + 2]];
             triangle.A = ConvertVector3D(a, transformation);
             triangle.B = ConvertVector3D(b, transformation);
             triangle.C = ConvertVector3D(c, transformation);
             SetAppearance(triangle, appearance);
             composite.Add(triangle);
             faceOffsetIndex += 3;
             while (faceSetNode.coordIndex[faceOffsetIndex] != -1) {
                 faceOffsetIndex++;
             }
         }
         triangles += facesCount;
         return composite;
     }
     return null;
 }
예제 #2
0
 public void Visit(Sphere3D sphere)
 {
     _decoratedShape = new RESphere(sphere);
 }
예제 #3
0
        protected virtual void OptimizeComposite(REShapeComposite composite)
        {
            var points = new List<Vector3D>();
            foreach (REBaseShape child in composite) {
                if (child is RETriangle) {
                    RETriangle triangle = (RETriangle)child;
                    points.Add(triangle.A);
                    points.Add(triangle.B);
                    points.Add(triangle.C);
                    continue;
                }
                if (child is RERectangle) {
                    var rectangle = (RERectangle)child;
                    points.Add(rectangle.A);
                    points.Add(rectangle.B);
                    points.Add(rectangle.C);
                    points.Add(rectangle.B + rectangle.C - rectangle.A);
                    continue;
                }
            }

            List<Vector3D> prev = points;
            for (int i = 0; i < 0; i++) {
                List<Vector3D> additional = GetAdditionalPoints(prev, composite);
                points.AddRange(additional);
                prev = additional;
            }

            Vector3D a = new Vector3D(), b = new Vector3D();
            float maxLength = float.MinValue;
            for (int i = 0; i < points.Count; i++) {
                for (int j = 0; j < points.Count; j++) {
                    float length = (points[i] - points[j]).Length;
                    if (length > maxLength) {
                        a = points[i];
                        b = points[j];
                        maxLength = length;
                    }
                }

            }

            if ((a - b).Length > 0.01) {
                Sphere3D holder = new Sphere3D();
                Vector3D center = (a + b) * 0.5f;
                holder.CoordinateSystem.Position = center;
                holder.Radius = (a - b).Length / 2;
                composite.BoundingShape = new RESphere(holder);
            }
        }
예제 #4
0
 public RESphere(Sphere3D sphere)
     : base(sphere) {
     _radius = sphere.Radius;
     _radius2 = sphere.Radius * sphere.Radius;
     _position = sphere.CoordinateSystem.Position;
 }