【问题标题】:How do I reset a Box2d RevoluteJoint to its original state properly?如何正确地将 Box2d RevoluteJoint 重置为其原始状态?
【发布时间】:2022-09-24 00:18:53
【问题描述】:

我有一个静态体 (B) 和动态体 (A) 通过 RevoluteJoint (j) 连接的世界。在模拟运行多个帧后,我通过以下方式重置身体和关节:

    private void reset(){
        //PPM = 32
        A.setTransform(30 / PPM, 30 / PPM, 0); //Putting the bodies back to their original positions and rotations
        B.setTransform(50 / PPM, 20 / PPM, 0);

        A.setAngularVelocity(0);//Reset Angular Velocity
        B.setAngularVelocity(0);

        A.setLinearVelocity(0, 0);//Reset Linear Velocity
        B.setLinearVelocity(0, 0);

        j.setMotorSpeed(10);//Set motor speed
        j.setMaxMotorTorque(1);//Set maximum torque
    }

我在每次重置后的每一帧中记录关节的jointAngle(),并且每次模拟循环时值都略有不同。例如:

Frame Loop 1 Loop 2 Loop 3
0 Angle: 0.0 Angle: 0.046254314 Angle: 0.046254314
1 Angle: 0.046254348 Angle: 0.13844918 Angle: 0.13844918
2 Angle: 0.1384492 Angle: 0.27575454 Angle: 0.27575454
3 Angle: 0.2757546 Angle: 0.45236742 Angle: 0.45236757

我认为每次重置后都会保留关节的一些值。但我不完全确定它是否与关节的 getMotorTorque() 值有关。它似乎也不是随机的,因为我不认为 box2d 使用随机数进行计算。

经过一段时间的挖掘,我找到了similar question。然而,它似乎没有回答我遇到的同样的问题。 那么,有什么方法可以 100% 准确地完全重置关节(和身体),而不会在每次循环后破坏和重新创建它们?

    标签: libgdx box2d reset revolute-joints


    【解决方案1】:

    我不确切知道你的问题是什么,但我可以给你一些可能对你有帮助的提示。

    1.试试这个

    A.setTransform(0, 0, 0);
    b.setTransform(0, 0, 0);
    A.setTransform(30/PPM, 30/PPM, 0);
    b.setTransform(50/PPM, 20/PPM, 0);
    

    代替

    A.setTransform(30/PPM, 30/PPM, 0);
    b.setTransform(50/PPM, 20/PPM, 0);
    

    这样,您首先设置所需的角度 (0),然后设置所需的位置 (30/PPM、30/PPM)。如果尝试同时设置角度和位置,可能不行(我个人遇到过)

    1. 尝试关闭连杆电机,看看问题是否仍然存在

    2. 尝试完全禁用连接(j.setActive(false) 或类似的东西)(这将帮助您了解问题是否与连接有关)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-05
      相关资源
      最近更新 更多