如何为开启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
相关产品推荐
相关产品推荐

