微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Bullet之了解Force Torque Impulse

在了解ForceImpulseTorque之前,先来看看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,-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*质量的倒数=增加的速度(线速度或者角速度)

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

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

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

voidclearForces()

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

_ballBody->setActivationState(ACTIVE_TAG);

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


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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