2010-02-12 44 views
0

我在游戏中有一个单位,指向特定的方向;当它转向另一个方向时,应该选择最短的转弯。该方案以特定角度开始,并且需要一个给定的角度来指向lerp(线性插值)。游戏中的单位轮换

例如,从10度倾斜到350度应计算-10的目标角度。相反,从350到10的顶峰应计算370度的末端。

什么算法可以计算这些所需的最终值?

编辑::好像有过什么,我需要

我使用线性插值随着时间的推移,计算角度有些混​​乱。所以,如果我想从10到20,那么最终值需要是20,然后我将从10到20插入并右转。但是,同样如果我想从20到10,那么从20到10的插值将逆时针旋转,这也可以。问题是什么时候顺时针方向转180度以上,270度到80度(210度)需要顺时针转动,直接插补270到80会逆时针转动,我需要从270到420插补(360度+80),它将逆时针旋转。

+0

如你所说,假设你试图总是采取最短的转向,我对你的例子感到困惑。如果你有一个10度的航向并想转向350度,那就是-20度的旋转。如果你有350度的航向,并且想要转向10,那也是+20度的旋转。我错过了什么吗? – 2010-02-12 13:39:01

+0

是的,我需要计算_end value_而不是delta。从10→350的线性插值将顺时针旋转,从10→-10的线性插值将逆时针旋转 – Martin 2010-02-12 13:48:25

+0

您想要恒定速度吗?固定时间去那里?如果你有三角洲,使用(的一小部分)来增加你的角度,不要尝试插值。 – phkahler 2010-02-12 14:30:53

回答

1

如果你想要的东西更侧重于“终止角”,这个怎么样:

float startAngle = something, endAngle = something; 

endAngle = ((endAngle - startAngle) % 360) + startAngle; 
if(endAngle < startAngle - 180) endAngle += 360; 
if(endAngle > startAngle + 180) endAngle -= 360; 

这带来endAngle接近由startAngle尽可能在360

+0

嗯,我可以证实这一个作品,它的目的是实现结束的角度,并不使用循环 - 得到我的投票:) – Martin 2010-02-15 19:27:17

4

你需要

dist = (end - start + 360) % 360; 
if (dist > 180) 
    dist = dist - 360; 

,让您在范围-180 ... 180的东西。如果那是你想要的。

+0

您可能还想做一个if(dist <180) dist + = 360;'处理另一个边缘情况......其中,例如,“开始”为0,“结束”为-710 ... – 2010-02-12 13:48:45

+0

我不太明白这是如何解决这个问题的?如果我是从180-> 190,然后我想我的最终值是190 ... – Martin 2010-02-12 13:49:13

+0

我刚刚更新了我的问题,我不认为这回答了它(因为我之前很不清楚) – Martin 2010-02-12 13:53:28

1

马丁的增量,我觉得我明白你想要什么。基本上,你只需要添加360到你的最终位置,直到它大于你的开始位置。然后从中减去360。那些可能是你的解决方案的两个绝对角度。那么你的答案只不过是最接近的。

伪/真正的代码:

int current = 350; // where you are now 
int desired = 10; // where you want to go 

while(desired < current) 
    desired += 360; 
int end = desired; 
int start = desired - 360; 

int delta1 = abs(end - current); 
int delta2 = abs(start - current); 
int answer = delta1 < delta2 ? end : current; 
+0

这看起来很有趣。我会和这个一起玩... – Martin 2010-02-15 18:03:37

+0

现在我会说克里斯的答案更紧凑,更优雅,它确实有效(至少在我测试了几个案例的时候)。我的方法的主要优点是它很容易遵循,如果你在深夜起床,你不会理解它。当然,只要你设置了单元测试来检查你的几个角落案例,你甚至不需要去查看它。 ;) – Dave 2010-02-15 23:25:19

0

如果您正在转向一个特定的点,只是想知道是否这个框架中顺时针或逆时针转动,这样做的通常方法是考虑玩家作为矢量的方向,并将其与从玩家到点的矢量之间的交叉乘积。如果是肯定的,逆时针转动;如果是负值,请顺时针转动。