Bullet之了解Force Torque Impulse
在了解Force Impulse Torque 之前,先来看看setLinearVelocity,setAngularVelocity
一个是线速度,一个是角速度
理解起来是很简单的设置body的线速度和角速度
- // 线速度
- const btVector3 & getLinearVelocity () const
- void setLinearVelocity (const btVector3 &lin_vel)
- // 角速度
- const btVector3 & getAngularVelocity () const
- void setAngularVelocity (const btVector3 &ang_vel)
现在来了解Force
- void applyCentralForce (const btVector3 &force)
- void applyForce (const btVector3 &force, const btVector3 &rel_pos)
applyCentralForce 给body提供一个作用力,查看源码
- void applyCentralForce(const btVector3& force)
- {
- <span style="white-space:pre"> </span>m_totalForce += force*m_linearFactor;
- }
可知在body原有作用力的基础上再加force*m_linearFactor,至于这个m_linearFactor
- void setLinearFactor(const btVector3& linearFactor)
- {
- m_linearFactor = linearFactor;
- m_invMass = m_linearFactor*m_inverseMass;
- }
就是对施加的力三个方向各缩放一定的倍数。
applyForce 同样是给body提供一个作用力,
- void applyForce(const btVector3& force, const btVector3& rel_pos)
- {
- applyCentralForce(force); // 首先直接施加力
- applyTorque(rel_pos.cross(force*m_linearFactor)); // 然后施加扭转力
- }
向量的叉乘得到垂直于这两个向量的另一个向量
rel_pos.cross(force*m_linearFactor)可以得到扭转力
假设force = (0, 0, -10), rel_pos = (0, 1, 0),
Force * rel_pos = (-10, 0, 0),得到绕x轴的扭转力
记住applyForce并不是单独施加力
现在来看Torque
前面的applyForce已经提到过,提供一个扭转力
- void applyTorque(const btVector3& torque)
- {
- m_totalTorque += torque*m_angularFactor;
- }
假设torque = (10, 5, -10)
就是绕torque.normalize这个轴旋转。
现在来了解Impulse
- void applyCentralImpulse(const btVector3& impulse)
- {
- m_linearVelocity += impulse *m_linearFactor * m_inverseMass;
- }
- void applyTorqueImpulse(const btVector3& torque)
- {
- m_angularVelocity += m_invInertiaTensorWorld * torque * m_angularFactor;
- }
- void applyImpulse(const btVector3& impulse, const btVector3& rel_pos)
- {
- if (m_inverseMass != btScalar(0.))
- {
- applyCentralImpulse(impulse);
- if (m_angularFactor)
- {
- applyTorqueImpulse(rel_pos.cross(impulse*m_linearFactor));
- }
- }
- }
把所有的Impulse都列了出来,关于冲量的介绍可以看百科。
既然要用,简单理解impulse * 质量的倒数 = 增加的速度(线速度或者角速度)
看源码就知道了applyCentralImpulse,applyImpulse就跟applyCenterForce 和 applyForce 差不多
如果要用Force使body移动就要每帧都去施加力,Impulse是瞬间提供一个速度,只在需要时施加
对于set****Factor只有在apply***时才使用,而set***Velocity不使用。
void clearForces ()
清除施加的Force和Torque,但body还是会受重力的影响。
_ballBody->setActivationState(ACTIVE_TAG);
当然在施加作用力时,要将body的状态设置为活动,只有活动的对象才能被模拟,这也是优化的一个方面。
没有源码,没有示例,只是简单了解,不足很多,只为学习。
本文介绍了Bullet物理引擎中力的概念,包括力(Force)、扭矩(Torque)和冲量(Impulse)的作用方式及实现原理。通过源码分析,解释了如何通过不同的方法改变刚体的运动状态。
1166

被折叠的 条评论
为什么被折叠?



