Box2D v2.1.0用户手册翻译 - 第07章 物体(Bodies)

平衡球游戏开发教程 一个游戏的开发例子,主要通过这个例子让大家了解一个游戏的大致思路。 希望对大家有帮助。 立即下载

内容很多摘自
Aman JIANG(江超宇)翻译的Box2D v2.0.1 用户手册

第07章 物体(Bodies)

7.1 关于

物体具有位置和速度。你可以将力(forces), 扭矩(torques),冲量(impulses)应用到物体上。 物体可以是静态的(static), 运动但不受力的(kinematic), 和动态的(dynamic)。这是物体的类型定义:

b2_staticBody

static物体在模拟时不会运动,就好像它具有无穷大的质量。在Box2D内部,会将static物体的质量存储为零。static物体可以让用户手动移动,它速度为零,另外也不会和其它static或kinematic物体相互碰撞。

b2_kinematicBody

kinematic物体在模拟时以一定速度运动, 但不受力的作用。它们可以让用户手动移动,但通常的做法是设置一定速度。kinematic物体的行为表现就好像它具有无穷大的质量,Box2D将它的质量存储为零。kinematic物体并不会和其它static或kinematic物体相互碰撞。

b2_dynamicBody

dynamic物体被完全模拟。它们可以让用户手动移动,但通常它们都是受力的作用而运动。dynamic物体可以和其它所有类型的物体相互碰撞。dynamic物体的质量总是有限大的,非零的。如果你试图将它的质量设置为零,它会自动地将质量修改成一千克。

物体是fixtures的骨架,带着fixture在世界中运动。Box2D中的物体总是刚体(rigid body)。也就是说,同一刚体上的两个fixture,永远不会相对移动。

fixture有可碰撞的几何形状和密度(density)。物体通常从它的fixture中获得质量属性。当物体构建之后,你也可以改写它的质量属性。这将在下面讨论到。

通常你会保存所有你所创建物体的指针,这样你就能查询物体的位置,用于更新图形实体的位置。另外在不需要它们的时候,你也可以使用指针去摧毁它们。

7.2 物体定义(Body Definition)

在创建物体之前你需要先创建物体定义(b2BodyDef)。物体定义含有初始化物体所需的数据。

Box2D会从物体定义中拷贝出数据, 并不会保存它的指针。这意味着你可以重复使用同一个物体定义去创建多个物体。

让我们看一些物体定义的关键成员。

物体类型(Body Type)

本章开始已经说过,有三种物体类型: static, kinematic, 和dynamic。 你应该在创建时就确定好物体类型,因为以后再修改的话,代价会很高。

bodyDef.type = b2_dynamicBody;

物体类型是一定要设置的。

位置和角度(Position and Angle)

物体定义为你提供了一个在创建时初始化位置的机会。这比在world原点下创建物体后再移动到某个位置更高效。

注意

不要在原点创建物体后在移动它。如果你在原点上同时创建了几个物体,性能会很差。

物体上主要有两个让人感兴趣的点。第一个是物体的原点。fixture和关节都是相对于原点而依附到物体上面的。第二个是物体的质心。质心由形状的质量分布决定,或显式地由b2MassData设置。Box2D内部许多计算都要使用物体的质心, 例如b2Body会存储质心的线速度。

当你构造物体定义的时候,可能你并不知道质心在哪里。你可以会指定物体的原点,也可以会以弧度指定物体的角度, 角度并不受质心位置的影响。如果随后你改变了物体的质量属性,那么质心也会随之移动,但是原点以及物体上的形状和关节都不会改变。

bodyDef.position.Set(0.0f, 2.0f);// body的原点

bodyDef.angle = 0.25f * b2_pi;// 弧度制下body的角

阻尼(Damping)

阻尼用于减小物体在世界中的速度。阻尼跟摩擦有所不同,摩擦仅在物体有接触的时候才会发生。阻尼并不能取代摩擦,往往这两个效果需要同时使用。

阻尼参数的范围可以在0到无穷大之间, 0表示没有阻尼,无穷大表示满阻尼。通常来说,阻尼的值应 该在0到0.1之间。通常我不使用线性阻尼, 因为它会使物体看起来有点漂浮。

