我正在为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)


没有足够的信息可以得知实际情况。

08-17 04:15
查看更多