Box2D v2.1.0用户手册翻译 - 第06章 夹具(Fixtures)
原文地址:http://blog.csdn.net/complex_ok/article/details/6719936
[-]
- 内容很多摘自 Aman JIANG(江超宇)翻译的Box2D v2.0.1 用户手册
- 第06章 夹具(Fixtures)
- 关于
- 创建夹具(Fixture Creation)
- 密度(Density)
- 摩擦(Friction)
- 恢复(Restitution)
- 筛选(Filtering)
- 传感器(Sensors)
内容很多摘自
Aman JIANG(江超宇)翻译的Box2D v2.0.1 用户手册
第06章 夹具(Fixtures)
回想一下,形状并不知道物体的存在,可以独立使用。因此Box2D需要提供b2Fixture类,用于将形状附加到物体上。 fixture具有下列属性:
• 关联的形状
• 密度(density),摩擦(friction),恢复(restitution)
• 碰撞筛选标记(collision filtering flags)
• 指向父物体的指针
• 用户数据
• 传感器标记(sensor flag)
这些都会在接下来的小节中描述。
6.2 创建夹具(Fixture Creation)
要创建fixture,先要创始化一个fixture定义,并将定义传到父物体中。
b2FixtureDef fixtureDef;
fixtureDef.shape = &myShape;
fixtureDef.density = 1.0f;
b2Fixture* myFixture = myBody->CreateFixture(&fixtureDef);
这会创建fixture,并将它附加到物体之上。你不需要保存fixture的指针,因为当它的父物体摧毁时,fixture也会自动被摧毁。 你可以在单个物体上创建多个fixture。.
你也可以摧毁父物体上的fixture,来模拟一个可分裂开的物体。你也可以不理会fixture,让物体的释放函数来摧毁附加其上的fixture。
myBody->DestroyFixture(myFixture);
密度(Density)
fixture的密度用来计算父物体的质量属性。密度值可以为零或者是整数。你所有的fixture都应该使用相似的密度,这样做可以改善物体的稳定性。
当你添加一个fixture时,物体的质量会自动调整。
摩擦(Friction)
摩擦可以使对象逼真地沿其它对象滑动。Box2D支持静摩擦和动摩擦,两者都使用相同的参数。摩擦在Box2D中会被精确地模拟,摩擦力的强度与正交力(称之为库仑摩擦)成正比。摩擦参数经常会设置在0到1之间, 也能够是其它的非负数,0意味着没有摩擦, 1会产生强摩擦。当计算两个形状之间的摩擦时,Box2D必须联合两个形状的摩擦参数。这是通过以下公式完成的:
float32 friction;
friction = sqrtf(shape1->friction* shape2->friction);
所以当其中一个fixture的摩擦参数为0时,接触的摩擦就为0。
恢复(Restitution)
恢复可以使对象弹起。恢复的值通常设置在0到1之间。想象一个小球掉落到桌子上,值为0表示着小球不会弹起, 这称为非弹性碰撞。值为1表示小球的速度跟原来一样,只是方向相反, 这称为完全弹性碰撞。恢复是通过下面的公式合成的:
float32 restitution;
restitution = b2Max(shape1->restitution,shape2->restitution);
ixture会携带碰撞筛选信息,让你防止某些游戏对象相互碰撞。
当一个形状多次碰撞时,恢复会被近似地模拟。Box2D使用了迭代求解器,当冲撞速度很小时,Box2D也会使用非弹性碰撞,这是为了防止抖动。
筛选(Filtering)
碰撞筛选是一个防止某些形状发生碰撞的系统。比如,你创造了一个骑自行车的角色。你希望自行车与地形之间有碰撞,角色与地形有碰撞,但你不希望角色和自行车之间发生碰撞 (因为它们必须重叠)。Box2D通过种群和分组支持了这样的碰撞筛选。
Box2D支持16个种群。任意fixture你都可以指定它属于哪个种群。你还可以指定这个fixture可以和其它哪些种群发生碰撞。例如,你可以在一个多人游戏中指定玩家之间不会碰撞,怪物之间也不会碰撞,但是玩家和怪物会发生碰撞。这是通过掩码来完成的,例如:
playerFixtureDef.filter.categoryBits= 0x0002;
monsterFixtureDef.filter.categoryBits= 0x0004;
playerFixtureDef.filter.maskBits =0x0004;
monsterFixtureDef.filter.maskBits =0x0002;
碰撞分组让你指定一个整数的组索引。你可以让同一个组的所有fixture总是相互碰撞(正索引)或永远不碰撞(负索引)。组索引通常用于一些以某种方式关联的事物,就像自行车的那些部件。在下面的例子中,fixture1 和 fixture2 总是碰撞,而 fixture3 和 fixture4 永远不会碰撞。
fixture1Def.filter.groupIndex = 2;
fixture2Def.filter.groupIndex = 2;
fixture3Def.filter.groupIndex = -8;
fixture4Def.filter.groupIndex = -8;
如果组索引不同,碰撞筛选就会按照种群和掩码来进行。换句话说, 分组筛选与种群筛选相比,具有更高的优选级。
注意在 Box2D 中还有其它的碰撞筛选,这里是一个列表:
• static物体上的fixture永远不会与另一个static体上的fixture发生碰撞
• 同一个物体上的fixture永远不会相互碰撞
• 如果两个物体用关节连接起来,物体上面的fixture可以选择启用或禁止它们之间相互碰撞
有时你可能希望在形状创建之后去改变其碰撞筛选。 你可以使用b2Shape::GetFilterData 以及 b2Shape::SetFilterData来访问及设置已存在fixture的b2FilterData结构。注意就算修改了筛选数据,下一个时间步为止,现在的接触并不会增加或删除(见world类)。
6.3 传感器(Sensors)
有时候游戏逻辑需要判断两个fixture是否相交,但却不应该有碰撞反应。这可以通过传感器(sensor)来完成。传感器也是个fixture,但只会侦测碰撞而不产生其它反应。
你可以将任一fixture标记为传感器。传感器可以是static或dynamic的。记住,每个物体上可以有多个fixture, 传感器和实体fixture是可以混合存在的。
传感器不会生成接触点。这里有两种方法得到传感器的状态:
1. b2Contact::IsTouching
2. b2ContactListener::BeginContact 和 EndContact
Box2D v2.1.0用户手册翻译 - 第06章 夹具(Fixtures)相关推荐
- Box2D v2.1.0用户手册翻译 - 第09章 接触(Contacts)
内容很多摘自 Aman JIANG(江超宇)翻译的Box2D v2.0.1 用户手册 第09章 接触(Contacts) 9.1 关于 接触(contact)是由 Box2D 创建的用于管理fixtu ...
- Box2D v2.1.0用户手册翻译 - 第02章 Hello Box2D
内容很多摘自 Aman JIANG(江超宇)翻译的Box2D v2.0.1 用户手册 第02章 Hello Box2D Box2D的发布包中有个Hello World程序.程序创建了一个大大的地面盒( ...
- Box2D v2.1.0用户手册翻译 - 第10章 世界(World Class)
内容很多摘自 Aman JIANG(江超宇)翻译的Box2D v2.0.1 用户手册 第10章 世界(World Class) 关于 b2World类包含物体和关节.它管理着模拟的方方面面,并允许异步 ...
- Box2D v2.1.0用户手册翻译 - 第08章 关节(Joints)
内容很多摘自 Aman JIANG(江超宇)翻译的Box2D v2.0.1 用户手册 第08章 关节(Joints) 8.1 关于 关节用于把物体约束到世界,或约束到其它物体上.在游戏中, 典型例子有 ...
- (转载)BOX2D V2.3.0 用户手册中文版(第2章)-Hello Box2D
(转载)BOX2D V2.3.0 用户手册中文版(第2章)-Hello Box2D Chapter 2 Hello Box2D Box2D的发布包中有个Hello World程序.程序创建了一个大大的 ...
- Box2D v2.1.0用户手册翻译 - 第12, 13, 14章
内容很多摘自 Aman JIANG(江超宇)翻译的Box2D v2.0.1 用户手册 第12章 调试绘图(Debug Drawing) 实现 b2DebugDraw 可得到物理世界的细部图,这里是可用 ...
- (转载)BOX2D V2.3.0 用户手册中文版(第4章)-碰撞模块
Chapter 4 碰撞模块 4.1 关于 碰撞模块包含了形状和操作形状的函数.该模块还包含了动态树(dynamic tree)和broad-phase,用于加快大型系统的碰撞处理速度. 碰撞模块被设 ...
- (转载)BOX2D V2.3.0 用户手册中文版(第8章)-关节
Chapter 8 关节 8.1 关于 关节用于把物体约束到世界,或约束到其它物体上.在游戏中,典型例子有木偶,跷跷板和滑轮.用不同的方式将关节结合起来使用,可以创造出有趣的运动. 有些关节提供了限制 ...
- (转载)BOX2D V2.3.0 用户手册中文版(第11章)-杂项
Chapter 11 杂项 11.1 用户数据 b2Fixture, b2Body 和 b2Joint 类都允许你通过一个 void 指针来附加用户数据.当你测试Box2D数据结构,并使其跟自己游戏引 ...
最新文章
- Ubuntu 14.04 64bit上安装LNMP环境
- python语言由ps f组织所有_python面试题100.docx
- QEMU+KVM学习笔记
- CVPR‘22 最新106篇论文分方向整理|包含目标检测、动作识别、图像处理等32个方向
- 学习几个“××在内存中占几份”的若干问题
- 补丁发布工具1.5.5
- solr java浏览器访问_solr解决访问安全
- 罗永浩卖半价iPhone秒没,网友晒开挂软件,怪不得你抢不到
- 期待!华为或在今年8月/9月推出自家操作系统
- java中对list监听_java – Guava:为ListenableFuture回调和监听器设置默认的Executor
- L2-001 紧急救援(最短路)
- 韩国军事网络指挥中心遭到网络攻击
- 计算机学院部长换届答辩,未来可期,各自精彩——记计算机科学学院2020年两委换届竞职答辩活动...
- 魔兽世界国服服务器稳定,《魔兽世界》国服大服务器功能实装启动
- 使用html2canvas生成海报,阿里云oss图片或网络图片报跨域问题
- linux解压apk文件,关于ipa和apk文件的解压
- 详解Instant类
- Git工具的基本使用(一)
- 机器人遛机器狗,估计不久能看到了
- gt 630 linux驱动下载,Ubuntu 13.04 双显卡安装NVIDIA GT 630M驱动
热门文章
- php把字符串做为代码执行的函数eval
- 申宝投资-市场行情整体比较差
- idea中src/main/resources目录下的applicationContext.xml文件访问src/main/webap目录下的配置文件
- java类 家族成员 姓氏_java题目 将一些学生分别按姓氏分类,每个姓氏的学生输出到一行上。...
- 看我小穷仔和富家MM的经典图聊!!
- 暑期实训第二周周一周二总结
- 利用地球同步卫星在一个1Mbps的信道上发送长度为1000位的帧,该信道的传播延时为27Frames of 1000 bits are sent over a 1-Mbps channel using
- [CSCCTF 2019 Qual] FlaskLight
- VS Code 配置第三方库 类似pygame
- Java 8中Collectors.toMap空指针异常源码分析