C# Box2d:最大可能线速度?
我想我已经将Box2d配置为对任何物体都有某种最大速度,但我不确定。我施加了一种类似于C# Box2d:最大可能线速度?,c#,xna,box2d,C#,Xna,Box2d,我想我已经将Box2d配置为对任何物体都有某种最大速度,但我不确定。我施加了一种类似于(100000000,100000000)的冲动,身体的移动速度与(100100)一样快,但根本没有那么快 我使用的是Box2d XNA C#端口 我的游戏是自上而下的2d 以下是一些可能相关的代码: private readonly Vector2 GRAVITY = new Vector2(0, 0); public void initializePhysics(ContactReporter c
(100000000,100000000)
的冲动,身体的移动速度与(100100)
一样快,但根本没有那么快
我使用的是Box2d XNA C#端口
我的游戏是自上而下的2d
以下是一些可能相关的代码:
private readonly Vector2 GRAVITY = new Vector2(0, 0);
public void initializePhysics(ContactReporter contactReporter)
{
world = new World(GRAVITY, true);
IContactListener contactListener = contactReporter;
world.ContactListener = contactListener;
}
public void Update(GameTime gameTime)
{
// ...
worldState.PhysicsWorld.Step((float)gameTime.ElapsedGameTime.TotalSeconds, 10, 10);
//...
}
下面是一些应用脉冲的示例代码:
private void ApplyImpulseFromInput()
{
Vector2 movementImpulse = new Vector2();
if (inputReader.ControlActivation(ActionInputType.MOVE_LEFT) == 1f)
{
movementImpulse.X = -Constants.PLAYER_IMPULSE_CONSTANT;
} else if (inputReader.ControlActivation(ActionInputType.MOVE_RIGHT) == 1f)
{
movementImpulse.X = Constants.PLAYER_IMPULSE_CONSTANT; ;
}
if (inputReader.ControlActivation(ActionInputType.MOVE_UP) == 1f)
{
movementImpulse.Y = -Constants.PLAYER_IMPULSE_CONSTANT; ;
} else if (inputReader.ControlActivation(ActionInputType.MOVE_DOWN) == 1f)
{
movementImpulse.Y = Constants.PLAYER_IMPULSE_CONSTANT; ;
}
model.Body.ApplyImpulse(movementImpulse, model.Position);
}
如果常数.PLAYER\u pulse\u常数
在1000f
到1000000000f
之间,玩家最多可以移动(-120,-120)
到(120120)
。如果常数较小,如1f
,则播放机将移动得更慢
此代码用于为游戏世界中的一切设置物理:
controller.Model.BodyDef = new BodyDef();
controller.Model.BodyDef.type = controller.Model.Mobile ? BodyType.Dynamic : BodyType.Static;
controller.Model.Body = worldState.PhysicsWorld.CreateBody(controller.Model.BodyDef);
controller.Model.Body.SetLinearDamping(10.0f);
可能是线性阻尼吗?我将其从10.0f
更改为0
,但没有效果
更新:线性阻尼的古怪:我对使用上述应用脉冲方法移动的身体进行了以下观察:
Linear Damping Max Speed
0f 120
10f 120
50f 120
55f 90
60f 0
70f 0
100f 0
100000f 0
为什么线性阻尼在
50f
和60f
之间有一个灵敏度范围?2.1a版也有同样的问题
我发现在b2Settings.as中更改第128行会有所帮助。
将静态公共常量b2_maxTranslation:Number=2.0更改为更高的数字。
当然,这不是正确的方法,但现在我真的不知道如何正确操作。这不是解决问题的方法。在box2D世界中创建对象时,应该缩小对象的比例。然后,您可以将box2D提供的信息缩放回您的世界大小
比如说,在我的世界里,一个盒子有120像素长。如果我将对象缩小30倍,以便box2d可以正确模拟它,那么我的长方体在box2d世界中的长度将为4“像素”(120/30或对象大小/比例)。现在,假设box2D计算出我的盒子在box2D世界中移动了3个“像素”。然后,我可以抓取这些信息并将其缩放到我的世界大小,这意味着这个盒子只移动了90像素(3*30)。我希望这听起来不要太混乱。我通常很难解释自己。应用冲动的代码可能会很有用。+1可以抵消投票反对的人。这是一个合理的问题。我今天刚刚遇到这个问题,除了我使用的是BX2D的C++版本。评论写道:“物体的最大线速度。这个极限非常大,用于防止数值问题。你不需要调整它。”我的模拟设置为1像素等于1 Box2D单位。我在速度封顶方面也有同样的问题。听起来Box2D希望您将模拟保持在较小的规模。是的,您可以这样做,但这不是正确的方法。见罗伯特的答案。我也有同样的问题,缩小我模拟的大小可以解决问题。+1。来自Box2D手册:“Box2D针对MKS单位进行了调整。将移动对象的大小保持在大约0.1到10米之间。渲染环境和角色时,需要使用一些缩放系统。Box2D测试台通过使用OpenGL视口变换来实现这一点。”使用引擎示例(例如HelloWorld)参照您自己的单位。