|
public static MeshDraft Cylinder(float radius, int segments, float height, bool generateUV = true) |
|
{ |
|
float segmentAngle = 360f/segments; |
|
float currentAngle = 0; |
|
Vector3 halfHeightUp = Vector3.up*height/2; |
|
|
|
var draft = new MeshDraft {name = "Cylinder"}; |
|
var lowerRing = new List<Vector3>(segments); |
|
var lowerDiskUV = new List<Vector2>(); |
|
var upperRing = new List<Vector3>(segments); |
|
var upperDiskUV = new List<Vector2>(); |
|
var strip = new List<Vector3>(); |
|
var stripNormals = new List<Vector3>(); |
|
var stripUV = new List<Vector2>(); |
|
for (var i = 0; i < segments; i++) |
|
{ |
|
AddCylinderPoints(radius, currentAngle, halfHeightUp, generateUV, |
|
ref strip, ref stripUV, ref stripNormals, out Vector3 lowerVertex, out Vector3 upperVertex); |
|
|
|
lowerRing.Add(lowerVertex); |
|
upperRing.Add(upperVertex); |
|
if (generateUV) |
|
{ |
|
Vector2 uv = Geometry.PointOnCircle2(0.5f, currentAngle) + new Vector2(0.5f, 0.5f); |
|
upperDiskUV.Add(uv); |
|
uv.x = 1 - uv.x; |
|
lowerDiskUV.Add(uv); |
|
} |
|
currentAngle += segmentAngle; |
|
} |
|
|
|
AddCylinderPoints(radius, currentAngle, halfHeightUp, generateUV, |
|
ref strip, ref stripUV, ref stripNormals, out _, out _); |
|
|
|
if (generateUV) |
|
{ |
|
draft.AddTriangleFan(lowerRing, Vector3.down, lowerDiskUV, true); |
|
draft.AddTriangleFan(upperRing, Vector3.up, upperDiskUV); |
|
draft.AddTriangleStrip(strip, stripNormals, stripUV); |
|
} |
|
else |
|
{ |
|
draft.AddTriangleFan(lowerRing, Vector3.down, true); |
|
draft.AddTriangleFan(upperRing, Vector3.up); |
|
draft.AddTriangleStrip(strip, stripNormals); |
|
} |
|
return draft; |
|
} |
Prism (on the right) should have the same uvmap as Cylinder (on the left).

ProceduralToolkit/Runtime/MeshDraftPrimitives.cs
Lines 322 to 362 in 5c0ffba
ProceduralToolkit/Runtime/MeshDraftPrimitives.cs
Lines 367 to 414 in 5c0ffba