Box2D如何阻止玩家(Box)旋转

时间:2016-11-11 18:44:12

标签: c++ box2d physics

所以我有一个玩家(Box2D盒子)可以用A' A'水平移动。和' D'使用:

 SetLinearVelocity(b2Vec2(speed,  object.getB2Object()->GetLinearVelocity().y));

但是当我移动盒子时,播放器不会滑动但是角落上的角色是这样的:

enter image description here

我发现减少箱子和地面的摩擦可以在一定程度上防止这种情况,但仍然会相当规律地发生,也会让玩家在停车时进一步滑动。我已经尝试了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
}

[编辑2]

数学库使用:GLM

在水平方向上重叠瓷砖什么也没做,但我认为它与此有关但在垂直轴上。当玩家继续转动另一个图块时,无论是否旋转,y值都会略有变化。这可以是向上或向下,只能改变+ -0.003~。当跳跃时,当游戏开始在任何地砖上时,它将回到第一个值。

2 个答案:

答案 0 :(得分:0)

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

物体可以重叠少量吗?如果您将size更改为vec3(1.0001, 1, 0)会怎样?

答案 1 :(得分:0)

body类(Box2D)中有两个函数可以帮助您避免不必要的旋转 第一个是:

void SetFixedRotation(bool flag)

希望允许您修复旋转 另一个是:

void SetAngularDamping(float32 angularDamping)

wish将根据您传递给函数的参数设置一定的角阻力 我建议阅读the official Box2D documentation,“第6章:机构”将为您提供有关位置和角度的更多信息(请参阅第29和30页的“阻尼和固定旋转”),或者至少快速浏览一下box2d b2Body类 希望对您有帮助