【Qt+Box2d】绘图时, Qt与Box2d之间的差异(数据&图形同步)
本人制作中总结,原创,转发请附上连接。
在Qt中,为了将Box2d的物理模拟过程可视化, 需要做Box2d=>Qt的转换。以下分析: 在绘图时, Qt和Box2d之间的差异。
区别1:【坐标系】

需要进行一下转换:
1, Y 坐标反向 : y = -y
2, 旋转反向: angle = -angle (观察从x轴 到 y轴的方向,看图中橘黄色的线,Qt是顺时针的, Box2d是逆时针的)
(若想在Qt中,逆时针旋转30度角,那么应调用setRotation(-30))
区别2:【旋转单位】
Qt: 使用“角度”(degree)
Box2d: 使用“弧度”(radian)
弧度转角度:degree = (radian * 180.0f) / pi
(附: 加上因坐标系区别,旋转需要反向,最终公式为: qt_degree = ( (-box2d_radian * 180.0f) / b2_pi)
区别3:【原点】
Qt: “原点”为图素的左上角
Box2D: “原点”为图素的中心点
2者旋转时,都是以“原点”为轴旋转的。因此需要将Qt的原点更改为图素中心。
QGraphicsItem::setTransformOriginPoint ( 宽/2, 高/2 );
特别注意:更改Qt原点后,并未对图素的位置有影响。换句话说: 如果一个宽高分别为(100, 100)的矩形, 现将(50, 50)设为“原点”,把它QGraphicsItem::setPos(0, 0), 结果是:矩形左上角位于坐标系的(0, 0)点【左图】, 而非想象中的:矩形中心位于坐标系的(0, 0)点【右图】。

因此在绘制时,需要将图向左上移动:宽/2 , 高/2。
QGraphicsItem::setPos(x – width/2.0f, y - height/2.0f);
以上差异都解决后,图形就可以和数据一致了。

浙公网安备 33010602011771号