You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Godot:如何通过GDScript在网格表面添加文本?

在Godot网格表面添加文本的GDScript实现方法

方法1:使用TextMesh3D(Godot 4.x 推荐)

这是最简便的原生方案,直接创建3D文本对象,通过脚本将其贴合到网格表面:

  1. 获取网格表面的目标位置(可通过射线检测点击网格,或直接指定顶点坐标)
  2. 创建TextMesh3D节点并设置文本属性
  3. 将文本节点移动到目标位置,调整朝向使其贴合网格

示例代码:

# 传入网格表面目标位置、法线和文本内容
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 23:06:32