Я знаю, что это довольно старый пост, но, основываясь на первом ответе, вместо использования SetAsBox (), вы должны использовать Set и определить вершины блока. Я обнаружил, что SetAtBox создает из центра в направлении всех четырех сторон, используя ширину и высоту, поэтому независимо от того, что вы делаете, центр тяжести будет центром фигуры, но, с другой стороны, если вы используете Set, даже если Вы просто рисуете прямоугольник, вы можете ограничить его только одной стороной.
Например:
int32 count = 4;
b2Vec2 vertices[] = {b2Vec2(sprite.contentSize.width/PTM_RATIO, 0.0f / PTM_RATIO),
b2Vec2(0.0f / PTM_RATIO,0.0f / PTM_RATIO),
b2Vec2(0.0f / PTM_RATIO, -sprite.contentSize.height/PTM_RATIO),
b2Vec2(sprite.contentSize.width/PTM_RATIO, -sprite.contentSize.height/PTM_RATIO),
};
spriteShape.Set(vertices,count);
Это создаст форму с центром тяжести, смещенным в верхний левый угол, потому что мы рисовали только многоугольник с правой стороны, опускаясь вниз (ничего за точкой [0,0]).