Мне пришлось полностью переделать этот вопрос, так как я не думаю, что достаточно четко изложил свою проблему.
Я пытаюсь изучить веревки Box2D Web. У меня начались проблемы, когда я захотел научиться складывать несколько фигур в одно твердое тело (чтобы сформировать гибкие вогнутые тела). Одно из допущений, которые я сделал, заключалось в том, что этот вид функции будет действительно полезен только в том случае, если я смогу изменить положение фигур (чтобы я мог контролировать то, как выглядело все твердое тело в целом). Примером может быть создание тела «L» с двумя прямоугольными формами, одна из которых была расположена ниже и справа от первой формы.
Я дошел до того, что нашел метод SetAsOrientedBox, в котором вы можете передать блоку его позицию в 3-м аргументе (в центре).
Все хорошо. Но когда я попытался создать две формы круга в одном твердом теле, я обнаружил нежелательное поведение. Мой инстинкт был использовать метод SetLocalPosition (находится в классе b2CircleShape). Кажется, это работает до некоторой степени. В отладочной отрисовке тело реагирует физически так, как и должно, но визуально (в отладочной форме) оно не рисует фигуры в их положении. Он просто рисует формы круга в центральной позиции. Я знаю, что это, вероятно, проблема с логикой отладочной отрисовки Box2D — но мне кажется странным, что в этой проблеме нет онлайн-паттеров. Можно подумать, что создание двух круговых фигур в разных положениях в координатном пространстве тела было бы популярным и хорошо документированным феноменом. Очевидно, нет.
Ниже приведен код, который я использую для создания тел. Предположим, что мир был передан в эту сферу эффективно:
// first circle shape and def
var fix_def1 = new b2FixtureDef;
fix_def1.density = 1.0;
fix_def1.friction = 0.5;
fix_def1.restitution = .65;
fix_def1.bullet = false;
var shape1 = new b2CircleShape();
fix_def1.shape = shape1;
fix_def1.shape.SetLocalPosition(new b2Vec2(-.5, -.5));
fix_def1.shape.SetRadius(.3);
// second circle def and shape
var fix_def2 = new b2FixtureDef;
fix_def2.density = 1.0;
fix_def2.friction = 0.5;
fix_def2.restitution = .65;
fix_def2.bullet = false;
var shape2 = new b2CircleShape();
fix_def2.shape = shape2;
fix_def2.shape.SetLocalPosition(new b2Vec2(.5, .5));
fix_def2.shape.SetRadius(.3);
// creating the body
var body_def = new b2BodyDef();
body_def.type = b2Body.b2_dynamicBody;
body_def.position.Set(5, 1);
var b = world.CreateBody( body_def );
b.CreateFixture(fix_def1);
b.CreateFixture(fix_def2);
Обратите внимание, что я использую Box2D Web ( http://code.google.com/p/box2dweb/ ) с холстом HTML5.
Похоже, вы на самом деле не используете стандартную отладочную отрисовку вообще, а функцию, которую вы написали сами — что объясняет отсутствие онлайн-паттерна об этом (пастин для потомков).
Взгляните на источник box2dweb и посмотрите на эти функции для рабочей ссылки:
b2World.prototype.DrawDebugData
b2World.prototype.DrawShape
b2DebugDraw.prototype.DrawSolidCircle
Вы можете использовать контекстную функцию «дуги» контекста, чтобы избежать необходимости расчета точек с помощью sin / cos, а затем рисовать отдельные линии, чтобы сделать круг. Это также позволяет браузеру использовать наиболее эффективный способ визуализации кривой, например. аппаратная поддержка в некоторых браузерах.
Поскольку кажется, что вы хотите сделать пользовательский рендеринг, еще одна ловушка, на которую следует обратить внимание, это разные сигнатуры вызовов для DrawCircle и DrawSolidCircle. Второй из них принимает параметр для направления оси, поэтому, если вы по ошибке используете трехпараметрическую версию, Javascript будет молча использовать параметр цвета для оси, оставляя вам неопределенный параметр цвета. Часы веселья!
DrawCircle(center, radius, color)
DrawSolidCircle(center, radius, axis, color)
Других решений пока нет …