Rob*_*Rob 27 math interpolation rotation
注意:我会在程度上提出这个问题纯粹是为了简单,弧度,度,不同的零轴承,问题基本相同.
有没有人对旋转插值背后的代码有任何想法?给定线性插值函数:Lerp(from,to,amount),其中amount为0 ... 1,返回from和from之间的值.如何将相同的功能应用于0到360度之间的旋转插补?鉴于度数不应该在0和360之外返回.
给定度数的这个单位圆:

从= 45到= 315,算法应该采用到角度的最短路径,即它应该经过零,到360然后到315 - 而不是一直到90,180,270到315.
有没有一个很好的方法来实现这一目标?或者它只是一个可怕的if()块?我错过了一些很好理解的标准方法吗?任何帮助,将不胜感激.
use*_*496 34
我知道这已经2年了,但是我最近一直在寻找同样的问题,我没有看到没有ifs贴在这里的优雅解决方案,所以这里有:
shortest_angle=((((end - start) % 360) + 540) % 360) - 180;
return start + (shortest_angle * amount) % 360;
Run Code Online (Sandbox Code Playgroud)
而已
ps:当然,%表示模数,shortest_angle是保存整个插值角度的变量
Rob*_*Rob 13
对不起,这有点令人费解,这是一个更简洁的版本:
public static float LerpDegrees(float start, float end, float amount)
{
float difference = Math.Abs(end - start);
if (difference > 180)
{
// We need to add on to one of the values.
if (end > start)
{
// We'll add it on to start...
start += 360;
}
else
{
// Add it on to end.
end += 360;
}
}
// Interpolate it.
float value = (start + ((end - start) * amount));
// Wrap it..
float rangeZero = 360;
if (value >= 0 && value <= 360)
return value;
return (value % rangeZero);
}
Run Code Online (Sandbox Code Playgroud)
谁有更优化的版本?
我认为更好的方法是插入sin和cos,因为它们不会受到多重定义的影响.令w ="amount"使得w = 0是角度A并且w = 1是角度B.然后
CS = (1-w)*cos(A) + w*cos(B);
SN = (1-w)*sin(A) + w*sin(B);
C = atan2(SN,CS);
Run Code Online (Sandbox Code Playgroud)
必须根据需要转换为弧度和度数.还必须调整分支.对于atan2 C,回到-pi到pi的范围.如果您想要0到2pi,那么只需将pi添加到C.