在了解ForceImpulseTorque之前,先来看看setlinearVeLocity,setAngularVeLocity
一个是线速度,一个是角速度
理解起来是很简单的设置body的线速度和角速度
// 线速度const btVector3 & getlinearVeLocity () constvoID setlinearVeLocity (const btVector3 &lin_vel)// 角速度const btVector3 & getAngularVeLocity () constvoID 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 > </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,-10),rel_pos=(0,1,0),
Force*rel_pos=(-10,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不使用。
voIDclearForces()
清除施加的Force和Torque,但body还是会受重力的影响。
_ballBody->setActivationState(ACTIVE_TAG);
当然在施加作用力时,要将body的状态设置为活动,只有活动的对象才能被模拟,这也是优化的一个方面。
没有源码,没有示例,只是简单了解,不足很多,只为学习。
总结以上是内存溢出为你收集整理的Bullet之了解Force Torque Impulse全部内容,希望文章能够帮你解决Bullet之了解Force Torque Impulse所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)