原文地址:http://blog.csdn.net/complex_ok/article/details/6719936

[-]

  1. 内容很多摘自 Aman JIANG(江超宇)翻译的Box2D v2.0.1 用户手册
  2. 第06章 夹具(Fixtures)
    1. 关于
    2. 创建夹具(Fixture Creation)
      1. 密度(Density)
      2. 摩擦(Friction)
      3. 恢复(Restitution)
      4. 筛选(Filtering)
    3. 传感器(Sensors)

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

第06章 夹具(Fixtures)

6.1 关于

回想一下,形状并不知道物体的存在,可以独立使用。因此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)相关推荐

  1. Box2D v2.1.0用户手册翻译 - 第09章 接触(Contacts)

    内容很多摘自 Aman JIANG(江超宇)翻译的Box2D v2.0.1 用户手册 第09章 接触(Contacts) 9.1 关于 接触(contact)是由 Box2D 创建的用于管理fixtu ...

  2. Box2D v2.1.0用户手册翻译 - 第02章 Hello Box2D

    内容很多摘自 Aman JIANG(江超宇)翻译的Box2D v2.0.1 用户手册 第02章 Hello Box2D Box2D的发布包中有个Hello World程序.程序创建了一个大大的地面盒( ...

  3. Box2D v2.1.0用户手册翻译 - 第10章 世界(World Class)

    内容很多摘自 Aman JIANG(江超宇)翻译的Box2D v2.0.1 用户手册 第10章 世界(World Class) 关于 b2World类包含物体和关节.它管理着模拟的方方面面,并允许异步 ...

  4. Box2D v2.1.0用户手册翻译 - 第08章 关节(Joints)

    内容很多摘自 Aman JIANG(江超宇)翻译的Box2D v2.0.1 用户手册 第08章 关节(Joints) 8.1 关于 关节用于把物体约束到世界,或约束到其它物体上.在游戏中, 典型例子有 ...

  5. (转载)BOX2D V2.3.0 用户手册中文版(第2章)-Hello Box2D

    (转载)BOX2D V2.3.0 用户手册中文版(第2章)-Hello Box2D Chapter 2 Hello Box2D Box2D的发布包中有个Hello World程序.程序创建了一个大大的 ...

  6. Box2D v2.1.0用户手册翻译 - 第12, 13, 14章

    内容很多摘自 Aman JIANG(江超宇)翻译的Box2D v2.0.1 用户手册 第12章 调试绘图(Debug Drawing) 实现 b2DebugDraw 可得到物理世界的细部图,这里是可用 ...

  7. (转载)BOX2D V2.3.0 用户手册中文版(第4章)-碰撞模块

    Chapter 4 碰撞模块 4.1 关于 碰撞模块包含了形状和操作形状的函数.该模块还包含了动态树(dynamic tree)和broad-phase,用于加快大型系统的碰撞处理速度. 碰撞模块被设 ...

  8. (转载)BOX2D V2.3.0 用户手册中文版(第8章)-关节

    Chapter 8 关节 8.1 关于 关节用于把物体约束到世界,或约束到其它物体上.在游戏中,典型例子有木偶,跷跷板和滑轮.用不同的方式将关节结合起来使用,可以创造出有趣的运动. 有些关节提供了限制 ...

  9. (转载)BOX2D V2.3.0 用户手册中文版(第11章)-杂项

    Chapter 11 杂项 11.1 用户数据 b2Fixture, b2Body 和 b2Joint 类都允许你通过一个 void 指针来附加用户数据.当你测试Box2D数据结构,并使其跟自己游戏引 ...

最新文章

  1. Ubuntu 14.04 64bit上安装LNMP环境
  2. python语言由ps f组织所有_python面试题100.docx
  3. QEMU+KVM学习笔记
  4. CVPR‘22 最新106篇论文分方向整理|包含目标检测、动作识别、图像处理等32个方向
  5. 学习几个“××在内存中占几份”的若干问题
  6. 补丁发布工具1.5.5
  7. solr java浏览器访问_solr解决访问安全
  8. 罗永浩卖半价iPhone秒没,网友晒开挂软件,怪不得你抢不到
  9. 期待!华为或在今年8月/9月推出自家操作系统
  10. java中对list监听_java – Guava:为ListenableFuture回调和监听器设置默认的Executor
  11. L2-001 紧急救援(最短路)
  12. 韩国军事网络指挥中心遭到网络攻击
  13. 计算机学院部长换届答辩,未来可期,各自精彩——记计算机科学学院2020年两委换届竞职答辩活动...
  14. 魔兽世界国服服务器稳定,《魔兽世界》国服大服务器功能实装启动
  15. 使用html2canvas生成海报,阿里云oss图片或网络图片报跨域问题
  16. linux解压apk文件,关于ipa和apk文件的解压
  17. 详解Instant类
  18. Git工具的基本使用(一)
  19. 机器人遛机器狗,估计不久能看到了
  20. gt 630 linux驱动下载,Ubuntu 13.04 双显卡安装NVIDIA GT 630M驱动

热门文章

  1. php把字符串做为代码执行的函数eval
  2. 申宝投资-市场行情整体比较差
  3. idea中src/main/resources目录下的applicationContext.xml文件访问src/main/webap目录下的配置文件
  4. java类 家族成员 姓氏_java题目 将一些学生分别按姓氏分类,每个姓氏的学生输出到一行上。...
  5. 看我小穷仔和富家MM的经典图聊!!
  6. 暑期实训第二周周一周二总结
  7. 利用地球同步卫星在一个1Mbps的信道上发送长度为1000位的帧,该信道的传播延时为27Frames of 1000 bits are sent over a 1-Mbps channel using
  8. [CSCCTF 2019 Qual] FlaskLight
  9. VS Code 配置第三方库 类似pygame
  10. Java 8中Collectors.toMap空指针异常源码分析