ImmediateMesh 线条
每帧清空并逐顶点重建的网格,包含一条线带和一个线面。
上方的编辑器正在运行这个项目。改一行代码,它就会重新加载。
用到的 Godot 类
ImmediateMeshMeshInstance3DStandardMaterial3D
代码
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)