bodyDef.linearDamping = 0.0f;

bodyDef.angularDamping = 0.01f;

阻尼类似稳定性与性能, 在值较小的时候阻尼效应几乎不依赖于时间步, 值较大的时候阻尼效应将随着时间步而变化。如果你使用固定的时间步(推荐)这就不是问题了。

休眠参数(Sleep Parameters)

休眠是什么意思? 模拟物体的成本是高昂的,所以如果物体更少,那模拟的效果就能更好。当物体停止了运动时, 我们会希望停止模拟它。

当Box2D确定一个物体(或一组物体)已停止移动时,物体就会进入休眠状态。休眠物体只消耗很小的 CPU开销。如果一个醒着的物体接触到了一个休眠中的物体,那么休眠中的物体就会醒过来。当物体上的关节或触点被摧毁的时候,它们同样会醒过来。你也可以手动地唤醒物体。

通过物体定义,你可以指定一个物体是否可以休眠,或者创建一个休眠的物体。

bodyDef.allowSleep = true;

bodyDef.awake = true;

固定旋转(Fixed Rotation)

你可能想一个刚体,比如某个角色,具有固定的旋转角。这样物体即使在负载下,也不会旋转。 你可以设置fixedRotation来达到这目的:

bodyDef.fixedRotation = true;

固定旋转标记使得转动惯量被设置成零。

子弹(Bullets)

游戏模拟通常以一定帧率(frame rate)产生一系列的图片。这就是所谓的离散模拟。在离散模拟中,在一个时间步内刚体可能移动较大距离。如果一个物理引擎没有处理好大幅度的运动,你就可能会看见一些物体错误地穿过了彼此。这被称为隧穿效应(tunneling)。

默认情况下,Box2D会通过连续碰撞检测(CCD)来防止动态物体穿越静态物体。这是通过扫描形状从旧 位置到新位置的过程来完成的。引擎会查找扫描中的新碰撞,并为这些碰撞计算碰撞时间 (TOI)。物体会先被移动到它们的第一个TOI,然后一直模拟到原时间步的结束。

一般情况下,dynamic物体之间不会应用CCD,这是为了保持性能。在一些游戏环境中你需要在动态物体上也使用CCD。比如,你可能想用一颗高速的子弹去射击一块动态的砖头。没有CCD,子弹就可能会隧穿砖头。

在Box2D中,高速移动的物体可以标记成子弹(bullet)。子弹跟static或者dynamic物体之间都会执行CCD。你需要按照游戏的设计来决定哪些物体是子弹。如果你决定一个物体应该按照子弹去处理,使用下面的设置。

bodyDef.bullet = true;

子弹标记只影响dynamic物体。

Box2D执行连续碰撞检测,所以子弹也有可能会错过快速移动的物体。

活动状态(Activation)

你可能希望创建一个物体并不参与碰撞和动态模拟。这状态跟休眠有点类似,但并不会被其它物体唤醒,它上面的fixture也不会 被放到broad-phase中。也就是说,物体不会参于碰撞检测,光线投射(ray casts)等等。

你可以创建一个非活动的物体,之后再激活它。

bodyDef.active = true;

关节也可以连接到非活动的物体。但这些关节并不会被模拟。你要小心,当激活物体时,它的关节不会被扭曲(distorted)。

用户数据(User Data)

用户数据是个void指针。它让你将物体和你的应用程序关联起来。你应该保持一致性,所有物体的用户数据都指向相同的对象类型。

b2BodyDef bodyDef;

bodyDef.userData = &myActor;

7.3 物体工厂(Body Factory)

物体使用world类提供的工厂来创建和摧毁。这让world可以通过一个高效的分配器来创建物体,并且把物体加入到world的数据结构中。

物体可以是dynamic或static的,这取决于质量属性。两种类型物体的创建和摧毁方法都是一样的。

b2Body* dynamicBody =myWorld->CreateBody(&bodyDef);

... do stuff ...

myWorld->DestroyBody(dynamicBody);

dynamicBody = NULL;

注意

永远不要使用new或malloc来创建物体, 否则世界不会知道这个物体的存在,并且物体也不会被适当地初始化。

