65 lines
1.7 KiB
GDScript
65 lines
1.7 KiB
GDScript
extends MeshInstance3D
|
|
|
|
var rings = 50
|
|
var radial_segments = 50
|
|
var radius = 1
|
|
|
|
func _ready():
|
|
var surface_array = []
|
|
surface_array.resize(Mesh.ARRAY_MAX)
|
|
|
|
# PackedVector**Arrays for mesh construction.
|
|
var verts = PackedVector3Array()
|
|
var uvs = PackedVector2Array()
|
|
var normals = PackedVector3Array()
|
|
var indices = PackedInt32Array()
|
|
|
|
#######################################
|
|
# Vertex indices.
|
|
var thisrow = 0
|
|
var prevrow = 0
|
|
var point = 0
|
|
|
|
# Loop over rings.
|
|
for i in range(rings + 1):
|
|
var v = float(i) / rings
|
|
var w = sin(PI * v)
|
|
var y = cos(PI * v)
|
|
|
|
# Loop over segments in ring.
|
|
for j in range(radial_segments + 1):
|
|
var u = float(j) / radial_segments
|
|
var x = sin(u * PI * 2.0)
|
|
var z = cos(u * PI * 2.0)
|
|
var vert = Vector3(x * radius * w, y * radius, z * radius * w)
|
|
verts.append(vert)
|
|
normals.append(vert.normalized())
|
|
uvs.append(Vector2(u, v))
|
|
point += 1
|
|
|
|
# Create triangles in ring using indices.
|
|
if i > 0 and j > 0:
|
|
indices.append(prevrow + j - 1)
|
|
indices.append(prevrow + j)
|
|
indices.append(thisrow + j - 1)
|
|
|
|
indices.append(prevrow + j)
|
|
indices.append(thisrow + j)
|
|
indices.append(thisrow + j - 1)
|
|
|
|
prevrow = thisrow
|
|
thisrow = point
|
|
#######################################
|
|
|
|
# Assign arrays to surface array.
|
|
surface_array[Mesh.ARRAY_VERTEX] = verts
|
|
surface_array[Mesh.ARRAY_TEX_UV] = uvs
|
|
surface_array[Mesh.ARRAY_NORMAL] = normals
|
|
surface_array[Mesh.ARRAY_INDEX] = indices
|
|
|
|
# Create mesh surface from mesh array.
|
|
# No blendshapes, lods, or compression used.
|
|
mesh.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLES, surface_array)
|
|
|
|
ResourceSaver.save(mesh, "res://experiments/sphere.tres", ResourceSaver.FLAG_COMPRESS)
|