如何基于b2Joint实例化提取/创建JointDef
How to extract/create a JointDef based off a b2Joint instantiation
我正在尝试序列化一个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,然后再次加载它。您可能会发现源代码很有用-查看http://www.iforce2d.net/b2djson滚动到底部,您可以看到源代码,查看函数b2dJson::b2j(b2Joint* joint)
这并不复杂,您只需要检查连接类型并转换为该类型的指针即可访问内容:
switch ( joint->GetType() )
{
case e_revoluteJoint:
{
b2RevoluteJoint* revoluteJoint = (b2RevoluteJoint*)joint;
...
}
}
有几点需要注意:
- 您将需要更改Box2D代码本身,以添加一些额外的GetXXX()函数到关节以获取所有必要的信息。我在那个页面上也放了一个列表,这样你就可以检查这些是我的案例(我使用的是最新的svn)
- 关节持有一个内存指针,指向它们连接的主体,这对序列化是无用的,所以你首先需要序列化世界中的主体,然后给关节一个列表中的索引
- 关节defs采用参考角度,但关节在创建后不会保持这个角度,因此您需要使用身体角度和关节角度来计算它是什么
- 齿轮关节连接其他两个关节,这些被保存为内存指针,所以要重新创建这些,你需要首先序列化所有非齿轮关节,然后在该列表中给齿轮关节一个索引
- 最近齿轮接头被改变,使他们不再保持指针到他们控制的其他两个关节,所以你需要添加他们回来,如果你想支持齿轮接头与最新的svn
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 使用std::multimap迭代器创建std::list
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 使用CMake创建QML插件
- 如何在c++中为模板函数实例创建快捷方式
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- OpenCV EqualizeHist()从彩色图像创建黑白图像
- 试图在visual studio上用C++创建一个桌面应用程序
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 如何在C++20中创建模板别名的推导指南
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 如何创建一个空的全局类并在启动时实例化它
- 无法创建抽象类的实例
- 链接到自行创建的dll失败
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何在C++类内存结构中创建"spacer"?
- 终端不会为C++文件创建.exe文件吗
- 如何基于b2Joint实例化提取/创建JointDef