- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我目前正在使用 Farseer Physics 库在 XNA 中试验一些物理玩具,但是我的问题并不特定于 XNA 或 Farseer - 但针对任何 2D 物理库。
我想添加类似“火箭”的运动(我说类似火箭的意思是它不一定是火箭 - 它可以是飞机或水上的船或任何数量的类似物情况)对于我的 2D 场景中的某些对象。我知道如何使用运动学模拟来实现它,但我想使用动态模拟(即随时间施加力)来实现它。我有点迷失了如何实现这一点。
为了简化事情,我不需要动力学来旋转几何体,只需要影响 body 的速度。我使用的是在 Farseer 中设置为不旋转的圆形几何体,因此我只关心物体的速度。
我什至不确定最好的抽象应该是什么。从概念上讲,我有 body 当前移动的方向(单位向量)、我希望它移动的方向以及表示我希望它改变方向的速度的值,同时保持速度相对恒定(小的变化是可以接受的)。
我可以直接使用这个抽象,或者使用类似“ Helm ”值的东西来控制对象改变方向的速度(顺时针或逆时针)。
我应该对 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# - 简单的二维火箭动力学,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3231541/
在Rust中通过Rocket返回Json的最简单方法是什么? #[post("/route", data = "")] fn route(someVariable: String) -> String
最近,我对在 OS X(10.10;Python 2.7.6)上运行的一些 matplotlib 代码做了一个简单的更改,注释掉了设置我使用的后端的一行 #matplotlib.use('agg')
我是一名新的 Android 开发人员。我想将我的应用程序与 Facebook 连接。我在以下链接中尝试了 Fb 火箭代码: http://www.androidpeople.com/android-
我正在创建一个投资组合网站,一些项目有静态 HTML 演示,我想根据 URL 中的 ID 提供这些演示。路线如下所示: #[get("/demo//")] fn site_demo(id: usize
这个问题在这里已经有了答案: How do I fix "cannot find derive macro in this scope"? (1 个回答) Why is a trait not imp
我正在使用 Rust 和 Rocket 构建一个简单的 REST API。其中一个端点接受 POST 方法请求,并从请求正文中读取一个大字符串。我不知道如何用 Rocket 做到这一点。 文档描述了如
我是一名优秀的程序员,十分优秀!