Coincident - Pac man creation ? :-)

Just continuation of making circle, keep adding to it different things with help of forum, and this is came back as I tried to add indices :slight_smile:

code @normalized

extends MeshInstance3D

func _ready() -> void:
	var surface_array = []
	surface_array.resize(Mesh.ARRAY_MAX)
	var my_vertices = PackedVector3Array()
	var my_uvs = PackedVector2Array()
	var my_normals = PackedVector3Array()
	var my_indices = PackedInt32Array()
	
	var current_indices_iteration = 0
	
	var point := Vector3.RIGHT
	var steps := 32
	var angle_step := TAU / steps
	for i in steps:
		my_vertices.append(point)
		point = point.rotated(Vector3.UP, angle_step)
		my_uvs.append(Vector2(0,0))
		my_normals.append(Vector3.UP)
	my_vertices.append(my_vertices.get(0) + my_vertices.get(steps/2)) 
	my_uvs.append(Vector2(0,0))
	my_normals.append(Vector3.UP)
	
	for n in steps:
		var a = steps
		var b = 1
		var c = 2
		my_indices.append(a)
		my_indices.append(c +current_indices_iteration)
		my_indices.append(b +current_indices_iteration)
		current_indices_iteration += 1
	
	surface_array[Mesh.ARRAY_VERTEX] = my_vertices
	surface_array[Mesh.ARRAY_TEX_UV] = my_uvs
	surface_array[Mesh.ARRAY_NORMAL] = my_normals
	surface_array[Mesh.ARRAY_INDEX] = my_indices
	  
	mesh.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLES, surface_array)

You need one more step :slight_smile:

actually it was change a = steps to a = 0

You can do it in one loop:

extends MeshInstance3D

func _ready():
	mesh = ArrayMesh.new()
	var arrays := []
	arrays.resize(Mesh.ARRAY_MAX)
	arrays[Mesh.ARRAY_VERTEX] = PackedVector3Array()
	arrays[Mesh.ARRAY_INDEX] = PackedInt32Array()
	
	var steps := 32
	var angle_step := TAU / steps
	arrays[Mesh.ARRAY_VERTEX].push_back(Vector3.ZERO)
	for i in steps + 1:
		arrays[Mesh.ARRAY_VERTEX].push_back(Vector3.RIGHT.rotated(Vector3.UP, angle_step * i))
		arrays[Mesh.ARRAY_INDEX].append_array([0, i, i+1])

	mesh.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLES, arrays)
1 Like

I see that looks a cool - way less lines
, how about UV and normals ? if I want add like random colors to make it a bit of challenge ?
{ reversing it back to shaded )

For this type of color treatment you don’t really need shading. You can use vertex color array and set the material to use vertex colors as albedo.

1 Like
extends MeshInstance3D

func _ready():
	mesh = ArrayMesh.new()
	var arrays := []
	arrays.resize(Mesh.ARRAY_MAX)
	arrays[Mesh.ARRAY_VERTEX] = PackedVector3Array()
	arrays[Mesh.ARRAY_COLOR] = PackedColorArray()
	
	var steps := 16
	var angle_step := TAU / steps
	for i in steps + 1:
		arrays[Mesh.ARRAY_VERTEX].push_back(Vector3.ZERO)
		arrays[Mesh.ARRAY_VERTEX].push_back(Vector3.RIGHT.rotated(Vector3.UP, angle_step * i))
		arrays[Mesh.ARRAY_VERTEX].push_back(Vector3.RIGHT.rotated(Vector3.UP, angle_step * (i + 1)))
		var color := Color.from_hsv(randf(), 0.8, randf())
		arrays[Mesh.ARRAY_COLOR].append_array([color, color, color])

	mesh.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLES, arrays)

I’m leaving the gaps implementation to you :wink:

1 Like


is this correct thing I’m looking at ?
I know how to set vertex to use as albedo , but never used array of colors
,

wow you just posted it :slight_smile:

