cocos2d-x] В box2d неправильно создавал полигон с вершиной - PullRequest
0 голосов
/ 19 октября 2018
        {
            b2BodyDef bodyDef;
            bodyDef.type = b2_staticBody;
            bodyDef.position.Set(location.x / PTM_RATIO, location.y / PTM_RATIO);
            bodyDef.userData = pSprite;
            //bodyDef.userData = nullptr;

            b2Body* body = _world->CreateBody(&bodyDef);
            body->SetLinearVelocity(b2Vec2(1, 0));

            b2PolygonShape poly;

            b2Vec2 vertices[7];
            vertices[0].Set(0, 0);
            vertices[1].Set(1, 0);
            vertices[2].Set(1, 1);
            vertices[3].Set(0.75f, 1);
            vertices[4].Set(0.5f, 1.5f);
            vertices[5].Set(0.25f, 1);
            vertices[6].Set(0, 1);
            poly.Set(vertices, 7);

            b2FixtureDef fixtureDef;

            fixtureDef.shape = &poly;
            fixtureDef.density = 1.0f;
            fixtureDef.friction = 0.5f;
            fixtureDef.restitution = 0.0f;
            body->CreateFixture(&fixtureDef);
        }

я делаю тело box2d со значением вершины.

enter image description here в коде форма моей вершины похожа на верхнюю картинку.

(используется b2ChainShape, так что внутреннее пусто)

enter image description here но это форма тела, к которой он относится.

Почему возникают эти различия?

Не могу ли я решитьэта проблема?

1 Ответ

0 голосов
/ 20 октября 2018

b2PolygonShape нельзя использовать для вогнутых многоугольников ;он предназначен только для выпуклых многоугольников .

Реализация b2PolygonShape использует алгоритм вычисления выпуклой оболочки , который превратит набор точек из того, чтовы намеревались (как показано на первом изображении) получить то, что получили (как показано на втором изображении).

Это указано как распространенная ошибка : использование b2Polygon для создания вогнутыхполигоны.

Вы можете использовать b2ChainShape в качестве ссылки.

Если внутренняя область пуста не то, что вы хотите, вы можете создать свою вогнутую форму, используянабор выпуклых многоугольников.

Достаточно двух выпуклых многоугольников, чтобы создать первую фигуру, которую вы показали.Один из этих выпуклых многоугольников будет треугольником, а другой - прямоугольником (или квадратом).

Надеюсь, это поможет.

...