如何实现带旋转的Vector3插值行走?Roblox转Godot代码求助
解决Godot中武器行走偏移无效果的问题
首先梳理原Roblox Luau代码和你当前GDScript的核心差异,以及问题所在:
核心错误点
- 变换类型不匹配:Roblox的
CFrame是包含旋转+位移的完整变换,而你用Godot的Basis(仅旋转)和Vector3(仅位移)直接相乘,这是向量旋转操作,不是组合变换,完全不符合原代码逻辑。 - tick未正确更新:原代码中
tick每帧累加deltaTime驱动动画,若你的代码中tick没有持续更新,sin函数的参数固定,自然不会产生动态偏移。 - 变换应用方式错误:你将
WalkingOffset和武器的global_position(向量)相乘,这是向量运算,不是变换组合,正确做法是和transform/global_transform(Transform3D)做矩阵乘法。
修正后的完整代码
初始化变量
var tick := 100000.0 var WalkingOffset := Transform3D.IDENTITY # 对应Roblox的CFrame.new() var my_speed := 16.0 # 对应原代码的totalspeed
每帧更新逻辑(放入_process(delta)或_physics_process(delta))
tick += delta if running: # 计算旋转角度(和原Luau逻辑完全对齐) var rot_x := 0.045 * abs(sin(tick * my_speed * 0.6)) var rot_y := -0.02 * sin(tick * my_speed * 0.6) var rot_z := clamp(pos.x * 15, -0.08, 0.08) # 假设pos是玩家移动相关的向量,和原代码一致 # 计算位移 var offset_pos := Vector3( 0.035 * abs(sin(tick * my_speed * 0.55)), 0.01 * sin(tick * my_speed * 0.6), 0.0 ) # 构造目标变换:旋转+位移,对应原Luau的CFrame.Angles * CFrame.new var target_transform := Transform3D( Basis.from_euler(Vector3(rot_x, rot_y, rot_z)), offset_pos ) # 平滑插值更新偏移 WalkingOffset = WalkingOffset.lerp(target_transform, 0.3) else: # 恢复到无偏移状态 WalkingOffset = WalkingOffset.lerp(Transform3D.IDENTITY, 0.1)
应用到武器
# 假设weapon是你的武器节点(Node3D/MeshInstance3D等) # 局部变换(相对于父节点,推荐用这个,保持和Roblox的层级逻辑一致) weapon.transform = weapon.transform * WalkingOffset # 如果需要用全局变换: # weapon.global_transform = weapon.global_transform * WalkingOffset
额外说明
- 原Luau代码中的
035是笔误,应该是0.035,修正时已调整。 - 如果你需要保留自己代码中
pos.x/1.75的额外偏移,可以在offset_pos.y中添加:0.01 * sin(...) - abs(pos.x/1.75)。 - 确保
running变量正确反映玩家的奔跑状态,否则偏移不会触发。
内容的提问来源于stack exchange,提问作者display
相关产品推荐
相关产品推荐

