【发布时间】: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