Bullet之了解Force Torque Impulse

Bullet之了解Force Torque Impulse,第1张

概述Bullet之了解Force Torque Impulse 分类: cocos2d-x 物理引擎 2015-01-14 00:01 167人阅读 评论(0) 收藏 举报 cocos2dx bullet 物理引擎 在了解Force Impulse Torque 之前,先来看看setLinearVelocity,setAngularVelocity 一个是线速度,一个是角速度 理解起来是很简单的设置b Bullet之了解Force Torque Impulse 分类: cocos2d-x 物理引擎 2015-01-14 00:01 167人阅读 评论(0) 收藏 举报 @H_301_17@ cocos2dx bullet 物理引擎 @H_301_17@

在了解ForceImpulseTorque之前,先来看看setlinearVeLocity,setAngularVeLocity

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

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

[cpp] view plain copy @H_301_17@ @H_301_17@ //线速度 constbtVector3&getlinearVeLocity()const voIDsetlinearVeLocity(constbtVector3&lin_vel) //角速度 constbtVector3&getAngularVeLocity()const voIDsetAngularVeLocity(constbtVector3&ang_vel) @H_301_17@

现在来了解Force

[cpp] view plain copy @H_301_17@ @H_301_17@ voIDapplyCentralForce(constbtVector3&force) voIDapplyForce(constbtVector3&force,constbtVector3&rel_pos) @H_301_17@

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

[cpp] view plain copy @H_301_17@ @H_301_17@ voIDapplyCentralForce(constbtVector3&force) { <spanstyle="white-space:pre"></span>m_totalForce+=force*m_linearFactor; } @H_301_17@

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

[cpp] view plain copy @H_301_17@ @H_301_17@ voIDsetlinearFactor(constbtVector3&linearFactor) { m_linearFactor=linearFactor; m_invMass=m_linearFactor*m_inverseMass; } @H_301_17@

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

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

[cpp] view plain copy @H_301_17@ @H_301_17@ voIDapplyForce(constbtVector3&force,constbtVector3&rel_pos) { applyCentralForce(force);//首先直接施加力 applyTorque(rel_pos.cross(force*m_linearFactor));//然后施加扭转力 } @H_301_17@

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

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 @H_301_17@ @H_301_17@ voIDapplyTorque(constbtVector3&torque) { m_totalTorque+=torque*m_angularFactor; } @H_301_17@

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

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

现在来了解Impulse

[cpp] view plain copy @H_301_17@ @H_301_17@ 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)); } } } @H_301_17@

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

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

看源码就知道了applyCentralimpulseapplyImpulse就跟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所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1033679.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存