static物体不会受其它物体的作用而移动。你可以手动地移动static物体,但你必须小心,不要挤压到static物体之间的dynamic物体。另外,当你移动static物体的时候,摩擦不会正确工作。static物体不会和其它static或kinematic物体碰撞。在单个static物体上附加数个形状, 要比多个static物体都只附加单个形状,有更好的性能。在内部, Box2D会设置static物体的质量为零。这使得大部分算法都不必把静态物体当成特殊情况来看待。

Box2D并不保存物体定义的引用,也不保存其任何数据(除了用户数据指针)。所以你可以创建临时的 物体定义, 并重复利用它。

Box2D允许你通过删除b2World对象来摧毁物体,它会为你做所有的清理工作。然而, 你必须小心地将保存在游戏引擎的body指针清零。

当你摧毁物体时,依附其上的fixture和joint都会自动被摧毁。了解这点,对你如何管理fixture和joint指针有重要意义。

7.4 使用物体(Using a Body)

在创建完一个物体之后,你可以对它进行许多操作。其中包括设置质量,访问其位置和速度,施加力,以及转换点和向量。

质量数据(Mass Data)

每个物体都有质量(标量), 质心(二维向量)和转动惯性(标量)。对于static物体,它的质量和转动惯性都是零。当物体设置成固定旋转(fixed rotation),它的转动惯性也是零。

通常情况下,当fixture添加到物体上时,物体的质量属性会自动地确定。你也可以在运行时(run-time)调整物体的质量。你有特殊的游戏方案,需要改变质量时,可以这样做。

void SetMassData(const b2MassData* data);

直接设置物体的质量后,你可能希望再次使用fixture来指定质量。可以这样做:

void ResetMassData();

要得到物体的质量数据,可以通过下面的函数:

float32 GetMass() const;

float32 GetInertia() const;

const b2Vec2& GetLocalCenter()const;

void GetMassData(b2MassData* data)const;

状态信息(State Information)

物体的有多个方面状态。你可以通过下面的函数高效地访问状态数据:

void SetType(b2BodyType type);

b2BodyType GetType();

 

void SetBullet(bool flag);

bool IsBullet() const;

 

void SetSleepingAllowed(bool flag);

bool IsSleepingAllowed() const;

 

void SetAwake(bool flag);

bool IsAwake() const;

 

void SetActive(bool flag);

bool IsActive() const;

 

void SetFixedRotation(bool flag);

bool IsFixedRotation() const;

位置和速度(Position and Velocity)

你可以访问一个物体的位置和旋转角, 这在你渲染相关游戏角色时很常用。通常情况下,你都是使用Box2D来模拟运动,也可以设置位置, 但不怎么常用。

bool SetTransform(const b2Vec2&position, float32 angle);

const b2Transform&GetTransform() const;

const b2Vec2& GetPosition()const;

float32 GetAngle() const;

你可以访问本地坐标系及世界坐标下的质心。许多Box2D的内部模拟都使用质心。通常你不必访问质心。取而代之, 你一般应该关心物体变换。比如,你有个正方形的物体。物体的原点可能在正方形的一个角点,而质心却位于正方形的中心点。

const b2Vec2& GetWorldCenter()const;

const b2Vec2& GetLocalCenter()const;

你可以访问线速度与角速度,线速度是对于质心所言的。所以质量属性改变了,线速度有可能也会改变。


【通信协议-RTCM】MSM语句(1) - 多信号GNSS观测数据消息格式 注释:RTCM响应消息1020为GLONASS星历信息,暂不介绍,前公司暂未研发RTCM消息类型版本的DR/RTK模块,DR/RTK模块仅NMEA消息类型使用注释:公司使用的多信号语句类型为MSM4&MSM7,也应该是运用最广泛的语句类型,例如本人之前在公司开发的工具全是基于MSM7语句类型来进行的。 阅读详情

相关推荐

安卓APP通过CH340实现USB串口通信与设备检测

本文详细介绍了安卓APP通过CH340芯片实现USB串口通信与设备检测的完整流程。从CH340芯片的基础原理到开发环境搭建,再到串口通信的具体实现和错误处理,提供了全面的技术指导。文章还分享了USB热插拔处理、自动重连策略以及性能优化等实战技巧,帮助开发者高效完成安卓与嵌入式设备的通信开发。

