Jer*_*ell 6 c# xna physics 2d farseer
我目前正在使用Farseer Physics库在XNA中试验一些物理玩具,但我的问题不是特定于XNA或Farseer - 而是任何2D物理库.
我想添加"类似火箭"的运动(我说火箭就像它不必是火箭一样 - 它可能是水面上的飞机或船只或任何类似的情况)我的2D场景中的某些对象.我知道如何使用运动学模拟实现这一点,但我想使用动态模拟(即随时间推移施加力)来实现它.我对如何实现这一点感到很遗憾.
为了简化操作,我不需要动力学来旋转几何体,只是为了影响身体的速度.我正在使用一个设置为不在Farseer中旋转的圆几何,所以我只关心对象的速度.
我甚至不确定最好的抽象应该是什么.从概念上讲,我有身体当前移动的方向(单位矢量),我希望它去的方向,以及表示我希望它改变方向的速度的值,同时保持速度相对恒定(小的变化是可接受的).
我可以直接使用这种抽象,或使用类似"舵"值的东西来控制物体改变方向的速度(顺时针或逆时针).
我应该用什么样的力量来模拟我正在寻找的运动?请记住,我也希望能够在飞行中调整火箭的"推力".
编辑:我看到它的方式,并纠正我,如果我错了,你有两种力量(暂时忽略主推力):
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());
}
}
Run Code Online (Sandbox Code Playgroud)
当你绘制这个程序的输出图时,你会看到一个很好的平滑圆形曲线,这正是我想要的!
如果您已经有了将力和质量积分到加速度和速度的代码,那么您只需要计算您正在讨论的两个元素中每个元素的各个部分。
简单地说,我暂时忘记鳍片,只是说只要火箭的主体与其速度成一定角度,它就会产生线性增加的侧向力和阻力。只需调整系数,直到其外观和感觉符合您的要求。
Drag = angle*drag_coefficient*velocity + base_drag
SideForce = angle*lift_coefficent*velocity
Run Code Online (Sandbox Code Playgroud)
对于方向舵来说,产生的效果是一个瞬间,但除非您的游戏绝对需要进入角度动力学,否则更简单的方法是让方向舵控制在每次勾选时对火箭体角度进行固定量的变化。游戏。