Godot Version
4.4
Question
my mesh generation code is doing weird things
strange triangles
probably the indices
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()
## Insert code here to generate mesh ##
var startPoint = Vector3(0,0,0)
var dimension = Vector2(10,10)
var resolution = 1
for i in range(dimension.y):
for g in range(dimension.x):
var vert = Vector3 (0,0,0)
vert.x = i * resolution + startPoint.x
vert.z = g * resolution + startPoint.z
vert.y = 0
verts.append(vert)
normals.append(vert.normalized())
uvs.append(Vector2(i,g))
if g < dimension.y-2 and i < dimension.x-2:
indices.append(i*g+i)
indices.append(i*g+i+1)
indices.append(i*g+i+2)
# 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 = ArrayMesh.new()
mesh.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLES, surface_array)
What type of mesh is this even supposed to be?
I tried visualizing it on paper a bit and it is probably not supposed to be like it:
yeah i found the problem it was very broken
but I tried to fix it and its still broken
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()
## Insert code here to generate mesh ##
var startPoint = Vector3(0,0,0)
var dimension = Vector2(10,10)
var resolution = 1
for i in range(dimension.y):
for g in range(dimension.x):
var vert = Vector3 (0,0,0)
vert.x = i * resolution + startPoint.x
vert.z = g * resolution + startPoint.z
vert.y = 0
verts.append(vert)
normals.append(vert.normalized())
uvs.append(Vector2(i,g))
if g < dimension.x and i < dimension.y:
indices.append(g*(i+1))
indices.append(g*(i+1)+1)
indices.append(g*(i+1)+dimension.x)
# 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 = ArrayMesh.new()
mesh.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLES, surface_array)
found another problem, tried to fix but failed
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()
## Insert code here to generate mesh ##
var startPoint = Vector3(0,0,0)
var dimension = Vector2(10,10)
var resolution = 1
for i in range(dimension.y):
for g in range(dimension.x):
var vert = Vector3 (0,0,0)
vert.x = i * resolution + startPoint.x
vert.z = g * resolution + startPoint.z
vert.y = 0
verts.append(vert)
normals.append(vert.normalized())
uvs.append(Vector2(i,g))
if g < dimension.x and i < dimension.y:
indices.append(g*i+g)
indices.append(g*i+g+1)
indices.append(g*i+g+dimension.x)
if(g > -1 and i < dimension.y):
indices.append(g*i+g+1)
indices.append(g*i+g+dimension.x)
indices.append(g*i+g+dimension.x-1)
# 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 = ArrayMesh.new()
mesh.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLES, surface_array)
So i made some changes and now it does something but its still very broken
theres a bunch of weird triangles below the main plain
theres also some strange shadows going on
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()
var startPoint = Vector3(0,0,0)
var dimension = Vector2(10,10)
var resolution = 1
for y in range(dimension.y):
for x in range(dimension.x):
var vert = Vector3 (0,0,0)
vert.x = (x-1) * resolution + startPoint.x
vert.z = (y-1) * resolution + startPoint.z
vert.y = 0
verts.append(vert)
normals.append(vert.normalized())
uvs.append(Vector2(x,y))
if x < dimension.x and y < dimension.y:
indices.append(x+y*dimension.x)
indices.append(x+1+y*dimension.x)
indices.append(x+(y+1)*dimension.x)
indices.append(x+1+y*dimension.x)
indices.append(x+1+(y+1)*dimension.x)
indices.append(x+(y+1)*dimension.x)
# 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 = ArrayMesh.new()
mesh.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLES, surface_array)