Box2D выдает ошибку при создании приспособления с помощью Polygonshape

#java #libgdx #box2d #game-engine #polygon

#java #libgdx #box2d #игровой движок #полигон

Вопрос:

я работаю с libGDX. Когда я пытаюсь в Box2D создать приспособление, имеющее форму многоугольника, я получаю следующую ошибку.:

 java: ./Box2D/Collision/b2Distance.h:103: const b2Vec2amp; b2DistanceProxy::GetVertex(int32) const: Assertion `0 <= index amp;amp; index < m_count' failed.
  

Когда я не выполняю Box2D world.step() , я больше не получаю эту ошибку.

Итак, я закомментировал все в своем WorldContactListener и снова добавил world.step() .

Я все еще получаю ту же ошибку.

Когда я заменяю форму многоугольника на форму круга, все работает нормально. Итак, вот как я создаю свою форму полигона:

  PolygonShape shape = new PolygonShape();

 float ppm = Game.PixelsPerMeter;

 Vector2[] vertices = new Vector2[3];

 vertices[0] = new Vector2(0f/ppm  , 0f  );
 vertices[1] = new Vector2(1/ppm , 1f/ppm  );
 vertices[2] = new Vector2(0f/ppm ,1f/ppm);

 shape.set(vertices);
  

И вот как я добавляю все в мир Box2D:

     float ppm = Game.PixelsPerMeter

    BodyDef bdef = new BodyDef();
    bdef.position.set(100/ ppm,  200/ ppm);
    bdef.type = BodyDef.BodyType.DynamicBody;

    b2dbody = world.createBody(bdef);

    FixtureDef mainFdef = new FixtureDef();


    mainFdef.shape = Shape; //this is the shape from above of course
    b2dbody.createFixture(mainFdef).setUserData(this);
  

Я был бы очень рад, если бы вы могли сказать мне, что не так!

Спасибо

Комментарии:

1. Каково значение ppm?

2. @IronMonkey это 75

3. Попробуйте shape.set(вершины, вершины. длина);

4. @IronMonkey спасибо, но когда я это делаю, он выдает следующую ошибку : Error:(382, 17) Gradle: error: no suitable method found for set(Vector2[],int) method PolygonShape.set(Vector2[]) is not applicable (actual and formal argument lists differ in length) method PolygonShape.set(float[]) is not applicable (actual and formal argument lists differ in length) method PolygonShape.set(float[],int,int) is not applicable (actual and formal argument lists differ in length) . Не существует метода, который принимает эти два параметра.

Ответ №1:

Скорее дикое предположение, но правильно ли выполняется преобразование ppm? 1 / ppm (который вы указываете равным 75) дает довольно небольшое значение. Я не копался в недрах кода box2d, но поскольку он лучше всего работает, когда объекты определены в метрах, создание многоугольника с вершинами 0,0 и 0,0.0133 (1 см) может «запутать его» (имеется в виду какая-то ошибка округления или что-то еще где-то в коде, поэтому он не может различитьвершины и думает, что их не менее 3.)

Например, простое приложение с 3 версиями вашего кода vertices выдает исключения во время выполнения для первых 2 версий (небольшие значения), но не исключение во время выполнения с большими значениями:

 /*  Version 1 (your code) - Runtime error
vertices[0] = new Vector2(0f/ppm  , 0f  );
vertices[1] = new Vector2(1f/ppm , 1f/ppm  );
vertices[2] = new Vector2(0f/ppm ,1f/ppm);
*/

/* Version 2 (your actual values) - Runtime error
vertices[0] = new Vector2(0f  , 0f  );
vertices[1] = new Vector2(0.0133f , .0133f  );
vertices[2] = new Vector2(0f , 0.0133f);
*/

/* Version 3 (larger values) - No error
vertices[0] = new Vector2(0f  , 0f  );
vertices[1] = new Vector2(1f , 1f  );
vertices[2] = new Vector2(0f ,1f);
*/