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

时间:2011-08-05 01:51:23

标签: c++ serialization box2d

我正在尝试序列化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 个答案:

答案 0 :(得分:1)

我最近做了很多这样的事情来制作导出/导入实用程序,将Box2D世界序列化为JSON,然后再次加载它。您可能会发现源代码很有用 - 请查看http://www.iforce2d.net/b2djson向下滚动,您可以看到源代码,查看函数b2dJson :: b2j(b2Joint * joint)

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

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

但有几点需要注意:

  • 您需要更改Box2D代码本身以向关节添加一些额外的GetXXX()函数以获取所有必要的信息。我也把它们列在那个页面上,这样你就可以查看这些是我的情况(我使用的是最新的svn)
  • 关节持有一个指向它们连接的实体的内存指针,这对于序列化是没用的,所以你首先需要序列化世界中的实体,然后给关节提供该列表中的索引
  • 关节defs采用参考角度但是关节在创建后不会保持这个,所以你需要使用体角和关节角来计算它是什么
  • 齿轮接头连接另外两个接头,这些接头作为记忆指针保持,因此要重新创建这些接头,您需要首先序列化所有非齿轮接头,然后在该列表中为齿轮接头提供索引
  • 最近更换了齿轮接头,以便它们不再保持指向它们控制的另外两个关节的指针,所以如果你想用最新的svn支撑齿轮接头,你需要将它们加回来