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

在Godot的_physics_process中模拟摆运动出现异常下坠问题求助

Godot中KinematicBody2D摆运动异常下坠的修复方案(基于_physics_process)

问题根源

你已经排查出核心问题:逐帧施加切向力时,帧间位置偏移会不断累积,加上重力持续作用,导致摆无法维持固定摆长,最终出现下坠。原代码的坐标变换式速度修正没有从根源上约束摆长,也没有正确分离切向/法向的速度分量。

修复思路

要保留KinematicBody2D的环境交互能力,同时模拟正确的摆运动,核心是每帧强制约束摆长,并只在切向施加重力分力:

  • 计算当前物体到枢轴的实际距离,若超过设定摆长,将物体拉回摆长位置,并保留切向速度分量
  • 仅在摆的切线方向施加重力的分力,避免法向的无效加速度
  • 最后通过move_and_slide处理碰撞,维持环境交互能力

修复后代码

extends KinematicBody2D

# 摆的参数
var gravity_speed: float = 980.0  # 恢复正常重力值,方便测试
var rod_length: float = 200.0     # 固定摆长,根据你的杆长度设置

var velocity: Vector2 = Vector2.ZERO  # 改用velocity命名更清晰
onready var rod: Line2D = $rod
onready var pivot_global: Vector2 = to_global(rod.points[1])  # 枢轴全局坐标

func _physics_process(delta: float) -> void:
    # 1. 计算物体到枢轴的向量与距离
    var to_pivot: Vector2 = pivot_global - global_position
    var current_length: float = to_pivot.length()

    # 2. 约束摆长:如果当前距离超过设定长度,拉回并修正速度
    if current_length > rod_length + 0.1:  # 加小阈值避免抖动
        # 将位置拉回摆长位置
        global_position = pivot_global - to_pivot.normalized() * rod_length
        # 保留切向速度(法向速度清零,因为摆不能拉伸)
        var tangent_dir: Vector2 = Vector2(-to_pivot.y, to_pivot.x).normalized()
        velocity = velocity.project(tangent_dir)

    # 3. 计算切向重力分力
    var theta: float = to_pivot.angle_to(Vector2.DOWN)  # 摆与竖直方向的夹角
    var tangential_accel: float = gravity_speed * sin(theta)
    var tangent_dir: Vector2 = Vector2(-to_pivot.y, to_pivot.x).normalized()  # 切线方向

    # 4. 更新速度并移动
    velocity += tangent_dir * tangential_accel * delta
    velocity = move_and_slide(velocity, Vector2.UP)

    # 5. 更新杆的端点位置
    rod.points[1] = to_local(pivot_global)

关键代码说明

  • 摆长约束:通过global_position直接修正位置,同时将速度投影到切线方向,彻底消除法向的拉伸趋势,避免偏移累积
  • 切向加速度计算:只在摆的切线方向施加重力的分力,符合真实摆的物理规律
  • velocity命名:替换原direction变量名,更符合Godot物理模拟的命名习惯
  • 碰撞处理:保留move_and_slide,确保摆可以和场景中的其他碰撞体交互

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 00:01:30