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; }
public void Visit(Sphere3D sphere) { _decoratedShape = new RESphere(sphere); }
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); } }
public RESphere(Sphere3D sphere) : base(sphere) { _radius = sphere.Radius; _radius2 = sphere.Radius * sphere.Radius; _position = sphere.CoordinateSystem.Position; }