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

如何实现带旋转的Vector3插值行走?Roblox转Godot代码求助

解决Godot中武器行走偏移无效果的问题

首先梳理原Roblox Luau代码和你当前GDScript的核心差异,以及问题所在:

核心错误点

  1. 变换类型不匹配:Roblox的CFrame是包含旋转+位移的完整变换,而你用Godot的Basis(仅旋转)和Vector3(仅位移)直接相乘,这是向量旋转操作,不是组合变换,完全不符合原代码逻辑。
  2. tick未正确更新:原代码中tick每帧累加deltaTime驱动动画,若你的代码中tick没有持续更新,sin函数的参数固定,自然不会产生动态偏移。
  3. 变换应用方式错误:你将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 23:17:15