【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);

以上差异都解决后,图形就可以和数据一致了。



posted @ 2012-01-10 17:38  TxnLoop  Views(1089)  Comments(0)    收藏  举报