【问题标题】:Finding Y angle using X, Y & Z使用 X、Y 和 Z 求 Y 角
【发布时间】:2018-02-22 23:27:29
【问题描述】:

我目前正在使用此代码:

struct vec3_t
{
public:
    float x, y, z;
};

vec3_t Subtract(vec3_t src, vec3_t dst)
{
    vec3_t diff;
    diff.x = src.x - dst.x;
    diff.y = src.y - dst.y;
    diff.z = src.z - dst.z;
    return diff;
}
float Magnitude(vec3_t vec)
{
    return std::sqrt(vec.x * vec.x + vec.y * vec.y + vec.z * vec.z);
}
float Distance(vec3_t src, vec3_t dst)
{
    vec3_t diff = Subtract(src, dst);
    return Magnitude(diff);
}
vec3_t CalcAngle(vec3_t src, vec3_t dst)
{
    vec3_t angles;
    angles.x = (-(float)std::atan2(dst.x - src.x, dst.y - src.y)) / PI * 180.0f + 180.0f;
    angles.y = (std::atan2(dst.z - src.z, Distance(src, dst))) * (180.0f / PI);
    angles.z = 0.0f;

    printf("%f - %f\n", src.z - dst.z, angles.y);


    return angles;
}

但是,当 z 值的增量增加时,我的角度无法完全发挥作用。该角度缺乏陡度,并且指向目标位置上方。

但是,当 Z 轴的 delta 小于 20 时,角度会起作用并瞄准我想要的玩家。

我这里有一些例子:

当增量非常小时

当增量很大时

P.S 我都是从下面来称呼的

vec3_t CurrentPos;
CurrentPos.x = x.ReadMemory<float>(LocalPlayer + PlayerOffsetList["PosX"]);
CurrentPos.y = x.ReadMemory<float>(LocalPlayer + PlayerOffsetList["PosY"]);
CurrentPos.z = x.ReadMemory<float>(LocalPlayer + PlayerOffsetList["PosZ"]);

vec3_t EnemyPos;
EnemyPos.x = Enemy.Posx;
EnemyPos.y = Enemy.Posy;
EnemyPos.z = Enemy.Posz;

vec3_t Result;
Result = AimbotMath.CalcAngle(EnemyPos, CurrentPos);

x.WriteMemory<float>(AddrList["ViewX"], (Result.x + 90.0f));
x.WriteMemory<float>(AddrList["ViewY"], Result.y);

【问题讨论】:

    标签: c++ math trigonometry


    【解决方案1】:

    假设,在您的CalcAngles 方法中,x 是偏航,y 是俯仰:

    vec3_t CalcAngle(vec3_t src, vec3_t dst)
    {
        vec3_t angles;
        vec3_t delta = Subtract(dst, src);
        angles.x = -(float)std::atan2(delta.x, delta.y) / PI * 180.0f + 180.0f;
        //zero out the z to get the *horizontal* distance
        vec3_t horizontal = delta;
        horizontal.z = 0;
        angles.y = std::atan2(delta.z, Magnitude(horizontal)) * (180.0f / PI);
        angles.z = 0.0f;
    
        printf("%f - %f\n", delta.z, angles.y);
    
    
        return angles;
    }
    

    注意,我留下了您的xy 的顺序以及180.0f 的偏移量,因为我认为它对于您的参考点是正确的。通常atan2 接受(y, x)

    【讨论】:

      【解决方案2】:
      std::atan2(dst.z - src.z, Distance(src, dst))
      

      atan2 采用两个轴上的增量,通常是 xy。但是,你用斜边上的距离喂它。这里的第二个参数应该是 y 的差异,可能不是总距离。

      类似:

      angles.x = (-(float)std::atan2(dst.x - src.x, dst.y - src.y)) / PI * 180.0f + 180.0f;
      angles.y = (-(float)std::atan2(dst.z - src.z, DistanceXY(src, dst)) / PI * 180.0f + 180.0f;
      

      我没有测试它,所以您可能需要向上或向下调整符号,或者旋转 90 或 180 度。但形式应该是对的。

      编辑:实际上,您可能只需要使用不使用 z 分量的 2D 距离函数。

      【讨论】:

        猜你喜欢
        • 2013-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-07
        • 2022-01-12
        • 2012-01-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多