对刚体角度设置的唯一函数是
SetTransform
然而,这个函数不会对传入的角度作任何处理,因此,如果你试图设置一个角度,并应用一个revoluteJoint时,可能会出现问题。
我在实践中碰到的问题是,我通过其他方式计算出了当前角度,将角度设上,按照设想,刚体应该做一个小角度的摆动,没想到它摆动了一周之后才回到终点,也就是说多摆动了1周。
之后我通过打log,发现问题出在jointAngle上。当判断upper和lower角度限制时,revoluteJoint计算了当前角度
aB - aA - referenceAngle
而这个角度计算出来的是-6.3,难怪旋转了一周。
于是我顺藤摸瓜,发现最初设置角度时,使用的是SetTransform,而这个函数并未对传入的角度做修正。因此,这个步骤需要自己做。
怎么做才合适呢?如下是我现在使用的办法:
b2Rot rot = b2Rot(angle);
angle = rot.GetAngle();
这个函数将调用std::atan2来计算出在一个固定区间内的角度。只要在SetTransform设置角度前确保了角度在0-2pi 或者-pi-pi内,就不会有问题了