@@ -663,128 +663,133 @@ public static MeshDraft PartialBox(Vector3 width, Vector3 depth, Vector3 height,
663663 /// <summary>
664664 /// Constructs a capsule draft
665665 /// </summary>
666- /// <param name="height">The height of the capsule, not including the end caps </param>
666+ /// <param name="height">The height of the capsule</param>
667667 /// <param name="radius">The radius of the capsule</param>
668- /// <param name="segments">The number of radial segments. Defaults to 12 </param>
668+ /// <param name="segments">The number of radial segments. Defaults to 32 </param>
669669 /// <param name="rings">The number of end-cap rings. Defaults to 8</param>
670- /// <returns></returns>
671- public static MeshDraft Capsule ( float height , float radius , int segments = 12 , int rings = 8 )
670+ public static MeshDraft Capsule ( float height , float radius , int segments = 32 , int rings = 8 )
672671 {
673- int numVerts = 2 * rings * segments + 2 ;
674- int numFaces = 4 * rings * segments ;
675- double theta = 2 * Math . PI / segments ;
676- double phi = Math . PI / ( 2 * rings ) ;
672+ float cylinderHeight = height - radius * 2 ;
673+ int vertexCount = 2 * rings * segments + 2 ;
674+ int triangleCount = 4 * rings * segments ;
675+ float horizontalAngle = 360f / segments ;
676+ float verticalAngle = 90f / rings ;
677677
678- Vector3 [ ] verts = new Vector3 [ numVerts ] ;
679- Vector3 [ ] norms = new Vector3 [ numVerts ] ;
680- int [ ] faces = new int [ 3 * numFaces ] ;
681- int vi = 0 , fi = 0 , topCap = 0 , botCap = 1 ;
678+ var vertices = new Vector3 [ vertexCount ] ;
679+ var normals = new Vector3 [ vertexCount ] ;
680+ var triangles = new int [ 3 * triangleCount ] ;
682681
683- verts [ vi ] . Set ( 0 , height / 2 + radius , 0 ) ;
684- norms [ vi ++ ] . Set ( 0 , 1 , 0 ) ;
685- verts [ vi ] . Set ( 0 , - height / 2 - radius , 0 ) ;
686- norms [ vi ++ ] . Set ( 0 , - 1 , 0 ) ;
682+ int vi = 2 ;
683+ int ti = 0 ;
684+ int topCapIndex = 0 ;
685+ int bottomCapIndex = 1 ;
687686
688- for ( var s = 0 ; s < segments ; s ++ )
687+ vertices [ topCapIndex ] . Set ( 0 , cylinderHeight / 2 + radius , 0 ) ;
688+ normals [ topCapIndex ] . Set ( 0 , 1 , 0 ) ;
689+ vertices [ bottomCapIndex ] . Set ( 0 , - cylinderHeight / 2 - radius , 0 ) ;
690+ normals [ bottomCapIndex ] . Set ( 0 , - 1 , 0 ) ;
691+
692+ for ( int s = 0 ; s < segments ; s ++ )
689693 {
690- for ( var r = 1 ; r <= rings ; r ++ )
694+ for ( int r = 1 ; r <= rings ; r ++ )
691695 {
692- double radial = radius * Math . Sin ( r * phi ) ;
693-
694- // create verts (top cap)
695- verts [ vi ] . Set (
696- ( float ) ( radial * Math . Cos ( s * theta ) ) ,
697- ( float ) ( height / 2 + radius * Math . Cos ( r * phi ) ) ,
698- ( float ) ( radial * Math . Sin ( s * theta ) )
699- ) ;
700- norms [ vi ] . Set (
701- ( float ) Math . Cos ( s * theta ) ,
702- ( float ) Math . Cos ( r * phi ) ,
703- ( float ) Math . Sin ( s * theta )
704- ) ;
705- norms [ vi ++ ] . Normalize ( ) ;
706-
707- // mirror top-cap verts for bottom cap
708- verts [ vi ] . Set ( verts [ vi - 1 ] . x , - verts [ vi - 1 ] . y , verts [ vi - 1 ] . z ) ;
709- norms [ vi ] . Set ( norms [ vi - 1 ] . x , - norms [ vi - 1 ] . y , norms [ vi - 1 ] . z ) ;
696+ // Top cap vertex
697+ Vector3 normal = Geometry . PointOnSphere ( 1 , s * horizontalAngle , 90 - r * verticalAngle ) ;
698+ Vector3 vertex = new Vector3 (
699+ x : radius * normal . x ,
700+ y : radius * normal . y + cylinderHeight / 2 ,
701+ z : radius * normal . z ) ;
702+ vertices [ vi ] = vertex ;
703+ normals [ vi ] = normal ;
704+ vi ++ ;
705+
706+ // Bottom cap vertex
707+ vertices [ vi ] . Set ( vertex . x , - vertex . y , vertex . z ) ;
708+ normals [ vi ] . Set ( normal . x , - normal . y , normal . z ) ;
710709 vi ++ ;
711710
712- int top_s1r1 = vi - 2 , top_s1r0 = vi - 4 ;
713- int bot_s1r1 = vi - 1 , bot_s1r0 = vi - 3 ;
714- int top_s0r1 = top_s1r1 - 2 * rings , top_s0r0 = top_s1r0 - 2 * rings ;
715- int bot_s0r1 = bot_s1r1 - 2 * rings , bot_s0r0 = bot_s1r0 - 2 * rings ;
711+ int top_s1r1 = vi - 2 ;
712+ int top_s1r0 = vi - 4 ;
713+ int bot_s1r1 = vi - 1 ;
714+ int bot_s1r0 = vi - 3 ;
715+ int top_s0r1 = top_s1r1 - 2 * rings ;
716+ int top_s0r0 = top_s1r0 - 2 * rings ;
717+ int bot_s0r1 = bot_s1r1 - 2 * rings ;
718+ int bot_s0r0 = bot_s1r0 - 2 * rings ;
716719 if ( s == 0 )
717720 {
718- top_s0r1 += numVerts - 2 ;
719- top_s0r0 += numVerts - 2 ;
720- bot_s0r1 += numVerts - 2 ;
721- bot_s0r0 += numVerts - 2 ;
721+ top_s0r1 += vertexCount - 2 ;
722+ top_s0r0 += vertexCount - 2 ;
723+ bot_s0r1 += vertexCount - 2 ;
724+ bot_s0r0 += vertexCount - 2 ;
722725 }
723726
724- // create cap faces
727+ // Create cap triangles
725728 if ( r == 1 )
726729 {
727- faces [ 3 * fi + 0 ] = topCap ;
728- faces [ 3 * fi + 1 ] = top_s1r1 ;
729- faces [ 3 * fi + 2 ] = top_s0r1 ;
730- fi ++ ;
731-
732- faces [ 3 * fi + 0 ] = botCap ;
733- faces [ 3 * fi + 1 ] = bot_s0r1 ;
734- faces [ 3 * fi + 2 ] = bot_s1r1 ;
735- fi ++ ;
730+ triangles [ 3 * ti + 0 ] = topCapIndex ;
731+ triangles [ 3 * ti + 1 ] = top_s0r1 ;
732+ triangles [ 3 * ti + 2 ] = top_s1r1 ;
733+ ti ++ ;
734+
735+ triangles [ 3 * ti + 0 ] = bottomCapIndex ;
736+ triangles [ 3 * ti + 1 ] = bot_s1r1 ;
737+ triangles [ 3 * ti + 2 ] = bot_s0r1 ;
738+ ti ++ ;
736739 }
737740 else
738741 {
739- faces [ 3 * fi + 0 ] = top_s1r0 ;
740- faces [ 3 * fi + 1 ] = top_s1r1 ;
741- faces [ 3 * fi + 2 ] = top_s0r0 ;
742- fi ++ ;
743-
744- faces [ 3 * fi + 0 ] = top_s0r0 ;
745- faces [ 3 * fi + 1 ] = top_s1r1 ;
746- faces [ 3 * fi + 2 ] = top_s0r1 ;
747- fi ++ ;
748-
749- faces [ 3 * fi + 0 ] = bot_s0r1 ;
750- faces [ 3 * fi + 1 ] = bot_s1r1 ;
751- faces [ 3 * fi + 2 ] = bot_s0r0 ;
752- fi ++ ;
753-
754- faces [ 3 * fi + 0 ] = bot_s0r0 ;
755- faces [ 3 * fi + 1 ] = bot_s1r1 ;
756- faces [ 3 * fi + 2 ] = bot_s1r0 ;
757- fi ++ ;
742+ triangles [ 3 * ti + 0 ] = top_s1r0 ;
743+ triangles [ 3 * ti + 1 ] = top_s0r0 ;
744+ triangles [ 3 * ti + 2 ] = top_s1r1 ;
745+ ti ++ ;
746+
747+ triangles [ 3 * ti + 0 ] = top_s0r0 ;
748+ triangles [ 3 * ti + 1 ] = top_s0r1 ;
749+ triangles [ 3 * ti + 2 ] = top_s1r1 ;
750+ ti ++ ;
751+
752+ triangles [ 3 * ti + 0 ] = bot_s0r1 ;
753+ triangles [ 3 * ti + 1 ] = bot_s0r0 ;
754+ triangles [ 3 * ti + 2 ] = bot_s1r1 ;
755+ ti ++ ;
756+
757+ triangles [ 3 * ti + 0 ] = bot_s0r0 ;
758+ triangles [ 3 * ti + 1 ] = bot_s1r0 ;
759+ triangles [ 3 * ti + 2 ] = bot_s1r1 ;
760+ ti ++ ;
758761 }
759762 }
760763
761- // create long sides
762- int top_s1 = vi - 2 , top_s0 = top_s1 - 2 * rings ;
763- int bot_s1 = vi - 1 , bot_s0 = bot_s1 - 2 * rings ;
764+ // Create side triangles
765+ int top_s1 = vi - 2 ;
766+ int top_s0 = top_s1 - 2 * rings ;
767+ int bot_s1 = vi - 1 ;
768+ int bot_s0 = bot_s1 - 2 * rings ;
764769 if ( s == 0 )
765770 {
766- top_s0 += numVerts - 2 ;
767- bot_s0 += numVerts - 2 ;
771+ top_s0 += vertexCount - 2 ;
772+ bot_s0 += vertexCount - 2 ;
768773 }
769774
770- faces [ 3 * fi + 0 ] = top_s0 ;
771- faces [ 3 * fi + 1 ] = top_s1 ;
772- faces [ 3 * fi + 2 ] = bot_s1 ;
773- fi ++ ;
775+ triangles [ 3 * ti + 0 ] = top_s0 ;
776+ triangles [ 3 * ti + 1 ] = bot_s1 ;
777+ triangles [ 3 * ti + 2 ] = top_s1 ;
778+ ti ++ ;
774779
775- faces [ 3 * fi + 0 ] = bot_s0 ;
776- faces [ 3 * fi + 1 ] = top_s0 ;
777- faces [ 3 * fi + 2 ] = bot_s1 ;
778- fi ++ ;
780+ triangles [ 3 * ti + 0 ] = bot_s0 ;
781+ triangles [ 3 * ti + 1 ] = bot_s1 ;
782+ triangles [ 3 * ti + 2 ] = top_s0 ;
783+ ti ++ ;
779784 }
780785
781- return new MeshDraft ( )
786+ return new MeshDraft
782787 {
783788 name = "Capsule" ,
784- vertices = new List < Vector3 > ( verts ) ,
785- triangles = new List < int > ( faces ) ,
786- normals = new List < Vector3 > ( norms )
789+ vertices = new List < Vector3 > ( vertices ) ,
790+ triangles = new List < int > ( triangles ) ,
791+ normals = new List < Vector3 > ( normals )
787792 } ;
788793 }
789- }
790- }
794+ }
795+ }
0 commit comments