gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 08:18:11 26 4
gpt4 key购买 nike

我正在尝试序列化一个 b2World,由于 Box2D 的许多私有(private)对象在内部使用、创建和删除,问题变得更加复杂。我决定我应该使用这些内部对象的 get() 函数来获取我需要的数据,并在节省时间的基础上创建一个“b2Definition”对象,并使用全局工厂“创建”方法的定义来重新创建对象.

不过,我遇到了一些需要帮助的问题:下面的代码是我需要的所有 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)
  • 关节持有一个指向它们加入的物体的内存指针,这对序列化是无用的,所以你首先需要序列化世界中的物体,然后给关节在该列表中的索引
  • 关节定义采用引用角度,但关节在创建后不保持此角度,因此您需要使用 body 角度和关节角度来计算它是什么
  • 齿轮关节连接另外两个关节,它们作为内存指针保存,因此要重新创建这些关节,您需要首先序列化所有非齿轮关节,然后在该列表中为齿轮关节指定一个索引
  • 最近更改了齿轮关节,因此它们不再保留指向它们控制的其他两个关节的指针,因此如果您想使用最新的 svn 支持齿轮关节,则需要将它们添加回来

关于c++ - 如何基于 b2Joint 实例提取/创建 JointDef,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6950587/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com