Cocos Creator3D:分组掩码

推荐:将NSDT场景编辑器加入你的3D工具链
3D工具集:NSDT简石数字孪生

分组掩码

在 Cocos Creator 3D 中,部分物理组件(目前有刚体组件和碰撞器组件)提供了设置分组和掩码的接口。

共享

在 Cocos Creator 3D 中,目前物理元素和节点是一对一的关系,分组和掩码是属于物理元素的,单个节点上的物理组件修改的都是节点对应物理元素的分组和掩码。

原理

只要以下条件为真就会进行检测

(GroupA & MaskB) && (GroupB & MaskA)

例如:两个物理元素AB

A的分组值为1,掩码值为3

B的分组值为2,掩码值为2

算式(1 & 2) && (2 & 3)为假,所以这里A不会和B进行检测。

这里通过B的掩码值为2,可以知道B可检测的组是1,而A在的组是0,所以不检测。

:表达式依赖位运算,javascript中位运算的操作数是32位的,并且最后一位是符号位,为避免超出运算范围,建议组的范围为[0, 31)

分组

设置分组值

以下分组值为3,二进制为11,表示在第01组(从0开始)

const group = (1 << 0) + (1 << 1);
Collider.setGroup(group);

获取分组值

Collider.getGroup();

添加分组值

上述代码基础上,经过以下代码后,分组值为7,二进制为111,所以表示在012组。

const group = 1 << 2;
Collider.addGroup(group);

减少分组值

上述代码基础上,经过以下代码后,分组值为3,所以在01组。

const group = 1 << 2;
Collider.removeGroup(group);
:推荐固定在一个组中,可以把节点的layer属性当作组。 :上述方法接收参数均为十进制数字,为方便理解,此处用二进制解释,开发者熟悉后也可直接传入十进制数字进行分组操作。

掩码

设置掩码值

以下 mask 的值3,二进制为11,表示可检测的组为01

const mask = (1 << 0) + (1 << 1);
Collider.setMask(mask);

获取掩码值

console.log(Collider.getMask());

添加掩码值

上述代码的基础上,经过以下代码后,增加了一个可检测组3

const mask = 1 << 2;
Collider.addMask(mask);

减少掩码值

以下代码去掉了一个可检测组3

const mask = 1 << 2;
Collider.removeMask(mask);
:加减符号的优先级高于位移符号。 :灵活使用分组和掩码可以减少额外检测的消耗。

举例

以下列举了一个简单的使用示例:

定义分组

方式一:定义在一个object

export const PHY_GROUP = {
    Group0: 1 << 0, // 第 0 组,相当于给它取了一个 Group0 的别名。
    Group1: 1 << 1
};

方式二:定义在一个enum中 (typescript only

enum PHY_GROUP {
    Group0 = 1 << 0,
    Group1 = 1 << 1
};

为了能够在面板上设置分组,需要通过cc模块导出的Enum函数,将定义好的分组注册到编辑器中Enum(PHY_GROUP)

:由于历史原因,Enum函数对-1有特殊处理,如果不熟悉,请勿定义值为-1的属性。

使用掩码

掩码可以根据分组进行定义,例如以下示例

  • 定义一个只检测Group1的掩码const maskForGroup1 = PHY_GROUP.Group1;
  • 定义一个可检测Group0Group1的掩码const maskForGroup01 = PHY_GROUP.Group0 + PHY_GROUP.Group1;
  • 定义一个所有组都不检测的掩码const maskForNone = 0;
  • 定义一个所有组都检测的掩码const maskForAll = -1;

查看二进制

在 javascript 的运行环境中通过执行(value >>> 0).toString(2), 可以看到二进制的字符串表示。

查看二进制

碰撞矩阵

碰撞矩阵是对分组掩码配置的进一步封装,它提供了一种更加统一的管理方式,并且使得分组掩码的初始化配置更加便捷,同时也无需书写任何代码,直接在编辑器的项目设置中即可完成配置。

但需要注意的是:目前在开启使用碰撞矩阵时,只能通过碰撞矩阵相关的接口进行更新掩码值,以上setMask相关的接口将会失效。

具体请参考碰撞矩阵设置和碰撞矩阵相关接口

3D建模学习工作室 翻译整理,转载请注明出处!

上一篇:Cocos Creator3D:物理事件 (mvrlink.com)

下一篇:Cocos Creator3D:射线检测 (mvrlink.com)

NSDT场景编辑器 | NSDT 数字孪生 | GLTF在线编辑器 | 3D模型在线转换 | UnrealSynth虚幻合成数据生成器 | 3D模型自动纹理化工具
2023 power by nsdt©鄂ICP备2023000829号