iOS のことはわかりませんが、b2ContactListener を拡張して PreSolve をオーバーライドすることをお勧めします。
void PreSolve(b2Contact* contact, const b2Manifold* oldManifold);
contact->SetEnabled(false) を設定すると、衝突が発生しますが、影響はありません。衝突が発生したら、以下のようなことができます。
const b2Manifold* マニホールド = contact->GetManifold();
if (manifold->m_pointCount == 0)
{
return;
}
b2Fixture* fixtureA = contact->GetFixtureA();
b2Fixture* fixtureB = contact->GetFixtureB();
b2PointState state1[b2_maxManifoldPoints], state2[b2_maxManifoldPoints];
b2GetPointStates(state1, state2, oldManifold, manifold);
b2WorldManifold worldManifold;
contact->GetWorldManifold(&worldManifold);
for (int32 i = 0; i < manifold->m_pointCount && m_pointCount < k_maxContactPoints; ++i)
{
ContactPoint* cp = m_points + m_pointCount;
cp->fixtureA = fixtureA;
cp->fixtureB = fixtureB;
cp->position = worldManifold.m_points[i];
cp->normal = worldManifold.m_normal;
cp->state = state2[i];
++m_pointCount;
}