Как извлечь / создать JointDef на основе экземпляра b2Joint - PullRequest
0 голосов
/ 05 августа 2011

Я пытаюсь сериализовать b2World, и из-за множества закрытых объектов Box2D, которые используются, создаются и удаляются внутри, проблема становится намного более сложной.Я решил, что я должен использовать эти внутренние объекты get (), чтобы получить нужные мне данные, и создать объект "b2Definition" на его основе во время сохранения, и использовать определение с методами "create" глобальных фабрик для воссоздания объектов.

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

Мне также интересно, должен ли я даже попытаться сохранить контактные данные .... Это автоматически выполняется на заводе при создании методов?

        b2WeldJointDef JointDef; //QUESTION: how do i get this
        //JointDef.referenceAngle=      Joint-> ?????       

        b2GearJointDef JointDef; //QUESTION: how do i get these
        //JointDef.joint1=              Joint-> ??????  
        //JointDef.joint2=              Joint-> ??????

        b2LineJointDef JointDef; //QUESTION: how do i get these??
        //JointDef.localAxisA=          Joint-> ????
        //JointDef.lowerTranslation=    Joint-> ????    
        //JointDef.upperTranslation=    Joint-> ????

        b2MouseJointDef JointDef; //No problems

        b2PrismaticJointDef JointDef; //QUESTION: how do i get these??
        //JointDef.referenceAngle=      Joint-> ????
        //JointDef.localAxis1=          Joint-> ????  
        //JointDef.lowerTranslation=    Joint-> ????                    //JointDef.upperTranslation=    Joint-> ????  
        //JointDef.maxMotorForce=       Joint-> ????

        b2PulleyJointDef JointDef; //QUESTION: how do i get these?
        //JointDef.maxLengthA=          Joint-> ????
        //JointDef.maxLengthB=          Joint-> ????    

        b2RevoluteJointDef JointDef; //QUESTION: how do i get these?
        //JointDef.maxMotorTorque=      Joint-> ????
        //JointDef.referenceAngle       Joint-> ????
        //JointDef.lowerAngle=          Joint-> ????    
        //JointDef.upperAngle=          Joint-> ????

        b2JointDef JointDef;
        //JointDef.collideConnected= ????   

Должен ли янужны данные выше?Есть ли способ получить это?

1 Ответ

1 голос
/ 05 августа 2011

Недавно я много сделал для создания утилиты экспорта / импорта, чтобы сериализовать мир Box2D в JSON и затем загрузить его снова.Вам может пригодиться исходный код - посмотрите http://www.iforce2d.net/b2djson Прокрутите вниз и вы увидите исходный код, посмотрите на функцию b2dJson :: b2j (b2Joint * joint)

Это не сложновам просто нужно проверить тип соединения и привести к указателю этого типа, чтобы получить доступ к содержимому:

switch ( joint->GetType() )
{
    case e_revoluteJoint:
    {
        b2RevoluteJoint* revoluteJoint = (b2RevoluteJoint*)joint;
        ...
    }
}

Несколько замечаний:

  • вам понадобитсяизменить сам код Box2D, добавив некоторые дополнительные функции GetXXX () к соединениям, чтобы получить всю необходимую информацию.Я разместил их список на этой странице, чтобы вы могли проверить, что это было для моего случая (я использовал самый последний svn)
  • соединения содержат указатель памяти на тела, к которым они присоединяются, что бесполезно для сериализацииТаким образом, сначала вам нужно будет сериализовать тела в мире, а затем дать индексам соединений в этом списке.
  • Соединения определений принимают опорный угол, но соединения не удерживают его после создания, поэтому вам нужноиспользуйте углы корпуса и угол соединения, чтобы вычислить, какие это были
  • зубчатые соединения, соединяющие два других сустава, и они хранятся в качестве указателей памяти, поэтому для их воссоздания вам нужно сначала сериализовать все не зубчатые соединения, затемукажите в этом списке зубчатые соединения
  • недавно были заменены зубчатые соединения, чтобы они больше не держали указатели на двух других соединениях, которыми они управляют, поэтому вам нужно будет добавить их обратно, если вы хотите поддержать передачусуставы с самым последним svn
...