我正在为mmorpg写一个自动化的bot,必要的信息之一就是玩家当前的前进方向。摄像机视角存储在内存中的方式相当复杂。我可以访问三个已命名为CamX1,CamX2和CamY的变量。
CamY是从-.91到+.91的浮点值,0是垂直的。棘手的事情是,通过将其值以10为底的对数传递,将值从其百分比调整为该值,您可以通过查看下面的代码来了解我的意思,该代码使用反对数将值转换为百分比。
CamX1也是从-1到正1的浮点值。当看向W或E时,该值为0。当向南看时,该值为负;当向北看时,该值为正。该变量具有极强的结论性,因为该值通过以10为底的对数传递,但当查找到期N或到期S时的最大值也基于Y的当前值在0.41到1之间变化。用于将CamX1转换为百分比的代码。
CamX2与CamX1相同,只是旋转了90度,所以当面对W或E时,它不是0,当面对N或S时是0。当E时为正,当W时为负。当面对W或E时,它是最大值。最大值像CamX1一样,取决于相机当前的Y视角。
以下代码适用于以下情况:您面对任何基本方向都在10度以内时,例如:当面对350至360度时,该值始终为350,如果您越过北,则该值会跳至10度而不会进行更改,直到经过10度为止,如果您面对80度-90度,则值是80度,90-100度是100度,而101是101,依此类推。 Y值也存在同样的问题,但仅当在0度的10度以内时,从-10到0的值是-.1,并且当您越过0时该值是+.1,直到经过10度,然后正确地增加。如果您仅使用Y变量就可以解释问题,那么我很有可能将其应用于X值问题,并获得完整的解决方案。这是代码:
float GetYFactor()
{
float yAsPercent = (pow(10,abs(CamY)/.91))/10;
if (yAsPercent > 1) yAsPercent = 1;
return 1-(yAsPercent*.59);
}
float GetX1ViewAngleAsPercent()
{
float x1AsPercent = (pow(10,abs(CamX1)/GetYFactor()))/10;
if (x1AsPercent > 1) x1AsPercent = (1 - GetX2ViewAngleAsPercent());
return x1AsPercent;
}
float GetX2ViewAngleAsPercent()
{
float x2AsPercent = (pow(10,abs(CamX2)/GetYFactor()))/10;
if (x2AsPercent > 1) x2AsPercent = (1 - GetX1ViewAngleAsPercent());
return x2AsPercent;
}
float GetCurrentHeading()
{
float deg = GetX1ViewAngleAsPercent() * 90;
if(CamX1 > 0 && CamX2 > 0) //Q1
deg = 90 - deg;
if(CamX1 < 0 && CamX2 > 0) //Q2
deg = 90 + deg;
if(CamX1 < 0 && CamX2 < 0) //Q3
deg = 180 + (90 - deg);
if(CamX1 > 0 && CamX2 < 0) //Q4
deg = 270 + deg;
return deg;
}
之类的原因代码如
if (yAsPercent > 1) yAsPercent = 1;
可能与此问题有关,在接近最大值时,百分比值将增加到1以上,并上升到大约1.15,这是我的快速解决方案。但这并不能完全解决问题。
我知道这是一本很长的读物,非常感谢您的宝贵时间,我们将非常感谢您提供的任何帮助,因为我需要大约+/- 2度的精度,因此这20度的差距相当令人沮丧,也无需担心这种情况我们开始使用的三个值中的任何一个都完全为0,但从未发生过,请尝试。
我相信这与将
最佳答案
我不确定为什么有人会用对数编码角度,典型角度值的数字上溢或下溢应该没有问题。
合理的解释是,线对(x1,x2)对水平方向和y摄像机的仰角进行编码。那么预期的计算将是
radians = atan2(x2,x1)
degrees = radians*180/pi
y的值根本不会进入计算。可能某种半径或速度信息被编码为(x1,x2)的大小,例如
0.5*log(x1^2+x2^2)
没有足够的信息可以得知实际情况。