Short Int基掩码在C 库子弹中的工作方式

How short int based masks work in C++ library Bullet?

本文关键字:子弹 工作 方式 Int 掩码 Short      更新时间:2023-10-16

short int基于基础掩码如何在C 中起作用(例如,子弹中的掩码)?

我看子弹

CollisionFilterGroups { 
  DefaultFilter = 1, 
  StaticFilter = 2, 
  KinematicFilter = 4, 
  DebrisFilter = 8, 
  SensorTrigger = 16, 
  CharacterFilter = 32, 
  AllFilter = -1 
}

看到所有值均为2度,我知道:

short是签名的整数,需要2个字节存储,并且从-32,768到 32,767。

但是如何创建我自己的组:如何计算蒙版交叉点?

例如,除了CollisionFilterGroups之外,如何创建类似:

MyCollisionFilterGroups { 
  Cubes= ?,
  Boxes= ?, 
  Spheres= ?
}

其中

  • 我们希望"飞机"不要与"飞机","盒子"answers"球"碰撞("见")
  • 我们希望"盒子"与其他"盒子"answers"球"碰撞
  • 我们希望"球"不要与"球"碰撞,而是与"盒子"碰撞

基本上,如果它是两个的力量,则意味着在二进制表示中只有一个1位,其余为0,如下:1 = 1,2 = 10,4 = 100,8 = 1000,16 = 10000,依此类推。现在假设a = 1,b = 2,c = 4,d = 8,e = 16,f =32。如果您有一个数字,并且想看看它是否具有A和E:a | b(或)...这将导致10001二进制表示。

说您要测试的A和E是X。仅当X包含a和e:x&(a | e)== x时,以下语句是正确的)等于X。

对于第一个示例x是11001,其中包含a和e。11001&10001将是10001,因此是的,因此您发现X包含A和E。

第二个示例:x是100111,其中包含a,但不包含e。当您使用a | e(10001)的"answers"它时,它将导致000001,它不等于x,因此x不包含。

现在要初始化,如果您希望一个数字包含a,c,e您编写:x = a | c | e

这一切都取决于数字的二进制表示。在您写的示例中,还有一个-1,在二进制表示中为1111..11,这意味着它涵盖了一切。

希望这有帮助

您的问题尚不清楚,但我认为您正在为模拟中的对象设置类别和掩盖位:

MyCollisionFilterGroups { 
    Plane= 64,
    Box= 128, 
   Sphere= 256
}

平面,类别位=平面,蒙版= 0

box,类别bits = box,mask = box sphere(或box | sphere)

球体,类别位=球体,蒙版= box

简而言之,为每个过滤器组创建两个幂一无所有)。

不确定子弹特定的工作方式,但是想法是:

每个对象都有一个碰撞组标志和一个碰撞面具。碰撞组是您对象的分类器(哪种对象)。碰撞蒙版是您的对象与与所有组相撞的所有组(分类器)(通常是从0xffff开始,这意味着它与一切相撞)

在碰撞测试中,它是这样的:

if( obj->group & otherObj->mask
    &&
    obj->mask & otherObj->group )
 ..check collision..

如果您想创建新的组(我不知道子弹的工作方式或允许它),只需设置一个,而尚未设置一个(您在帖子中显示的),我不喜欢用ints编写它,令人困惑,我更喜欢位移动:

DefaultFilter = 1 equals (1<<0)
StaticFilter = 2, equals (1<<1)
KinematicFilter = 4, equals (1<<2)
DebrisFilter = 8, equals (1<<3)
SensorTrigger = 16, equals (1<<4)
CharacterFilter = 32, equals (1<<5)
AnewGroup_Box = (1<<6),
AnewGroup_Sphere = (1<<7)

最终在简短的位数(主要是16个)中。要与您的对象(不是组)相撞的组(而不是组)设置,只需将掩码中的组组合在一起:

myObj->mask = AnewGroup_Box | StaticFilter | DebrisFilter; // groups obj will collide

我不确定子弹的工作方式,你..

希望这会有所帮助,如果我错了,请纠正我。