我目前正在使用 Farseer Physics 库在 XNA 中试验一些物理玩具,但是我的问题并不特定于 XNA 或 Farseer,而是针对任何 2D 物理库。
我想添加类似“火箭”的运动(我说类似火箭的意思是它不一定是火箭 - 它可以是水上的飞机或船只或任何数量的类似情况)我的 2D 场景中的某些对象。我知道如何使用运动学模拟来实现它,但我想使用动态模拟来实现它(即随着时间的推移施加力)。我对如何实现这一点有点迷茫。
为了简化事情,我不需要动力学来旋转几何体,只需要影响身体的速度。我正在使用在 Farseer 中设置为不旋转的圆形几何图形,因此我只关心对象的速度。
我什至不确定最好的抽象应该是什么。从概念上讲,我有身体当前移动的方向(单位向量),我希望它移动的方向,以及一个表示我希望它以多快的速度改变方向的值,同时保持速度相对恒定(可以接受小的变化)。
我可以直接使用这个抽象,或者使用类似“rudder”值的东西来控制对象改变方向的速度(顺时针或逆时针)。
我应该对身体施加什么样的力来模拟我正在寻找的运动?请记住,我还希望能够在飞行中调整火箭的“推力”。
编辑:我的看法,如果我错了,请纠正我,你有两个力量(暂时忽略主推力):
1)你有一个静态的“鳍”,它总是指向与身体相同的方向。如果主体旋转使得鳍与运动方向不对齐,空气阻力将沿鳍的长度施加力,与运动方向和鳍之间的角度成比例。
2)你有一个“方向舵”,它可以在指定的范围内自由旋转,它与身体的质心有一段距离(在这种情况下我们有一个圆)。同样,当该平面不平行于运动方向时,空气阻力会沿方向舵的长度产生成比例的力。
我的问题是,换一种说法,我如何根据对鳍和方向舵的空气阻力计算这些比例力?
编辑:作为参考,这是我为测试接受的答案而编写的一些代码:
/// <summary>
/// The main entry point for the application.
/// </summary>
static void Main(string[] args)
{
float dc = 0.001f;
float lc = 0.025f;
float angle = MathHelper.ToRadians(45);
Vector2 vel = new Vector2(1, 0);
Vector2 pos = new Vector2(0, 0);
for (int i = 0; i < 200; i++)
{
Vector2 drag = vel * angle * dc;
Vector2 sideForce = angle * lc * vel;
//sideForce = new Vector2(sideForce.Y, -sideForce.X); // rotate 90 degrees CW
sideForce = new Vector2(-sideForce.Y, sideForce.X); // rotate 90 degrees CCW
vel = vel + (-drag) + sideForce;
pos = pos + vel;
if(i % 10 == 0)
System.Console.WriteLine("{0}\t{1}\t{2}", pos.X, pos.Y, vel.Length());
}
}
当你绘制这个程序的输出时,你会看到一个漂亮的平滑圆形曲线,这正是我想要的!