Short Int基掩码在C 库子弹中的工作方式
How short int based masks work in C++ library Bullet?
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
我不确定子弹的工作方式,你..
希望这会有所帮助,如果我错了,请纠正我。
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 链表c++插入,所有情况都已检查,但没有任何工作
- Short Int基掩码在C 库子弹中的工作方式