Skip to content

Commit e67eef1

Browse files
MeshDraft.Capsule: Fixed normals, changed parameters, renamed some of the variables
1 parent 8dcf7f5 commit e67eef1

File tree

3 files changed

+113
-108
lines changed

3 files changed

+113
-108
lines changed

Examples/Primitives/Capsule.cs

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,17 @@
22

33
namespace ProceduralToolkit.Examples.Primitives
44
{
5-
[RequireComponent(typeof(MeshRenderer), typeof(MeshFilter))]
6-
public class Capsule : MonoBehaviour
7-
{
8-
public float height = 1f;
9-
public float radius = 1f;
10-
public int segments = 12;
11-
public int rings = 8;
5+
[RequireComponent(typeof(MeshRenderer), typeof(MeshFilter))]
6+
public class Capsule : MonoBehaviour
7+
{
8+
public float height = 2;
9+
public float radius = 0.5f;
10+
public int segments = 32;
11+
public int rings = 8;
1212

13-
private void Start()
14-
{
15-
GetComponent<MeshFilter>().mesh = MeshDraft.Capsule(height, radius, segments, rings).ToMesh();
16-
}
17-
}
18-
}
13+
private void Start()
14+
{
15+
GetComponent<MeshFilter>().mesh = MeshDraft.Capsule(height, radius, segments, rings).ToMesh();
16+
}
17+
}
18+
}

Examples/Primitives/Primitives.unity

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -443,9 +443,9 @@ MonoBehaviour:
443443
m_Script: {fileID: 11500000, guid: c60ce91736c38434b83205ec0ffecde8, type: 3}
444444
m_Name:
445445
m_EditorClassIdentifier:
446-
height: 1
447-
radius: 0.4
448-
segments: 12
446+
height: 2
447+
radius: 0.5
448+
segments: 32
449449
rings: 8
450450
--- !u!33 &248611936
451451
MeshFilter:

Scripts/MeshDraftPrimitives.cs

Lines changed: 97 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)