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的状态设置为活动,只有活动的对象才能被模拟,这也是优化的一个方面。

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

时间: 2024-10-13 19:01:58

Bullet之了解Force Torque Impulse的相关文章

接触力的计算

游戏或者仿真中要提供接近于真实世界的完整触觉反馈体验,需要VR头戴设备.控制器.外骨骼甚至是行走模拟装置的配合.然而,人类的触觉系统极其敏感,普通人打麻将就能用手指轻轻松松地摸出牌面.在目前的技术基础上,机器很难还原真实的人类触觉反馈,能做的只是在特定的内容和场景中尽量满足用户的反馈体验.比如在VR游戏中抓取武器和物品时,几厘米的偏差,没有准确还原物体材质和纹路,对用户的实际体验影响并不大.除了高精度的外设,要实现触觉或力反馈,还需要强大的物理引擎,虚拟世界中的复杂物体的建模.与用户肢体的触碰非

简单第一人称射击游戏

克隆炮弹和硝烟的预制体. 1 using System.Collections; 2 using System.Collections.Generic; 3 using UnityEngine; 4 5 public class TankFire : MonoBehaviour { 6 7 public Transform fire_point;//发射点Transform 8 9 /// <summary> 10 /// 子弹的预设体(预先, 设置, 游戏物体) 11 /// </su

libgdx学习记录21——Box2d物理引擎之碰撞Contact、冲量Impulse、关节Joint

Box2d中,物体可以接受力(Force).冲量(Impulse)和扭矩(Torque).这些物理元素都能改变物体的运动形式,并且默认都会唤醒物体,当然只是针对动态物体. 力是一个持久的效果,通过Box2d内置的积分器实现运动变化. 冲量是一个瞬时效果,能立马改变其效果. 主要函数: body.applyLinearImpulse( Vector2 impulse, Vector2 position, boolean wakeup ) 第一个参数表示冲量,包含x和y方向的大小. 第二个参数表示施

【Unity】11.6 恒定力 (Constant Force)

分类:Unity.C#.VS2015 创建日期:2016-05-02 一.简介 恒定力 (Constant Force) 是用于向刚体 (Rigidbody) 添加恒定力的快速实用工具,适用于类似火箭等发射出来的对象,这些对象在起初并没有很大的速度但却是在不断加速. 如果您不希望单次发射对象(如火箭)以较大速率启动而是希望缓慢地进行加速,则这十分适用于这类对象. 下图是由恒定力 (Constant Force) 向前推动的火箭: 二.相关属性 1.Force (力) 在世界坐标空间中应用的力的向

个人阅读作业2:结合《No Silver Bullet》谈谈我在软件开发过程的遇到的困难与体会

英文捉急,只能挑一段看得比较懂的,而且正好和我们现在编程任务联系比较紧密的内容来谈一谈体会. 在<No Silver Bullet>中,作者描述了造成软件本质性困难(essence)的四个原因: 1.复杂性(complexity): 首先我们来看一下作者对软件的定义,其大意是“软件的本质是对一连串相关的概念的构建”: The essence of a software entity is a construct of interlocking concepts: data sets, rela

Bullet 刚体与软体的碰撞 collisions between rigidbody and softbody in Bullet

上一篇文章做了一个bullet刚体自由落体的模拟,这篇文章模拟软体与刚体的碰撞,并且让软体保持碰撞后的形状.关于软体的参数配置如下: btSoftBody::Config : btSoftBody::Config::aeromodel; // Aerodynamic model (default: V_Point) define what kind feature is used to compute aerodynamic forces. btSoftBody::Config::kVCF; /

&lt;BEA-000388&gt; &lt;JVM called WLS shutdown hook. The server will force shutdown now&gt;

在生产weblogic部署环境,发现weblogic每隔几个小时就shutdown一次,经过跟踪发现既不是内存问题,也不是数据库连接池问题,更不是访问量过大引起. 查询相关日志,只有以下几句shutdown的日志: <BEA-000388> <JVM called WLS shutdown hook. The server will force shutdown now> <BEA-000396> <Server shutdown has been request

mysql force index() 强制索引的使用

mysql force index() 强制索引的使用 之前跑了一个SQL,由于其中一个表的数据量比较大,而在条件中有破坏索引或使用了很多其他索引,就会使得sql跑的非常慢... 那我们怎么解决呢? 这时候我么可以使用mysql force index() 强制索引来优化查询语句: 使用MySQL force index 强制索引的目的是对目标表添加最关键的索引,使其优先使用该索引筛选数据: select * from ws_shop a where date(create_time-inter

Apache Torque入门学习

Introduction Apache Torque is an object-relational mapper for java. In other words, Torque lets you access and manipulate data in a relational database using java objects. Unlike most other object-relational mappers, Torque does not use reflection to