У меня есть текстура, которая не является только коробкой или кругом, и мое тело должно быть таким же от этой формы, поэтому я думал объединить несколько тел для достижения желаемой формы, возможно ли это? или есть лучшие способы сделать это? Я использую java с платформой libgdx.Как комбинировать тела Box2d?
ответ
Форма тела определяется по Fixture экземплярам. Поскольку тело может иметь несколько приборов, вы можете комбинировать множество фигур по своему усмотрению.
Чтобы создать множество светильников вы шутите называете createFixture метода много раз с другими FixtureDef объектами, такими как
FixtureDef fd1 = new FixtureDef();
FixtureDef fd2 = new FixtureDef();
...
fd1.shape = shape1;
fd2.shape = shape2;
...
body.createFixture(fd1);
body.createFixture(fd1);
Хотя пожалуйста обратите внимание, что Box2D поддерживает более кругов и прямоугольников, предоставляя ChainShape, что позволяет создавать любая форма, которую вы хотите
ChainShape weird = new ChainShape();
weird.createLoop(new float[]{vertice1x, vertice1y, vertice2x, ...});
Для объединения тел есть Совместное (посмотрите here) механизм, но я предполагаю, что это не то, что вы хотите здесь
Да, вы можете сделать это с помощью следующих шагов ниже
Существует опция PolygonShape или ChainShape, который подходит для вашей работы
Шаг 1: Определите тело.
BodyDef bd = new BodyDef();
Body body = box2d.world.createBody(bd);
Шаг 2: Определите форму.
ChainShape chain = new ChainShape();
Шаг 3: Настроить форму. Объект ChainShape представляет собой серию связанных вершин. Чтобы создать цепочку, мы должны сначала указать массив вершин (каждый как объект Vec2). Чтобы создать цепь с вершинами, массив затем передается в функцию под названием
createChain().Vec2[] vertices = new Vec2[2];
vertices[0] = box2d.coordPixelsToWorld(0,150);
vertices[1] = box2d.coordPixelsToWorld(width,150);
chain.createChain(vertices, vertices.length);
форма не является частью Box2D, если она не прикреплена к корпусу. Даже если это фиксированная граница и никогда не перемещается, она все равно должна быть прикреплена.
FixtureDef fd = new FixtureDef();
fd.shape = chain; A fixture assigned to the ChainShape
fd.density = 1;
fd.friction = 0.3;
fd.restitution = 0.5;
body.createFixture(fd);
многоугольник
PolygonShape ps = new PolygonShape();
ps.setAsBox(box2dW, box2dH);
Vec2[] vertices = new Vec2[4];
vertices[0] = box2d.vectorPixelsToWorld(new Vec2(-15, 25));
vertices[1] = box2d.vectorPixelsToWorld(new Vec2(15, 0));
vertices[2] = box2d.vectorPixelsToWorld(new Vec2(20, -15));
vertices[3] = box2d.vectorPixelsToWorld(new Vec2(-10, -10));
PolygonShape ps = new PolygonShape();
ps.set(vertices, vertices.length);
Официальные примеры тестовых стендов
Я настоятельно рекомендую, что вы идете на всех примерах Testbed на GUI до тех пор, пока не найдете эффект, который вы ищете.
Поступая таким образом, я был в состоянии найти следующие примеры:
несколько светильников на корпус, как указано в https://stackoverflow.com/a/35667538/895245:
- https://github.com/erincatto/Box2D/blob/f655c603ba9d83f07fc566d38d2654ba35739102/Box2D/Testbed/Tests/ShapeEditing.h#L61
- https://github.com/erincatto/Box2D/blob/f655c603ba9d83f07fc566d38d2654ba35739102/Box2D/Testbed/Tests/CompoundShapes.h
Это лучший подход Я видел до сих пор.
ChainShape
: https://github.com/erincatto/Box2D/blob/f655c603ba9d83f07fc566d38d2654ba35739102/Box2D/Testbed/Tests/CharacterCollision.h#L56 Но это не сработает, если один из краев вашей фигуры не является прямой линией, например. круг.-
Однако это не делает два тела полностью присоединились, как можно видеть на самом примере, и из руководства Box2D:
Заманчиво использовать сварной шов, чтобы определить разрушаемые структуры. Тем не менее, решатель Box2D является итеративным , поэтому суставы немного мягкие. Таким образом, цепи тел, соединенные сварными швами, будут изгибаться.
Таким образом, это больше похоже на револьверное соединение, которое пытается покинуть два тела под заданным углом.
Эти примеры очень просты и будут поддерживаться по мере развития Box2D.
- 1. Box2D неправильное вращение тела
- 2. Box2D вращения тела
- 3. Libgdx Box2D создает тела
- 4. Создание массива Box2D тела
- 5. обращающихся box2d тела
- 6. AndEngine Box2D тела GetContactList
- 7. Box2D Flash, Уничтожающие тела
- 8. Lua Box2d Gideros: Скрыть тела
- 9. Движение тела Box2d в Andengine
- 10. box2d: Перемещение тела с анимацией
- 11. Box2D: рулон мягкого тела мяч
- 12. Нарисуйте шрифт поверх тела box2d
- 13. rotaion падающего тела в box2D
- 14. Box2D с UIKit - Физика тела
- 15. Уникальные тела в AndEngine Box2D
- 16. box2d (libgdx) штабелированные тела нестабильны
- 17. Как установить положение спрайта внутри тела box2d?
- 18. as3: Box2d, как найти ближайшие тела
- 19. Box2d & Libgdx Контакт-прослушиватель и неактивные тела
- 20. Увеличьте скорость тела с помощью applyLinearImpulse box2d
- 21. Box2D Свет, чтобы игнорировать все тела
- 22. Box2D + LibGDX понг, все тела «застряли»
- 23. предельная линейная скорость тела android andengine box2d
- 24. Box2d - actioncript, java, andengine - позиция тела
- 25. Box2D: заставляют тела падать в случайные интервалы
- 26. Cocos2d Box2d Scaling Радиус окружность тела
- 27. Движение тела без применения силы? (Box2d)
- 28. Box2D & Cocos2d-x нахождение будущего местоположения тела
- 29. box2d Получить все контактные тела для b2Body
- 30. вращающегося тела и прикрепленный спрайт в Box2D
Какова цель последней части? если вы уже установили цепочку fixtureShape =, а затем назначили ее телу. –
последняя часть - многоугольник форма отдельный из цепь форма. при условии, что небольшой код, чтобы вы могли также узнать другую форму. –