C++ Box2D如何阻止播放器(盒子)旋转

C++ Box2D如何阻止播放器(盒子)旋转,c++,box2d,physics,C++,Box2d,Physics,因此,我有一个播放器(Box2D盒),可以使用“a”和“D”水平移动,使用: SetLinearVelocity(b2Vec2(speed, object.getB2Object()->GetLinearVelocity().y)); 但当我移动箱子时,玩家不会滑动,而是在角落里扮演这样的角色: 我发现减少箱子和地面的摩擦在一定程度上可以防止这种情况,但这种情况仍然经常发生,而且会使玩家在停车时滑得更远。我尝试过函数SetFixedRotation(true),但这似乎会使玩家停止

因此,我有一个播放器(Box2D盒),可以使用“a”和“D”水平移动,使用:

 SetLinearVelocity(b2Vec2(speed,  object.getB2Object()->GetLinearVelocity().y));
但当我移动箱子时,玩家不会滑动,而是在角落里扮演这样的角色:

我发现减少箱子和地面的摩擦在一定程度上可以防止这种情况,但这种情况仍然经常发生,而且会使玩家在停车时滑得更远。我尝试过函数SetFixedRotation(true),但这似乎会使玩家停止一起移动,大概是在它要旋转的点上。我还尝试了SetAngularVelocity(0),但这仍然会使长方体旋转,尽管速度非常慢。有没有其他方法可以防止玩家在地面上移动时旋转?谢谢

[编辑]

按照pingul的建议,将摩擦力设置为零后,盒子几乎没有旋转。它看起来像是不时被什么东西绊倒,而不是地板上的10块瓷砖,我把它们取下来,然后创建了一块宽瓷砖,问题就解决了!因此,我认为盒子在下一块瓷砖上绊倒了。我的下一个问题是为什么会发生这种情况,因为我知道瓷砖的高度、宽度和位置都相同,如下所示:

//the number of tiles
const unsigned int MAX_TILES = 10;
for(int i = 0; i < MAX_TILES; i++){
                                 //position                       ,size           ,density    ,linear_damping ,friction ,isdynamic,b2World                                    
    tiles.push_back(new GameObject(vec3(6+i-(MAX_TILES/2), -10, 1),  vec3(1, 1, 0),   1.0f    ,1.0f           ,0.5f      ,false   ,world_b2));
    tiles[tiles.size()-1]->Init(); //Some OpenGL stuff for rendering
    tiles[tiles.size()-1]->getMesh()->setTexture(test_sheet.getTexture(2,0)); //gets a texture from sprite sheet class
}
//分幅的数量
const unsigned int MAX_TILES=10;
对于(int i=0;iInit();//一些用于渲染的OpenGL内容
tiles[tiles.size()-1]->getMesh()->setTexture(test_sheet.getexture(2,0));//从sprite sheet类获取纹理
}
[编辑2]

数学库使用:GLM


在水平方向上重叠瓷砖没有任何作用,但我认为这与垂直轴上的瓷砖无关。当玩家转到另一个磁贴时,无论是否旋转,y值都会发生轻微变化。这可以是向上或向下的,并且只能改变+-0.003~。当跳跃时,当游戏在任何地板上开始时,它将返回到第一个值

我不知道您使用的是哪种向量库,但我假设
vec3
使用浮点或双精度作为参数。将
vec3(6+i-(MAX_TILES/2)
转换为浮点数可能会导致对象之间出现小间隙


对象是否可以少量重叠?如果将
大小更改为
vec3(1.0001,1,0)
,会发生什么情况?

body类(Box2D)中有两个函数可能会帮助您实现不需要的旋转 第一个是:

void SetFixedRotation(bool flag)
希望允许您修复旋转 另一个是:

void SetAngularDamping(float32 angularDamping)
wish将根据传递给函数的参数设置角阻力的大小 我建议您阅读“第6章:车身”一节,了解更多有关位置和角度的信息(参见第29页和第30页阻尼和固定旋转),或者至少快速了解box2d b2Body类
我希望这对您有所帮助

那么如果将摩擦力设置为0会发生什么?请检查我的编辑:)谢谢您的耐心。添加了一个编辑2@MajesticHey隐马尔可夫模型。。。您的磁贴代码不应对这种差异负责。如果绘制不同对象的边界框而不是位图,会发生什么?例如,使物体呈现一些非常明显的颜色,并绘制这些颜色。另外,你能展示一下移动角色的代码吗?@MajesticHey你找到解决问题的方法了吗?在某种程度上是的。我没有使用盒子对撞机,而是创建了一个函数来添加一个胶囊对撞机(两个圆圈,中间有一个正方形),解决了这个问题。抱歉,我花了这么长时间才回复,我已经有一段时间没有登录了。我看到了这一点,并认为我需要回答,这样将来人们如果遇到同样的问题,就可以找到解决方案。