weixin_42531925的博客 379

Box2D 物理引擎入门

转自:https://www.jianshu.com/p/7681431618ec 一、什么是Box2D Box2D是一个强大的开源物理游戏引擎,用来模拟2D刚体物体运动和碰撞,由Erin Catto早在2007年用C++语言开发。 Box2D集成了大量的物理力学和运动学的计算,并将物理模拟过程封装到类对象中,将对物体的操作,以简单友好的接口提供给开发者。我们只需要调用引擎中相应的对象或函数,就可以模拟现实生活中的加速、减速、抛物线运动、万有引力、碰撞反弹等等各种真实的物理运动。(引用百度百科) 简

auccy的博客 7159

UE5新手必看:如何在UMG控件中嵌入浏览器实现Web页面展示(附完整步骤)

本文为UE5新手提供了在UMG控件中无缝集成Web浏览器的完整实战指南。详细介绍了从启用WebBrowser插件、创建并配置WebBrowser控件蓝图,到编写动态加载与交互逻辑,以及在游戏关卡中实例化UI的全过程。文章还分享了性能优化技巧与常见问题排查方法,帮助开发者高效实现游戏UI内的Web页面展示与交互。

weixin_29243063的博客 710

box2D斜面摩擦力和sprite朝向的兼顾取舍

问题起源: 一般游戏的主角player的b2Body的fixedRotation属性都设置为true,即不能旋转,这样可以保证player在受到物理冲力的时候不会扭来扭去,比如超级玛丽他的人物模型始终是直立的。当player遇到斜面物体时,它和斜面之间只有一个接触点,这样就没有摩擦力,这会造成player运动状态的失真。 如果将player的fixedRotation设置为f...

maozhuxigood 289

新手必看:四旋翼无人机PID调参实战指南(附常见问题排查)

本文为四旋翼无人机新手提供PID调参实战指南,详细解析Kp、Ki、Kd参数的实际意义及调参技巧,包含常见问题排查方法。通过系统化的调参流程和实用参考表,帮助用户快速掌握无人机飞行控制核心技能,避免常见错误,提升飞行稳定性与响应性能。

k0l1m2n3o的博客 598

【现代人形机器人:从物理建模到大模型驱动的控制与学习】第1章 机器人建模回顾

本章建立读者进行后续控制 / 优化 / 学习工作的数学与计算基础。内容分为三大块:刚体运动学:位姿表示、坐标变换、旋转参数与李代数/李群(指数映射、twist)多关节机构的正/逆运动学:DH 与 POE 两种建模、雅可比矩阵推导、数值/解析逆解方法与奇异性问题约束动力学:拉格朗日公式、牛顿—欧拉递归算法、接触/冲击模型、受约束系统的方程(拉格朗日乘子与互补性条件)每一节同时给出与练习题。假设读者已具备线性代数(矩阵、特征分解、SVD)、多变量微积分与基础力学(牛顿第二定律)知识。

u012133341的博客 183

BOX2D 第七章 物体

第七章 物体 Dec 2nd, 2012| Comments 声明:此文章翻译自Box2D v2.2.0用户手册,仅供学习参考。 7.1 关于(About) 物体有位置和速度。你可以将力,扭矩和冲量作用于物体之上。物体可以是静态物体(static),运动学物体(kinematic)或者动态物体(dynamic)。下面是物体类型的定义: b2_staticBody

u010000785的专栏 767

VS2022编译xlnt库

xlnt是一个用于读写Excel文件的C++库,本文介绍如何用源代码编译静态或动态xlnt库

QQVQQ的博客 7287

Libgdx专题系列:物理引擎篇 Box2D

Box2D的是一个物理引擎库。他是一个用于2D的最流行的物理引擎库中的一个,被用到了许多语言,各种引擎中, 其中就包括咱们使用的这个Libgdx。 Libgdx中的Box2D实现了对于C++引擎的java包装,所以参考文档也可以直接使用C++版本的,official Box2D manual (PDF) 想获得更多的信息可以到Box2D的官网,box2d.org 获得信息。 这里我找到一个

站在巨人的肩膀上 8885

基于FISCO BCOS 部署可升级的 Solidity存证智能合约

