Box2D改变圆圈所面对的角度而不移动圆圈

时间:2016-01-09 10:11:09

标签: c++ math box2d angle

我正在使用Box2D创建一个简单的游戏,我希望实现这样的目标:

我有一个圆圈,箭头指向它的当前角度。在键盘上单击,角度将增加一个值,圆的角度将根据下面第二张图中的变化而变化。 Initial Circle, where angle of the Circle = 0

圆的初始状态,其中圆的角度= 0.该线指向0度。

Final Circle, where angle of the Circle = 15

这是用户点击键盘后圆圈的下一个状态。圆的角度现在是15度。

为了进行转换,我做了类似的事情:

void MyCirclecle::turnBall(float angle)
{
    body_->SetTransform( body_->GetWorldPoint( b2Vec2(0,0) ), body_->GetAngle() + (angle * b2_pi/180)); 
}

圆圈正在朝正确方向转动,但圆圈同时移动。每次点击,它会略微向上或向右移动,在180度后,它会略微向下或向左移动。最终在360度之后,它将略微位于初始状态之上。我还尝试使用body_->GetWorldCenter()body_->GetPosition()作为SetTransform的第一个参数,但我仍然得到同样的结果。我有什么方法可以做,不移动圆圈但可以改变它所面对的角度?

1 个答案:

答案 0 :(得分:0)

b2Vec2(0, 0)的身体相对位置处更改圆的角度而不是线性移动它是通过实现的MyCircle::turnBall方法完成的:

void MyCirclecle::turnBall(float angle)
{
    body_->SetTransform( body_->GetPosition(), body_->GetAngle() + (angle * b2_pi/180)); 
}

你看到圆圈正如你所描述的那样线性移动,但是暗示圆圈不在b2Vec2(0, 0)的身体相对位置。不知怎的,你的圆圈形状的位置已经远离身体的起源。

至少在Box2D 2.3.2中,b2CircleShape形状的构造函数设置m_p成员变量(通过m_p.SetZero();),使其位于主体的原点。因此,我怀疑您的代码是明确更改了m_p值,或者您正在进行一些内存损坏(正在为您更改它)。

OTOH,如果你真正想要的是一种方法来旋转圆圈的相对偏移(无论可能是什么)从它的身体(所以在圆圈只旋转时移动身体),你需要{{1}方法实现更像这样:

MyCircle::turnBall