我在c++中使用了c++引擎,我允许一些图像在屏幕上自由浮动。游走,但他们也旋转(自旋)无休止地围绕着他们的质量中心-就像他们在太空。
偶尔,会设置一个触发器,我想要承担旋转的命令,使其停止。另外,我不想立即这样做,而是继续旋转,直到图像处于直立的位置。
这是一个陷阱,box2d物理引擎跟踪旋转的总旋转距离。也就是说,如果图像(例如)旋转了5次,getRotation()成员函数将返回10*pi < value < 12*pi之间的值(以rads表示),而不是0 < value < 2*pi之间的值。
然而,我不想解除所有记录的旋转,只是停留在最近的2*PI倍数。因此,一些modulus (%)操作应该是有序的。我不能使用%,因为这个除法的分母应该是pi (即不是整数)。我查看了fmodf,但没有得到预期的结果:
if(( abs( fmodf(box2dObj.getRotation() , 2*pi) ) == 0 ) ||
( abs( box2dObj.getRotation() < STEP ) )
box2dObj.setRotation( 0 ) ; //remain at 0
else if ( fmodf(box2dObj.getRotation() , pi) ) > 0 )
box2dObj.setRotation( --box2dObj.getRotation() ) ; //decrease towards 0 if 0 < x < pi
else if ( fmodf(box2dObj.getRotation() , pi) ) < 0 )
box2dObj.setRotation( ++box2dObj.getRotation() ) ; //increase towards 0 if pi < x < 2*piSTEP定义为增量/递减步骤大小。这里是一个步骤(但我尝试了更小的增量/减少步长,而不仅仅是默认为1步的++和-- )。
即使图像不是直立的时候也会变成零。
当旋转在2*pi的倍数时,我能做些什么?
发布于 2014-03-14 23:00:22
首先,您可能是指abs( box2dObj.getRotation() ) < STEP而不是abs( box2dObj.getRotation() < STEP ),因为取一个bool的绝对值是没有意义的。在目前的形式中,所有负旋转的条件都是正确的。
其次,将浮点值与相等值:abs( fmodf(box2dObj.getRotation() , 2*pi) ) == 0 )进行比较。这不太好,因为浮点值不精确,而且它们的操作有数值错误。++box2dObj.getRotation()可能永远(不可能在很多迭代中)达到精确或甚至接近0的值(mod 2*pi)。
第三,对于fmod(r, pi) == 0 && fmod(r, 2*pi) != 0 && r > STEP情况没有条件,其中r是旋转。在这种情况下,物体不会进一步旋转,也不会被竖直设置。除非STEP只是pi的一小部分,否则这种情况不太可能发生。
另外,在我看来,1弧度对于STEP来说是一个很大的价值,但适合你自己。
您可能想要的是(我还没有测试这段代码):
if( fmod(abs(box2dObj.getRotation()), 2*pi) < STEP )
box2dObj.setRotation( 0 )
else if( box2dObj.getRotation() > 0 )
box2dObj.setRotation( box2dObj.getRotation() + STEP );
else
box2dObj.setRotation( box2dObj.getRotation() - STEP );这段代码应该测试一个对象是否有一个旋转,这个旋转最多是一个STEP,而不是完全旋转,在这种情况下,它将其设置为零。否则,代码假设具有正旋转的对象正向旋转,反之亦然。
当旋转倍数为2*pi时,我能做些什么?
你离我很近。正如您从我的代码中看到的那样,我更喜欢在fmod之前取绝对值。这是因为模块化操作可以有三种不同的方式来表现负值(截断、泛泛和欧几里德),我发现很难记住在哪种标准/平台中使用哪种方法。
然后是平等问题。您绝不能测试浮点数值是否相等(例外情况除外)。相反,如果您想知道某个值(在本例中为fmod(abs(box2dObj.getRotation(), 2*pi) )是否接近于零,则必须测试该值是否在某个误差范围内。由于值的变化总是不小于STEP,因此它是错误裕度的适当选择。这可以确保物体在没有被测试捕捉到的情况下不能在直立位置上旋转。在另一些情况下,您可能希望使用更小的裕度来测试相等性,但是很少正确地根据确切的值进行测试,而不会出现一些错误。
https://stackoverflow.com/questions/22401839
复制相似问题