C++ 如何基于b2Joint实例化提取/创建JointDef

C++ 如何基于b2Joint实例化提取/创建JointDef,c++,serialization,box2d,C++,Serialization,Box2d,我正在尝试序列化b2World,由于Box2D有许多内部使用、生成和删除的私有对象,因此问题变得更加复杂。我决定使用这些内部对象get()函数来获取所需的数据,并在节省时间的基础上创建一个“b2Definition”对象,然后使用全局工厂的“create”方法来重新创建对象 但是,我遇到了一些需要帮助的问题:下面的代码中包含了我需要的所有JointDef数据,但无法确定如何从指针获取正确类型的对象。 我还想知道我是否应该尝试保存联系人数据。。。。它是在工厂自动制造的吗 b2Wel

我正在尝试序列化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= ????   

我需要上面的数据吗?有办法得到它吗?

我最近做了很多这方面的工作,制作了一个导出/导入实用程序,将Box2D世界序列化为JSON,然后再次加载。您可能会发现源代码很有用-查看底部的滚动条,您可以看到源代码,查看函数b2dJson::b2j(b2Joint*joint)

这并不复杂,您只需检查关节类型并将其转换为该类型的指针即可访问内容:

switch ( joint->GetType() )
{
    case e_revoluteJoint:
    {
        b2RevoluteJoint* revoluteJoint = (b2RevoluteJoint*)joint;
        ...
    }
}
但有几件事需要注意:

  • 您需要更改Box2D代码本身,向关节添加一些额外的GetXXX()函数,以获取所有必要的信息。我在那页上也放了一个列表,这样你就可以查看我的案例(我使用的是最新的svn)
  • 关节持有一个指向它们所连接的实体的内存指针,这对序列化是无用的,因此您首先需要序列化世界中的实体,然后在该列表中为关节提供一个索引
  • 关节定义采用参考角度,但关节在创建后不会保持该角度,因此需要使用躯干角度和关节角度来计算该角度
  • 齿轮接头连接其他两个接头,这些接头作为内存指针保存,因此要重新创建这些接头,您需要首先序列化所有非齿轮接头,然后在该列表中为齿轮接头提供索引
  • 最近更改了齿轮运动类型,因此它们不再保留指向它们控制的其他两个运动类型的指针,因此如果要使用最新的svn支持齿轮运动类型,则需要重新添加它们

没有办法避免更改源代码?看看第2点,boost::serialize基本上已经这样做了吗?我记得文档中说了一些关于保存ptr指向的内容(一个主体),在我的例子中,这个主体在ptr之前被序列化。我还需要这样做吗?这个技巧适用于box2D中的所有指针吗?比如b2ContactEdge和b2JointEdge?对。Box2D并没有真正考虑到这种特性,只是幸运的是没有太多必要的更改。恐怕我对boost一无所知(啊,现在我只是简单地看了一下)-即使“深度指针保存”成功了,我也怀疑它是否能为您提供一个工作的Box2D世界,它会引发一些问题,比如如何处理用户数据,以及如何支持新版本的Box2D。除非我弄错了,否则您需要将函数void serialize(Archive&ar,const unsigned int version)添加到您想要序列化的所有内容中,需要更改方式更多更改Box2D.oh抱歉。。。还有一个非侵入式版本,它似乎可以处理重复的指针。我敢肯定,如果不使用适当的CreateBody方法,您将无法获得工作环境,这意味着在反序列化之后,您仍然需要以某种方式获取第一篇文章中的数据。我不知道你为什么要保存联系人数据。。。当你向世界添加一个身体时,这个信息会自动更新。基本上,您希望以与最初创建世界相同的方式重新创建世界,即使用CreateBody、CreateFixture等。可以忽略其他内部构件,如b2ContactEdge。