加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Bullet之了解Force Torque Impulse

发布时间:2020-12-14 20:09:13 所属栏目:百科 来源:网络整理
导读:Bullet之了解Force Torque Impulse 分类: cocos2d-x 物理引擎 2015-01-14 00:01 167人阅读 评论(0) 收藏 举报 cocos2dx bullet 物理引擎 在了解 ForceImpulseTorque 之前, 先来看看setLinearVelocity,setAngularVelocity 一个是线速度,一个是角速度 理解

Bullet之了解Force Torque Impulse

分类: cocos2d-x 物理引擎 167人阅读 评论(0) 收藏 举报
cocos2dx bullet 物理引擎

在了解ForceImpulseTorque之前,先来看看setLinearVelocity,setAngularVelocity

一个是线速度,一个是角速度

理解起来是很简单的设置body的线速度和角速度

[cpp] view plain copy
  1. //线速度
  2. constbtVector3&getLinearVelocity()const
  3. voidsetLinearVelocity(constbtVector3&lin_vel)
  4. //角速度
  5. constbtVector3&getAngularVelocity()const
  6. voidsetAngularVelocity(constbtVector3&ang_vel)

现在来了解Force

[cpp] view plain copy
  1. voidapplyCentralForce(constbtVector3&force)
  2. voidapplyForce(constbtVector3&force,constbtVector3&rel_pos)

applyCentralForce给body提供一个作用力,查看源码

[cpp] view plain copy
  1. voidapplyCentralForce(constbtVector3&force)
  2. {
  3. <spanstyle="white-space:pre"></span>m_totalForce+=force*m_linearFactor;
  4. }

可知在body原有作用力的基础上再加force*m_linearFactor,至于这个m_linearFactor

[cpp] view plain copy
  1. voidsetLinearFactor(constbtVector3&linearFactor)
  2. {
  3. m_linearFactor=linearFactor;
  4. m_invMass=m_linearFactor*m_inverseMass;
  5. }

就是对施加的力三个方向各缩放一定的倍数。

applyForce同样是给body提供一个作用力,

[cpp] view plain copy
  1. voidapplyForce(constbtVector3&force,constbtVector3&rel_pos)
  2. {
  3. applyCentralForce(force);//首先直接施加力
  4. applyTorque(rel_pos.cross(force*m_linearFactor));//然后施加扭转力
  5. }

向量的叉乘得到垂直于这两个向量的另一个向量

rel_pos.cross(force*m_linearFactor)可以得到扭转力

假设force=(0,-10),rel_pos=(0,1,0),

Force*rel_pos=(-10,0),得到绕x轴的扭转力

记住applyForce并不是单独施加力

现在来看Torque

前面的applyForce已经提到过,提供一个扭转力

[cpp] view plain copy
  1. voidapplyTorque(constbtVector3&torque)
  2. {
  3. m_totalTorque+=torque*m_angularFactor;
  4. }

假设torque=(10,5,-10)

就是绕torque.normalize这个轴旋转。

现在来了解Impulse

[cpp] view plain copy
  1. voidapplyCentralImpulse(constbtVector3&impulse)
  2. {
  3. m_linearVelocity+=impulse*m_linearFactor*m_inverseMass;
  4. }
  5. voidapplyTorqueImpulse(constbtVector3&torque)
  6. {
  7. m_angularVelocity+=m_invInertiaTensorWorld*torque*m_angularFactor;
  8. }
  9. voidapplyImpulse(constbtVector3&impulse,constbtVector3&rel_pos)
  10. {
  11. if(m_inverseMass!=btScalar(0.))
  12. {
  13. applyCentralImpulse(impulse);
  14. if(m_angularFactor)
  15. {
  16. applyTorqueImpulse(rel_pos.cross(impulse*m_linearFactor));
  17. }
  18. }
  19. }

把所有的Impulse都列了出来,关于冲量的介绍可以看百科。

既然要用,简单理解impulse*质量的倒数=增加的速度(线速度或者角速度)

看源码就知道了applyCentralImpulseapplyImpulse就跟applyCenterForce和applyForce差不多

如果要用Force使body移动就要每帧都去施加力,Impulse是瞬间提供一个速度,只在需要时施加

对于set****Factor只有在apply***时才使用,而set***Velocity不使用。

voidclearForces()

清除施加的Force和Torque,但body还是会受重力的影响。

_ballBody->setActivationState(ACTIVE_TAG);

当然在施加作用力时,要将body的状态设置为活动,只有活动的对象才能被模拟,这也是优化的一个方面。


没有源码,没有示例,只是简单了解,不足很多,只为学习。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读