if you check it with "Overide in-game Camera " you notice clipping .

So print size of array with color return

print(arrays[Mesh.ARRAY_COLOR].size())

on steps 8 - 27 ( 27/3 = 9 ) so one is overlaps

Great! You debugged it :smiley:

2 Likes

easy fix :slight_smile:

12 -

for i in steps:


this was results in other code , god know what I changed there to get this :slight_smile:


this was my attempt

extends MeshInstance3D

func _ready() -> void:
	var surface_array = []
	surface_array.resize(Mesh.ARRAY_MAX)
	var my_vertices = PackedVector3Array()
	var my_uvs = PackedVector2Array()
	var my_normals = PackedVector3Array()
	var my_indices = PackedInt32Array()
	var my_colors = PackedColorArray()
	
	var current_indices_iteration = 0
	
	var point := Vector3.RIGHT
	var steps := 32
	var angle_step := TAU / steps
	for i in steps:
		my_vertices.append(point)
		point = point.rotated(Vector3.UP, angle_step)
		my_uvs.append(Vector2(0,0))
		my_normals.append(Vector3.UP)
		var color := Color.from_hsv(randf(), 0.8, randf())
		my_colors.append(color)
	my_vertices.append(my_vertices.get(0) + my_vertices.get(steps/2)) 
	my_uvs.append(Vector2(0,0))
	my_normals.append(Vector3.UP)
	var color := Color.from_hsv(randf(), 0.8, randf())
	my_colors.append(color)
	
	for n in steps:
		var a = 0
		var b = 1
		var c = 2
		my_indices.append(a)
		my_indices.append(c +current_indices_iteration)
		my_indices.append(b +current_indices_iteration)
		current_indices_iteration += 1
	
	surface_array[Mesh.ARRAY_VERTEX] = my_vertices
	surface_array[Mesh.ARRAY_TEX_UV] = my_uvs
	surface_array[Mesh.ARRAY_NORMAL] = my_normals
	surface_array[Mesh.ARRAY_INDEX] = my_indices
	surface_array[Mesh.ARRAY_COLOR] = my_colors
	  
	mesh.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLES, surface_array)
	print(my_colors)

2 Likes

@normalized thanks a lot with help and guidance on this topic :+1:

Once I’m back on PC will try figure out what’s wrong in code ( the long version )

And tym aiming to so this shape of overlaping circles to create to flower patterns inside crossing centre .

It’s basically r applied around circle as origin for new circle , will be interesting to figure out this simple geometry .

Ok gaps implemented maybe a bit obscure condition but it’s working

  • purpose was occupy two vertices with same color instead of two random
extends MeshInstance3D

func _ready():
	var arrays := []
	arrays.resize(Mesh.ARRAY_MAX)
	arrays[Mesh.ARRAY_VERTEX] = PackedVector3Array()
	arrays[Mesh.ARRAY_COLOR] = PackedColorArray()
	
	var steps := 16
	var angle_step := TAU / steps
	for i in steps:
		arrays[Mesh.ARRAY_VERTEX].push_back(Vector3.ZERO)
		arrays[Mesh.ARRAY_VERTEX].push_back(Vector3.LEFT.rotated(Vector3.UP, angle_step * i))
		arrays[Mesh.ARRAY_VERTEX].push_back(Vector3.LEFT.rotated(Vector3.UP, angle_step * (i + 1)))
		if i%3 == 0:
			var color := Color.WHITE
			arrays[Mesh.ARRAY_COLOR].append_array([color, color, color])
		elif i%2 == 0: 
			var color := Color.from_hsv(randf(), 0.8, randf())
			arrays[Mesh.ARRAY_COLOR].append_array([color, color, color])
			arrays[Mesh.ARRAY_COLOR].append_array([color, color, color])
		elif  i%1 == 0 and i%3 != 0:
			pass

	mesh.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLES, arrays)


with steps 18 it looks a even as multiplier or 3

1 Like