所以我有一个玩家(Box2D盒子)可以用A' 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
}
[编辑2]
数学库使用:GLM
在水平方向上重叠瓷砖什么也没做,但我认为它与此有关但在垂直轴上。当玩家继续转动另一个图块时,无论是否旋转,y值都会略有变化。这可以是向上或向下,只能改变+ -0.003~。当跳跃时,当游戏开始在任何地砖上时,它将回到第一个值。
答案 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类 希望对您有帮助