Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Language agnostic 游戏中的单位轮换_Language Agnostic_Math - Fatal编程技术网

Language agnostic 游戏中的单位轮换

Language agnostic 游戏中的单位轮换,language-agnostic,math,Language Agnostic,Math,我在游戏中有一个单位指向一个特定的方向;当转向另一个方向时,应采用可用的最短转弯。该方案从一个特定角度开始,需要一个给定的lerp(线性插值)角度 例如,从10度到350度的倾斜应计算-10的目标角度。相反,从350到10的距离应计算370度 什么算法可以计算这些所需的最终值 编辑::似乎对我需要什么有些困惑 我用线性插值来计算角度随时间的变化。所以,如果我想从10到20,那么结束值需要是20,然后我将从10到20插值,然后右转。然而,类似地,如果我想从20到10,那么从20到10的插值将逆时针

我在游戏中有一个单位指向一个特定的方向;当转向另一个方向时,应采用可用的最短转弯。该方案从一个特定角度开始,需要一个给定的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)的插值将逆时针旋转。

您需要

dist = (end - start + 360) % 360;
if (dist > 180)
   dist = dist - 360;
这会给你一些在-180…180范围内的东西。如果这是你想要的。

你需要

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

这会给你一些在-180…180范围内的东西。如果这就是你想要的。

如果你想要更专注于“末端角度”,这个怎么样:

float startAngle = something, endAngle = something;

endAngle = ((endAngle - startAngle) % 360) + startAngle;
if(endAngle < startAngle - 180) endAngle += 360;
if(endAngle > startAngle + 180) endAngle -= 360;
float startAngle=something,endAngle=something;
endAngle=((endAngle-startAngle)%360)+startAngle;
如果(端角startAngle+180)endAngle-=360;

这将使endAngle尽可能接近startAngle,增量为360。

如果您希望更关注“endAngle”,那么这个怎么样:

float startAngle = something, endAngle = something;

endAngle = ((endAngle - startAngle) % 360) + startAngle;
if(endAngle < startAngle - 180) endAngle += 360;
if(endAngle > startAngle + 180) endAngle -= 360;
float startAngle=something,endAngle=something;
endAngle=((endAngle-startAngle)%360)+startAngle;
如果(端角startAngle+180)endAngle-=360;

这使endAngle尽可能接近startAngle,增量为360。

马丁,我想我明白你的意思。基本上,你只需要增加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;
int current=350;//你现在在哪里
所需的整数=10;//你想去哪里
while(所需<电流)
期望+=360;
int end=所需;
int start=所需的-360;
int delta1=绝对值(端-电流);
int delta2=abs(启动-电流);
int-answer=delta1
马丁,我想我知道你想要什么。基本上,你只需要增加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;
int current=350;//你现在在哪里
所需的整数=10;//你想去哪里
while(所需<电流)
期望+=360;
int end=所需;
int start=所需的-360;
int delta1=绝对值(端-电流);
int delta2=abs(启动-电流);
int-answer=delta1< /代码> 如果你转向一个特定的点,只想知道在这个帧中是顺时针还是逆时针旋转,通常的做法是考虑玩家的方向作为向量,并在它和从玩家到点的向量之间取叉积。如果为正,逆时针转动;如果它是负的,则顺时针旋转。

< P>如果你转向一个特定的点,只想知道在这个帧中是顺时针还是逆时针转动,通常的做法是考虑玩家的方向作为向量,并在它与从玩家到点的向量之间取叉积。如果为正,逆时针转动;如果是负数,请顺时针旋转。

我被你的例子搞糊涂了,假设你总是像你说的那样,试着走最短的一圈。如果你有一个10度的航向,并且想要转向350度,那就是-20度的旋转。如果你有一个350度的航向,并且想转为10度,那也是+20度的旋转。我遗漏了什么吗?是的,我需要计算最终值,而不是增量。从10->350开始的线性插值将顺时针进行,从10->10开始的线性插值将逆时针进行您想要恒定的速度吗?固定时间到达那里?如果你有delta,用它的一小部分来增加你的角度,不要尝试插值。我有一些很复杂的插值函数,我担心现在要改变它们会很困难(实际上不仅仅是线性插值)我被你的例子搞糊涂了,假设你总是像你说的那样走最短的弯。如果你有一个10度的航向,并且想要转向350度,那就是-20度的旋转。如果你有一个350度的航向,并且想转为10度,那也是+20度的旋转。我遗漏了什么吗?是的,我需要计算最终值,而不是增量。从10->350开始的线性插值将顺时针进行,从10->10开始的线性插值将逆时针进行您想要恒定的速度吗?固定时间到达那里?如果你有delta,用它的一小部分来增加你的角度,不要尝试插值。我有一些非常复杂的插值函数,我担心现在很难改变它们(实际上不仅仅是线性插值),你可能还想做一个
如果(dist<180)dist+=360要处理另一个边缘情况。。。比如说,
start
是0,
end
是-710……我不太理解