本文介绍了基于FISCOBCOS平台的可升级Solidity存证智能合约实现方案。采用透明代理模式,包含逻辑合约、代理合约和管理合约三部分,支持业务逻辑升级而不影响存储数据。详细阐述了合约架构设计、Solidity代码实现、Go SDK交互流程以及完整的部署升级步骤。方案具有数据持久性、版本兼容性和生产就绪等特点,提供了权限控制、输入验证等安全机制,并包含监控管理工具。该实现为企业级区块链存证应用提供了可靠的基础架构,支持后续功能扩展和定制化开发。

分享AI、区块链技术及应用,未来已来 1513

MVDR算法: 自适应波束形成在信号处理领域中扮演着重要的角色。本文将介绍MVDR(最小方差无失真响应)算法,并提供相应的Matlab源代码实现。

MVDR算法是一种用于抑制干扰信号并增强感兴趣信号的自适应波束形成算法。它的基本思想是通过对干扰信号进行空间滤波,使其在感兴趣信号方向上的输出功率最小化。这种方法可以提高信号的质量和可辨识度,特别是在存在多个干扰源的复杂环境中。本文将介绍MVDR(最小方差无失真响应)算法,并提供相应的Matlab源代码实现。使用MVDR算法,我们可以通过对观测信号进行波束形成来抑制干扰信号并增强感兴趣信号。以上是MVDR算法的Matlab实现。的每一列代表一个阵列元素的观测信号。表示期望的波束指向,即感兴趣信号的方向。

HackWhisper的博客 1244

Box2D v2.3.0 用户指南(第八章)

Box2D v2.3.0 用户指南

Han的小站 869

【100分- 求最多可以派出多少支团队】(题目+思路+Java&C++&Python解析+在线测试)

用数组代表每个人的能力,一个比赛活动要求参赛团队的最低能力值为N,每个团队可以由1人或者2人组成,且1个人只能参加1个团队,计算出最多可以派出多少只符合要求的团队。

m0_73659489的博客 313

第07章 物体(Bodies)

内容很多摘自 Aman JIANG(江超宇)翻译的Box2D v2.0.1 用户手册 第07章 物体(Bodies) 7.1 关于 物体具有位置和速度。你可以将力(forces), 扭矩(torques),冲量(impulses)应用到物体上。 物体可以是静态的(static), 运动但不受力的(kinematic), 和动态

MitKey的博客 762

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Box2D v2.1.0用户手册翻译 - 目录,第01章 导言(Introduction)

网上已经有个Box2D用户手册的翻译,但是基于v2.0.1,跟最新手册有很多不对应。 在这里决定将文档的全文再翻译出来,更准确的说是根据网上流传的v2.0.1版本,将最新文档重新整理一遍。 很多内容是直接复制自 Aman JIANG(江超宇)翻译的Box2D v2.0.1 用户手册 Box2D v2.1.0 用户手册

德瑞雨的专栏 835

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Box2D v2.1.0用户手册翻译 - 第11章 杂项(Loose Ends)

内容很多摘自 Aman JIANG(江超宇)翻译的Box2D v2.0.1 用户手册 第11章 杂项(Loose Ends) 11.1 隐式摧毁 Box2D没有使用引用计数。你摧毁了body后,它就确实不存在了。访问指向已摧毁body的指针,会导致未定义的行为。 也就是说,你的程序可能会崩溃。以debug方式编译出的程序,Box2D的内存

complex_ok的专栏 4275

Box2D个人学习笔记 - HelloWorld

参考: 官方Manual和对应翻译的中文手册(感谢译者)。 下面的所有内容基于版本Box2D_v2.2.0。 Hello Box2d 1. 说明: 首先要说明的是,Box2D源码中有一个HelloWorld的例子和一个Testbed的单元测试的例子。这两个都是很多的学习参考。首先,就是从HelloWorld的例子来理解Box2D。 另外,需要说明的是,渲染本身是不属于B

。。。。 6488
上一篇: Box2D v2.1.0用户手册翻译 - 第06章 夹具(Fixtures)
下一篇: Box2D v2.1.0用户手册翻译 - 第08章 关节(Joints)
complex_ok
博客等级 码龄17年 71粉丝 12原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值