0

iOSで基本的なbox2dプロジェクトをバウンドするボールで実装しましたが、ボールが実際に地面に着く前にバウンドしているようです。プログレッシブバウンスのたびに、それは底に近づき、最終的には地面に止まるように見えます。私は何が起こるかについてのビデオを撮りました:http://f.cl.ly/items/1S06373Z1l2w1z243E0k/Bounce.m4v

これが私がすべてを設定した場所です:

CGSize screenSize = self.view.bounds.size;

// Define the gravity vector.
b2Vec2 gravity;
gravity.Set(0.0f, -9.81f);

bool doSleep = true;

// Construct a world object, which will hold and simulate the rigid bodies.
world = new b2World(gravity);
world->SetAllowSleeping(doSleep);
world->SetContinuousPhysics(true);

b2BodyDef groundBodyDef;
groundBodyDef.position.Set(0,0);

b2Body *groundBody = world->CreateBody(&groundBodyDef);
b2EdgeShape groundEdge;
b2FixtureDef boxShapeDef;
boxShapeDef.shape = &groundEdge;

//bottom
groundEdge.Set(b2Vec2(0,0), b2Vec2(screenSize.width/PTM_RATIO, 0));
groundBody->CreateFixture(&boxShapeDef);

// left wall
groundEdge.Set(b2Vec2(0,0), b2Vec2(0,screenSize.height/PTM_RATIO));
groundBody->CreateFixture(&boxShapeDef);

// top
groundEdge.Set(b2Vec2(0, screenSize.height/PTM_RATIO),
               b2Vec2(screenSize.width/PTM_RATIO, screenSize.height/PTM_RATIO));
groundBody->CreateFixture(&boxShapeDef);

// right wal
groundEdge.Set(b2Vec2(screenSize.width/PTM_RATIO, screenSize.height/PTM_RATIO),
               b2Vec2(screenSize.width/PTM_RATIO, 0));
groundBody->CreateFixture(&boxShapeDef);

//ball
b2BodyDef ballBodyDef;
ballBodyDef.type = b2_dynamicBody;
ballBodyDef.position.Set(self.ball.position.x/PTM_RATIO, self.ball.position.y/PTM_RATIO);
ballBodyDef.userData =  (__bridge void *)_ball;
body = world->CreateBody(&ballBodyDef);

b2CircleShape circle;
circle.m_radius = 60.0/PTM_RATIO;

b2FixtureDef ballShapeDef;
ballShapeDef.shape = &circle;
ballShapeDef.density = 0.8f;
ballShapeDef.friction = 0.0f;
ballShapeDef.restitution = 0.8f;
body->CreateFixture(&ballShapeDef);

そしてこれは私が位置を更新するために1/60秒ごとに実行するものです

int32 velocityIterations = 8;
int32 positionIterations = 1;

world->Step(1.0f/60.0f, velocityIterations, positionIterations);

CGPoint newCenter = CGPointMake(body->GetPosition().x * PTM_RATIO,
                                self.view.bounds.size.height - body->GetPosition().y * PTM_RATIO);
self.ball.position = newCenter;
4

2 に答える 2

0

ボールボディをダイナミックとして宣言した場合

b2BodyDef ballBodyDef;
ballBodyDef.type = b2_dynamicBody;
// finish creating...

そして、(あなたが行った)重力値で世界を初期化します。ボール本体の位置を手動で設定する必要はまったくありません。すべてのコードを見ることなく、私の勘は、ボールがすでに動的であると宣言しており、手動での位置の更新がbox2dの重力と競合していることです。ビデオは、ボールの位置を人為的にずらしながら、重力によってボールが引き下げられている様子を示しているようです。割り当てている線をself.ball.position完全に削除することをお勧めします。このように物理体の位置を直接設定することは、一般的にはお勧めできません。

于 2013-03-02T15:19:32.677 に答える
0

何が問題なのかがわかりました。画面上のボールは CALayer であり、その位置を変更するときに暗黙的なアニメーションを使用していました。このように位置を設定すると、正常に動作するようになりました

[CATransaction begin];
[CATransaction setDisableActions:YES];
CGPoint newCenter = CGPointMake(body->GetPosition().x * PTM_RATIO,
                                self.view.bounds.size.height - body->GetPosition().y * PTM_RATIO);
self.ball.position = newCenter;
[CATransaction commit];
于 2013-03-02T15:31:32.240 に答える