public static RenderGeometry CreateSphereGeometry(float radius, int segmentP, int segmentH, bool smoothH, bool smoothV, float cutTop = 0, float cutBottom = 0) { if (cutTop + cutBottom > 1) { return(new RenderGeometry()); } RenderGeometry.FaceType faceType = GetFaceType(smoothH, smoothV); StructureGeometry structure = new StructureGeometry(); SurfaceComponentGeometry upperPart, lowerPart, middlePart; if (cutTop != 0) { upperPart = SurfaceComponentGeometries.CreateRegularPolygonGeometry(radius * Mathf.Sqrt(4 * cutTop * (1 - cutTop)), segmentP, 2); upperPart.ApplyOffset(radius * (1 - 2 * cutTop) * Vector3.up); } else { float angle = cutBottom != 0 ? Mathf.Acos(-1 + cutBottom * 2) : Mathf.PI * (segmentH / 2) / segmentH; upperPart = SurfaceComponentGeometries.CreateSphereCapGeometry(radius, segmentP, cutBottom != 0 ? segmentH : segmentH / 2, 2 * angle, 0, 1, faceType); } if (cutBottom != 0) { lowerPart = SurfaceComponentGeometries.CreateRegularPolygonGeometry(radius * Mathf.Sqrt(4 * cutBottom * (1 - cutBottom)), segmentP, 2); lowerPart.ApplyOffset(radius * (1 - 2 * cutBottom) * Vector3.up); lowerPart.ApplyRotation(Quaternion.AngleAxis(180, Vector3.right)); } else { float angle = cutTop != 0 ? Mathf.Acos(-1 + cutTop * 2) : Mathf.PI * ((segmentH + 1) / 2) / segmentH; lowerPart = SurfaceComponentGeometries.CreateSphereCapGeometry(radius, segmentP, cutTop != 0 ? segmentH : (segmentH + 1) / 2, 2 * angle, 0, 1, faceType); lowerPart.ApplyRotation(Quaternion.AngleAxis(180, Vector3.right)); } if (cutTop != 0 && cutBottom != 0) { float angle1 = Mathf.Acos(1 - cutTop * 2); float angle2 = Mathf.Acos(-1 + cutBottom * 2); middlePart = SurfaceComponentGeometries.CreateSphereSideGeometry(radius, angle1, angle2, segmentP, segmentH, 0, 1, faceType); Vertex cornerUp = structure.CreateVertex(); Vertex cornerDown = structure.CreateVertex(); structure.CreateFace(middlePart, false, cornerUp, cornerUp, cornerDown, cornerDown); structure.CreateFace(upperPart, false, cornerUp); structure.CreateFace(lowerPart, false, cornerDown); } else { Vertex corner = structure.CreateVertex(); structure.CreateFace(upperPart, false, corner); structure.CreateFace(lowerPart, false, corner); } return(structure.Build()); }
public static RenderGeometry CreateCapsuleGeometry(float radius, float height, int segmentP, int segmentH1, int segmentH2, bool smoothH, bool smoothV) { StructureGeometry structure = new StructureGeometry(); RenderGeometry.FaceType faceType = GetFaceType(smoothH, smoothV); SurfaceComponentGeometry side = SurfaceComponentGeometries.CreateCylinderSideGeometry(radius, height, segmentP, segmentH1, faceType: faceType); SurfaceComponentGeometry upperCap = SurfaceComponentGeometries.CreateSphereCapGeometry(radius, segmentP, segmentH2, faceType: faceType); SurfaceComponentGeometry lowerCap = SurfaceComponentGeometries.CreateSphereCapGeometry(radius, segmentP, segmentH2, faceType: faceType); lowerCap.ApplyRotation(Quaternion.AngleAxis(180, Vector3.right)); Vertex cornerUp = structure.CreateVertex(new Vector3(radius, height / 2, 0)); Vertex cornerDown = structure.CreateVertex(new Vector3(radius, -height / 2, 0)); structure.CreateFace(side, false, cornerUp, cornerUp, cornerDown, cornerDown); structure.CreateFace(upperCap, true, cornerUp); structure.CreateFace(lowerCap, true, cornerDown); return(structure.Build()); }