OgreOde中SceneNode和Body的运动关系

下面这些是OgreNewt有关的,希望对OgreOde有用处:

物体间的碰撞检测我用的是OgreNewt(一个开源的物理引擎)。但是我不太在乎物理定律,因为作出精确的行为是需要满强的物理功底的。我只是需要用到它的碰撞检测,如何初始化等就不说了,只说下问题。

Ogre的SceneNode和OgreNewt的body是绑定的。可以用SceneNode的位置设置body的位置,或者相反。但是不要用前者,除非初始化的时候。因为不用物理规则设定body位置的话,那么碰撞就不起作用了(多么2)。

设置body的位置和方向有几种方法,setVelocity,setForce,setTorque,setOmega;分别是设置速度,受力,力矩,和角速度;因为对物理定律不熟悉,所以超级厌恶受力和力矩。所以搞一个伪物理行为取而代之:因为对物体的实际旋转没有兴趣(比如受到撞击木块会翻滚),所以只用SetVelocity调整body的位置;而用SceneNode来计算旋转方向。

具体……掠过……

注意虽然body和SceneNode是绑定的,实际上body位置或者SceneNode位置改变都是不影响到对方,必须自己改变另一个的位置。改变SceneNode的位置比较正宗的方法是用Callback,OgreNewt可以设置各种各样的Callback函数,程序会自动在某种情况发生的时候调用它们。改变位置就可以用

body->setCustomTransformCallback(customTransformCallback);

/*定义*/

void CRider::customTransformCallback(OgreNewt::Body* me, const Ogre::Quaternion& orient, const Ogre::Vector3& pos )
{
/*获取和body绑定的指针,用body->setUserData()设定*/
SceneNode* node=(CRider*)me->getUserData();
node->setPosition(pos);
}

具体……掠过……

这里的callback虽然不需要传参数,但是实际上它的参数数量和形式已经是定义好的。另外,函数必须是静态的。

主要问题已经解决,我的程序因为未知原因出现了一件超级恶的事,就是body走着走着就不动了,虽然速度设置的没有错误,我想可能是物理定律发威了。搞了好久,终于发现不动的时候TransformCallback也不会被调用了,果然是物理定律发威了。Newton会将不动的物体永久打入冷宫,好像锁定一样,实际上是不再计算它。

然后发现有一个setAutoactiveCallback(),试验了一下,发现在不动的时候程序会不断调用这个callback。于是写了一个callback如下。

void CRider::customAutoActiveCallback(OgreNewt::Body* me, unsigned int state)
{
      me->unFreeze();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值