Godot:如何通过GDScript在网格表面添加文本?
在Godot网格表面添加文本的GDScript实现方法
方法1:使用TextMesh3D(Godot 4.x 推荐)
这是最简便的原生方案,直接创建3D文本对象,通过脚本将其贴合到网格表面:
- 获取网格表面的目标位置(可通过射线检测点击网格,或直接指定顶点坐标)
- 创建
TextMesh3D节点并设置文本属性 - 将文本节点移动到目标位置,调整朝向使其贴合网格
示例代码:
# 传入网格表面目标位置、法线和文本内容 func add_text_to_mesh(target_pos: Vector3, normal: Vector3, text: String): var text_mesh = TextMesh3D.new() text_mesh.text = text text_mesh.font_size = 0.5 text_mesh.color = Color(1, 0, 0) # 设置文本颜色 add_child(text_mesh) # 偏移位置避免穿透,让文本面向法线方向 text_mesh.global_position = target_pos + normal * 0.01 text_mesh.look_at(target_pos + normal, Vector3.UP)
如果需要通过点击自动获取网格表面点,可配合射线检测:
func _input(event: InputEvent): if event is InputEventMouseButton and event.pressed and event.button_index == MOUSE_BUTTON_LEFT: var ray = get_viewport().get_camera_3d().project_ray(event.position) var space_state = get_world_3d().direct_space_state var result = space_state.intersect_ray(RayCast3D.create_ray(ray.origin, ray.direction * 100)) if result: var target_pos = result["position"] var normal = result["normal"] add_text_to_mesh(target_pos, normal, "Hello Mesh!")
方法2:将文本渲染为纹理贴到网格
适合批量或静态文本场景,通过Label渲染文本为纹理,再赋值给网格材质:
示例代码:
# 生成文本纹理 func create_texture_text(text: String, texture_size: Vector2 = Vector2(512, 128)) -> Texture2D: var label = Label.new() label.text = text label.custom_minimum_size = texture_size label.add_theme_color_override("font_color", Color(1, 1, 1)) label.add_theme_font_size_override("font_size", 64) var texture = RenderTexture2D.new() texture.size = texture_size texture.render_target_clear_color = Color(0, 0, 0, 0) # 透明背景 texture.draw(label) label.queue_free() return texture # 给网格应用文本纹理 func apply_text_to_mesh(mesh_instance: MeshInstance3D, text: String): var text_texture = create_texture_text(text) var material = StandardMaterial3D.new() material.albedo_texture = text_texture material.transparency = BaseMaterial3D.TRANSPARENCY_ALPHA # 启用透明 mesh_instance.material_override = material
适配外部导入网格
从Blender等软件导入的网格,上述两种方法同样适用:
- 使用
TextMesh3D时,确保导入的网格添加了碰撞体(如CollisionShape3D),保证射线检测能命中 - 使用纹理贴图时,直接替换导入网格的材质即可,无需额外调整
注意事项:
TextMesh3D仅支持Godot 4.x及以上版本,3.x版本可优先选择纹理贴图方案- 射线检测需要网格绑定碰撞形状,否则无法获取表面位置和法线
内容的提问来源于stack exchange,提问作者Loma Harshana
相关产品推荐
相关产品推荐

