Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   API приложений и сред (http://www.flasher.ru/forum/forumdisplay.php?f=61)
-   -   [Box2D] соединение двух тел (http://www.flasher.ru/forum/showthread.php?t=172032)

provigator 30.11.2011 11:32

соединение двух тел
 
создаю 2 тела
Код AS3:

bodyDef=new b2BodyDef()
bodyDef.position.Set(c1.x/30, c1.y/30)                       
boxDef=new b2PolygonDef()
boxDef.SetAsBox((c1.width)/30/2, (c1.height)/30/2)
boxDef.density=1.5
boxDef.friction=0.5
boxDef.restitution=0.2
bodyDef.userData=c1
body=m_world.CreateBody(bodyDef)
body.CreateShape(boxDef)
body.SetMassFromShapes()
 
bodyDef=new b2BodyDef()
bodyDef.position.Set(c2.x/30, c2.y/30)                       
boxDef=new b2PolygonDef()
boxDef.SetAsBox((c2.width)/30/2, (c2.height)/30/2)
boxDef.density=1.5
boxDef.friction=0.5
boxDef.restitution=0.2
bodyDef.userData=c2
body=m_world.CreateBody(bodyDef)
body.CreateShape(boxDef)
body.SetMassFromShapes()

как соединить эти тела?
соединение должно быть жестким
версия 2.0.2

goodguy 30.11.2011 11:43

советую посмотреть в сторону b2WeldJoint. Но он мудреный.
Можно обойти используюя b2RevoluteJoint с отключенным вращением.

Но в этом коде я не вижу создания двух тел. Точнее оно есть, но обращаться по ссылке можно будет только к одному. Для соединения необходимо определить 2 переменных с типом b2Body, иначе это танцы с бубном

provigator 30.11.2011 13:47

нужен более подробный ответ в коде
1. как определить переменные
2. как создать соединение b2RevoluteJoint
соединение должно быть жестким
версия 2.0.2

goodguy 30.11.2011 15:19

Цитата:

1. как определить переменные
Какой-то странноватый вопрос. А ты этот-то код сам писал? Или копипаст?
Код AS3:

var body1:b2Body;
var body2:b2Body;

Как создаются шарниры есть в документации, довольно подробно. Я на версии 2.0.2 уже давно ничего не делал.
Вот пример для 2.1а

Код AS3:

 
var jointDef:b2RevoluteJointDef        = new b2RevoluteJointDef();
jointDef.Initialize(_body, _leftTrack, new b2Vec2(        _body.GetWorldCenter().x, _body.GetWorldCenter().y) );
_leftTrackJoint        = _world.CreateJoint(jointDef) as b2RevoluteJoint;
_leftTrackJoint.EnableLimit(true);
_leftTrackJoint.EnableMotor(false);


provigator 30.11.2011 16:21

этот код сам писал
почитал доки по 2.0.2
Код AS3:

var jointDef:b2RevoluteJointDef = new b2RevoluteJointDef();
jointDef.Initialize(body1, body2, myBody1.GetWorldCenter());

но все равно не понятно как определяются переменные для тел
я для этого и написал код на этапе создания тела

goodguy 30.11.2011 16:42

в моем коде телами являются _body и _leftTrack
достаточно передать их при инициализации шарнира

body1 и body2 были ответом на вопрос:
Цитата:

1. как определить переменные

provigator 30.11.2011 17:00

теперь немного прояснилось
не понятно как определить переменную и привязать к телу на этапе создания тела
этот момент поясни, я для этого и написал скрип создания двух тел

goodguy 30.11.2011 18:01

Код AS3:

body1 = m_world.CreateBody(bodyDef)

в первом блоке, и:
Код AS3:

body2 = m_world.CreateBody(bodyDef)

во втором

provigator 30.11.2011 18:24

да!!!

goodguy 30.11.2011 18:35

эта ошибка не имеет к бокс2д ни малейшего отношения.
Надо было определить переменную перед тем, как ее использовать
Код AS3:

// где-то вначале 
var body1:b2Body;
....
// где-то потом
body1 = m_world.CreateBody(bodyDef)

п.с. пиши код с пробелами, по крайней мере на форуме. Напрягает читать когда все слеплено в кучу

provigator 30.11.2011 20:02

в общем получилась такая конструкция:
Код AS3:

var body1:b2Body;
var body2:b2Body;
body1 = m_world.CreateBody(bodyDef);
body2 = m_world.CreateBody(bodyDef);
 
var jointDef:b2RevoluteJointDef = new b2RevoluteJointDef();
jointDef.Initialize(body1, body2, body1.GetWorldCenter());
jointDef.enableLimit = true;
jointDef.enableMotor = false;

компилится без ошибок но соединение не создается
объекты движутся независимо
версия 2.0.2

goodguy 30.11.2011 21:01

надо вызывать world.CreateJoint(тут нужный шаринир);

provigator 30.11.2011 23:10

Код AS3:

var jointDef:b2RevoluteJointDef = new b2RevoluteJointDef();
jointDef.Initialize(body1, body2, body1.GetWorldCenter());
m_world.CreateJoint(jointDef);
jointDef.enableLimit = true;
jointDef.enableMotor = false;

соединение получилось
тела вращаются относительно друг друга вокруг точки их соединения
как отключить вращение?
надо получить жесткое соединение - в моем случае соединить два прямоугольника и получить один

goodguy 01.12.2011 07:36

ну очевидно же,
Joint#SetLimits(0, 0);
документация на что?

provigator 01.12.2011 12:13

Код AS3:

jointDef.SetLimits(0, 0);

ошибка:
1061: Call to a possibly undefined method SetLimits through a reference with static type Box2D.Dynamics.Joints:b2RevoluteJointDef.
версия 2.0.2

GBee 01.12.2011 14:02

Цитата:

ну очевидно же,
Joint#SetLimits(0, 0);
документация на что?
Цитата:

Код AS3:

jointDef.SetLimits(0, 0);

ошибка:
1061: Call to a possibly undefined method SetLimits through a reference with static type Box2D.Dynamics.Joints:b2RevoluteJointDef.
версия 2.0.2
Вы не внимательны, m_world.CreateJoint(jointDef) вернет вам b2RevoluteJoint, у которого надо вызывать setlimits

provigator 01.12.2011 14:34

Код AS3:

m_world.SetLimits(0, 0);

такой код тоже выполняется с ошибкой
как правильно вызвать метод SetLimits?

DaFive 01.12.2011 15:34

Цитата:

Вы не внимательны, m_world.CreateJoint(jointDef) вернет вам b2RevoluteJoint, у которого надо вызывать setlimits
:away:

provigator 01.12.2011 15:54

вопрос остается
как правильно вызвать метод SetLimits?

m_world.SetLimits(0, 0);
выполняется с ошибкой

GBee 01.12.2011 16:55

Цитата:

Вы не внимательны, m_world.CreateJoint(jointDef) вернет вам b2RevoluteJoint, у которого надо вызывать setlimits
facepalm :D

goodguy 01.12.2011 16:55

Цитата:

m_world.SetLimits(0, 0);
жесть какая :D
переведем на русский:
Код AS3:

мир.ЗадатьГраницы(0, 0); // задать границы? Тип возвращаемых данных: Апокалипсис )

документация
Пример упрощенный (из доков, кстати):
Код AS3:

var worldAxis:b2Vec2 = new b2Vec2(1.0, 0.0);
 
var jointDef:b2PrismaticJointDef = new b2PrismaticJointDef();
jointDef.Initialize(myBody1, myBody2, myBody1.GetWorldCenter(), worldAxis);
jointDef.lowerTranslation= 0;
jointDef.upperTranslation= 0;
jointDef.enableLimit    = true;

Цитата:

выполняется с ошибкой
он еще и выполняется..

GBee 01.12.2011 17:12

Цитата:

мир.ЗадатьГраницы(0, 0); // задать границы? Тип возвращаемых данных: Апокалипсис )
Размер панциря черепахи :о)

provigator 01.12.2011 18:27

Код AS3:

var jointDef:b2RevoluteJointDef = new b2RevoluteJointDef();
jointDef.Initialize(body1, body2, body1.GetWorldCenter());
m_world.CreateJoint(jointDef);
jointDef.enableLimit = true;
jointDef.enableMotor = false;
jointDef.lowerAngle = 0;
jointDef.upperAngle = 0;

объекты все равно вращаются вокруг точки соединения

GBee 01.12.2011 19:22

Цитата:

объекты все равно вращаются вокруг точки соединения
Я думаю дебаг покажет, что все ваши изменения в jointDef после создания джоинта на его основе ни к чему не приведут.

Код AS3:

var jointDef:b2RevoluteJointDef = new b2RevoluteJointDef();
jointDef.Initialize(body1, body2, body1.GetWorldCenter());
jointDef.enableLimit = true;
jointDef.enableMotor = false;
jointDef.lowerAngle = 0;
jointDef.upperAngle = 0;
m_world.CreateJoint(jointDef);


provigator 01.12.2011 20:07

бывает))


Часовой пояс GMT +4, время: 20:14.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.