Bullet之了解Force Torque Impulse

前端之家收集整理的这篇文章主要介绍了Bullet之了解Force Torque Impulse前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

Bullet之了解Force Torque Impulse

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

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

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

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

@H_502_37@
  • //线速度
  • constbtVector3&getLinearVelocity()const
  • voidsetLinearVelocity(constbtVector3&lin_vel)
  • //角速度
  • constbtVector3&getAngularVelocity()const
  • voidsetAngularVelocity(constbtVector3&ang_vel)

  • 现在来了解Force

    @H_502_37@
  • voidapplyCentralForce(constbtVector3&force)
  • voidapplyForce(constbtVector3&force,constbtVector3&rel_pos)
  • applyCentralForce给body提供一个作用力,查看源码

    @H_502_37@
  • voidapplyCentralForce(constbtVector3&force)
  • {
  • <spanstyle="white-space:pre"></span>m_totalForce+=force*m_linearFactor;
  • }
  • 可知在body原有作用力的基础上再加force*m_linearFactor,至于这个m_linearFactor

    @H_502_37@
  • voidsetLinearFactor(constbtVector3&linearFactor)
  • {
  • m_linearFactor=linearFactor;
  • m_invMass=m_linearFactor*m_inverseMass;
  • }
  • 就是对施加的力三个方向各缩放一定的倍数。

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

    @H_502_37@
  • voidapplyForce(constbtVector3&force,constbtVector3&rel_pos)
  • {
  • applyCentralForce(force);//首先直接施加力
  • applyTorque(rel_pos.cross(force*m_linearFactor));//然后施加扭转力
  • }
  • 向量的叉乘得到垂直于这两个向量的另一个向量

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

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

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

    记住applyForce并不是单独施加力

    现在来看Torque

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

    @H_502_37@
  • voidapplyTorque(constbtVector3&torque)
  • {
  • m_totalTorque+=torque*m_angularFactor;
  • }
  • 假设torque=(10,5,-10)

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

    现在来了解Impulse

    @H_502_37@
  • voidapplyCentralImpulse(constbtVector3&impulse)
  • {
  • m_linearVelocity+=impulse*m_linearFactor*m_inverseMass;
  • }
  • voidapplyTorqueImpulse(constbtVector3&torque)
  • {
  • m_angularVelocity+=m_invInertiaTensorWorld*torque*m_angularFactor;
  • }
  • voidapplyImpulse(constbtVector3&impulse,constbtVector3&rel_pos)
  • {
  • if(m_inverseMass!=btScalar(0.))
  • {
  • applyCentralImpulse(impulse);
  • if(m_angularFactor)
  • {
  • applyTorqueImpulse(rel_pos.cross(impulse*m_linearFactor));
  • }
  • }
  • }
  • 把所有的Impulse都列了出来,关于冲量的介绍可以看百科。

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

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

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

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

    voidclearForces()

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

    _ballBody->setActivationState(ACTIVE_TAG);

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


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

    猜你在找的Cocos2d-x相关文章