我目前正在使用Farseer Physics库在XNA中进行一些物理玩具的实验,但是我的问题不是特定于XNA或Farseer-而是任何2D物理库。
我想添加类似“火箭”的运动(我说它像火箭一样,不必一定是火箭,它可以是在水上的飞机或船,也可以是许多类似情况)我的2D场景中的某些对象。我知道如何使用运动学仿真来实现此目的,但是我想使用动态仿真来实现(即随时间施加力)。我对如何实现这一点有些迷惑。
为简化起见,我不需要动力学来旋转几何图形,只需影响 body 的速度即可。我使用的圆几何设置为在Farseer中不旋转,因此我只关心对象的速度。
我什至不确定最好的抽象应该是什么。从概念上讲,我具有 body 当前正在移动的方向(单位矢量),我希望其移动的方向以及一个值,该值表示我希望其改变方向的速度,同时保持速度相对恒定(可接受小的变化)。
我可以直接使用这种抽象,也可以使用类似“rudder”的值来控制对象改变方向的速度(顺时针或逆时针)。
我应该对 body 施加什么样的力来模拟我要寻找的运动?请记住,我还希望能够即时调整火箭的“推力”。
编辑:
我的观察方式,如果我错了,请纠正我,您会有两个力(暂时忽略主推力):
1)您有一个始终与 body 指向相同方向的静态“鳍”。如果 body 旋转,使鳍片不与运动方向对齐,则空气阻力将沿鳍片的长度施加力,该力与运动方向和鳍片之间的角度成比例。
2)您有一个“ Helm ”,可以在指定范围内自由旋转,该范围与 body 的质心相距一定距离(在这种情况下,我们有一个圆)。同样,当该平面不平行于运动方向时,空气阻力会沿 Helm 的长度产生比例力。
换句话说,我的问题是,如何根据空气对鳍和 Helm 的阻力来计算这些比例力?
编辑:
作为引用,这是我编写的用于测试可接受答案的代码:
/// <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());
}
}
在为该程序的输出绘制图形时,您会看到一条漂亮的平滑圆形曲线,这正是我想要的!
最佳答案
如果您已经有了将力和质量与加速度和速度集成在一起的代码,那么您只需要计算所讨论的两个元素中每个元素的单个部分即可。
简而言之,我会暂时忘记鳍,只是说,只要您的火箭弹体与速度成一定角度,它就会产生线性增加的侧向力和阻力。随便玩弄系数,直到它看起来和感觉到您想要的为止。
Drag = angle*drag_coefficient*velocity + base_drag
SideForce = angle*lift_coefficent*velocity
对于 Helm 来说,产生的效果只是片刻,但是除非您的游戏绝对需要进行角动力学,否则要做的简单的事情就是让 Helm 控制在您的每次滴答声中对您的火箭体角进行固定的更改。游戏。
关于c# - 简单的2D火箭动力学,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3231541/