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

如何为开启y-billboard的3D Sprite添加正确3D阴影?

解决Godot 3.0.5.1中3D Sprite广告牌模式的阴影问题

你遇到的核心问题是3D Sprite内置的Y轴广告牌会实时修改Sprite的朝向,导致阴影计算的基准面随相机角度不断变化,进而出现方向混乱和重叠。以下是几个可行的解决思路:

1. 用PlaneMesh自定义广告牌逻辑替代3D Sprite

  • 创建MeshInstance节点,添加PlaneMesh并贴上角色纹理
  • 编写脚本手动实现仅绕Y轴朝向相机的逻辑,替代Sprite内置的广告牌:
extends MeshInstance

func _process(delta):
    # 替换为你的相机节点路径
    var camera = get_node("/root/YourScene/Camera")
    if not camera: return
    # 计算朝向向量,锁定Y轴避免上下旋转
    var look_vector = global_transform.origin - camera.global_transform.origin
    look_vector.y = 0
    # 设置平面朝向相机
    global_transform.basis = Basis(look_vector, Vector3.UP)
  • 给MeshInstance添加碰撞体并开启阴影投射,此时阴影会基于稳定的平面变换计算,不会随相机角度混乱,同时调整平面的Z轴位置或阴影偏移可避免重叠。

2. 调整3D Sprite的阴影参数

  • 在Sprite的属性面板中,找到Shadow设置组:
    • 增大Shadow Offset的Z轴数值,让阴影向远离相机的方向偏移,避免与角色平面重叠
    • 关闭Cast Shadow的Dynamic选项,改用Static(若角色移动不频繁),减少实时计算的偏差
  • 若内置广告牌仍干扰阴影,同样用脚本手动控制Sprite的Y轴旋转,而非依赖内置的y-billboard模式。

3. 用2D阴影模拟3D效果(简易方案)

  • 在角色节点下添加一个2D Sprite作为阴影,设置半透明黑色纹理
  • 编写脚本根据场景中光源的位置,调整阴影的缩放、偏移和旋转:
extends Sprite

export(NodePath) var light_path
export(NodePath) var player_path

func _process(delta):
    var light = get_node(light_path)
    var player = get_node(player_path)
    global_position = player.global_position + Vector2(light.global_position.x - player.global_position.x, light.global_position.z - player.global_position.z) * 0.3
    scale = Vector2(1 - (light.global_position.y / 10), 0.5)
  • 这种方式不受3D相机角度影响,视觉上也能模拟出符合光源方向的阴影效果。

内容的提问来源于stack exchange,提问作者Jellyfish

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 10:25:20