船舶的结构动态变化,所以我必须确定当我想顺时针或逆时针旋转飞船时打开哪个推进器。推进器始终是轴对齐与船舶(从来没有在一个角度),或打开或关闭。以下是其中一个可能的设置:
到目前为止,我尝试的是将发射矢量和方向矢量可视化到飞船的质量中心:
不幸的是,我没有走多远。
发布于 2012-10-25 13:10:20
成功!它在这里,它按其应有的方式旋转:
我所做的是:对于每个推进器,我计算扭矩的大小,相对于质量中心。
private function thrustTorque():Float
{
// distToCom is the distance vector between the thruster and center of mass
// fire angle is a unit vector representing the direction of the thruster
var distAngle = Math.atan2(distToCOM.y, distToCOM.x);
var fireAngle = Math.atan2(dir.y, dir.x);
var theta = fireAngle - distAngle;
var torque = distToCOM.length * Math.sin(theta);
return torque;
}
根据维基百科的说法,扭矩管理的方程式是T = rF sin(theta)
,其中:
当玩家按左键时,我检查推进器的扭矩信号--如果小于零,我就启动推进器。正相反的是顺时针旋转。
这也许可以通过使用点积来计算矢量之间夹角的余弦来改进,但是这得等到明天。
最后,这里是一个现场演示。
发布于 2012-10-25 14:39:12
扭矩的一般三维表达式是位移和力的交叉乘积:t=r⨯F.在二维中,扭矩的标量值就足够了,并且只给推进器四个正交的方向,我们可以用分段形式写成:
这里,F是推力器产生的力的大小,rx和ry是从支点到推进器的矢量的x和y分量。正力矩倾向于逆时针方向旋转船舶.使用上述四个公式,推导出每个推力器产生的扭矩的符号是很简单的。
要适度准确地表示物理,不仅需要知道推力的符号,还需要知道推力的总震级和转动惯量。此外,你可能不想简单地激活所有正确排列的推进器来进行旋转。
如图所示,推进器B、D和E的全部功率将使旋转最大化,但也将加速飞船向右行驶。关闭D会防止这种情况发生。如果相反,加速右转是有意的,但顺时针旋转不是,最有效的方法是使C和F在全功率的三分之二与D。
如果这没有超出你想要做的范围,你将不得不为运动方程编写某种求解器,这显然不是一个简单的任务。
发布于 2012-10-26 10:23:40
一些不同的东西。首先,我们需要认识到这是一个约束不足的问题.也就是说,有许多不同的推进器组合,可以发射,以导致旋转在同一方向。我假设在你的情况下,推进器只有两种状态,“开启”和“关闭”,所有推进器输出的力相等。
第二,盯着你的模型,看起来你的“质量中心”实际上不是你的质量中心。幸运的是,这不会影响你的扭矩计算。但是,它会影响你对质量位移中心的计算。我不确定你是否关心这个水平的准确性,因为你的“质量中心”至少是离真正质量中心最近的正方形。
第三,如果你想计算某一个推进器会如何影响旋转,你就正确了,尽管你使用的是一个低效的公式。转矩可以计算为r x F
,它的大小为r*F*sin(theta)
。然而,在这种情况下,计算角度是一种效率低下的方法。相反,您应该直接使用扭矩的跨积定义,因为使用您所拥有的表示会更简单。因为所有的向量都没有z分量,所以交叉积的公式大大简化了。
在不更改计算结果的情况下,我们只需更新代码即可。
private function thrustTorque():Float
{
var torque = distToCOM.x*dir.y-distToCOM.y*dir.x;
return torque;
}
这样做更好(而且更快)。
你在你自己的答案中建议,你的解决方案是在正确的方向上发射所有具有扭矩的推进器。这基本上解决了你问的问题。然而,我希望沿着这条线的某个点,你会发现你的策略不那么令人满意,如果用户按住“旋转”按钮,并且所有推力器都有正扭矩旋转,可能会将它们移动到旋转它们的顶部(我不确定你的模拟的细节程度,如果你真的计算了推进器的力,或者你只是直观地显示他们开火,然后用一个恒定的加速度或什么东西旋转你的模型。)无论哪种方式,你都希望推进器至少能精确地发射)。
你不考虑船上的净力。如果你有任意的推进器量,那么这可能会变成一个相当复杂的问题。然而,由于我们的推进器只有两种状态,所以分析起来很简单。我不知道我们的目标到底是什么,所以我可以想象出两个不同的目标:首先,我们想要最小化总力,同时仍然将扭矩保持在我们想要的方向。其次,我们要最大限度地提高扭矩与总力的比率。
顺便说一句,如果你能想象一个额外的“推进器体积”控制,同时影响所有推进器的功率,那么你可以设置这个控制,这样你的两个解决方案有相同的扭矩,你会看到第二个解只能有一个比第一个更小的位移。然而,我们需要记住,如果有可能启动推进器,使您只旋转和不移动,那么两种解决方案将是相同的。
因此,我们将讨论第二个解决方案,基于上一段的论点。现在,在分析总力时,我们可以简单地注意到,发动机只能指向四个方向。因此,x方向上的总力只是指左的推进器数减去指向右边的数,而y方向的推力也是这样。
在写完这篇文章之后,我不得不考虑更多的算法来优化它。我认为我的文章的其余部分是有帮助的,所以我会发布它,但是当我找到优化这个配置的最佳方法时,我会更新它(我已经想出了几种方法来得到近似的答案,但没有一个是精确的)。
https://gamedev.stackexchange.com/questions/40615
复制