Líneas con ImmediateMesh

Una malla limpiada y reconstruida vértice a vértice cada fotograma, con una tira de líneas y una superficie de líneas.

El editor de arriba está ejecutando este proyecto. Cambia una línea y se recarga.

Clases de Godot usadas

ImmediateMeshMeshInstance3DStandardMaterial3D

El código

scripts/main.gd
extends Node

const POINTS: int = 460
const SPOKE_STEP: int = 12
const FLOOR: float = -3.2

var mesh: ImmediateMesh
var elapsed: float = 0.0


func _ready() -> void:
	_add_environment()

	mesh = ImmediateMesh.new()

	var instance: MeshInstance3D = MeshInstance3D.new()
	instance.mesh = mesh
	instance.material_override = _make_material()
	add_child(instance)

	var camera: Camera3D = Camera3D.new()
	camera.position = Vector3(0, 1.5, 7.4)
	add_child(camera)
	camera.look_at(Vector3.ZERO, Vector3.UP)
	camera.current = true

	print('the curve is rebuilt vertex by vertex every frame, nothing is cached')


func _process(delta: float) -> void:
	elapsed += delta
	mesh.clear_surfaces()

	mesh.surface_begin(Mesh.PRIMITIVE_LINE_STRIP)

	for i in POINTS + 1:
		var point: Vector3 = _curve(TAU * i / POINTS)
		mesh.surface_set_color(Color('#8da5f3').lerp(Color('#8eef97'), sin(TAU * i / POINTS + elapsed) * 0.5 + 0.5))
		mesh.surface_add_vertex(point)

	mesh.surface_end()

	mesh.surface_begin(Mesh.PRIMITIVE_LINES)

	for i in range(0, POINTS, SPOKE_STEP):
		var point: Vector3 = _curve(TAU * i / POINTS)
		mesh.surface_set_color(Color('#f3d48d'))
		mesh.surface_add_vertex(point)
		mesh.surface_set_color(Color('#12141a'))
		mesh.surface_add_vertex(Vector3(point.x, FLOOR, point.z))

	mesh.surface_end()


func _curve(t: float) -> Vector3:
	return Vector3(
		sin(t * 3.0 + elapsed * 0.4) * 3.2,
		sin(t * 4.0 + elapsed * 0.7) * 1.9,
		cos(t * 2.0 + elapsed * 0.3) * 3.2
	)


func _make_material() -> StandardMaterial3D:
	var material: StandardMaterial3D = StandardMaterial3D.new()
	material.shading_mode = BaseMaterial3D.SHADING_MODE_UNSHADED
	material.vertex_color_use_as_albedo = true

	return material


func _add_environment() -> void:
	var env: Environment = Environment.new()
	env.background_mode = Environment.BG_COLOR
	env.background_color = Color('#12141a')
	env.ambient_light_source = Environment.AMBIENT_SOURCE_COLOR
	env.ambient_light_color = Color('#2a2f3d')

	var world: WorldEnvironment = WorldEnvironment.new()
	world.environment = env
	add_child(world)

Más ejemplos de Procedural