我的代码有问题,到处移动的代理突然消失了。这似乎是因为它们的位置在x和y轴上突然变为1.#INF000。我做了一点研究,有人说,如果acos值分别大于或小于1和-1,则可能会发生这种情况,但接着说,如果值也接近,可能会发生这种情况。我添加了一个if语句来检查我是否使用过acos或-1,并且在消失之前的几个帧周期它的求值确实为1,但是我真的不明白能够解决该问题的问题。谁能对此事提供任何启示?

D3DXVECTOR3 D3DXVECTOR3Helper::RotToTarget2DPlane(D3DXVECTOR3 position, D3DXVECTOR3 target)//XY PLANE
{
    //Create std::vector to target
    D3DXVECTOR3 vectorToTarget = target - position;

    D3DXVec3Normalize(&vectorToTarget, &vectorToTarget);

    //creates a displacement std::vector of relative 0, 0, 0
    D3DXVECTOR3 neutralDirectionalVector = D3DXVECTOR3(1, 0, 0);//set this to whatever direction your models are loaded facing

    //Create the angle between them

    if(D3DXVec3Dot(&vectorToTarget, &neutralDirectionalVector) >= 1.0f ||D3DXVec3Dot(&vectorToTarget, &neutralDirectionalVector) <= -1.0f)
    {
        float i = D3DXVec3Dot(&vectorToTarget, &neutralDirectionalVector);
        float j = 0; //ADDED THIS IF STATEMENT
    }

    float angle = acos(D3DXVec3Dot(&vectorToTarget, &neutralDirectionalVector));

    if (target.y > position.y)
    {
        return D3DXVECTOR3(0, 0, angle);
    }
    else
    {
        return D3DXVECTOR3(0, 0, -angle);
    }
}//end VecRotateToTarget2DPlane()

最佳答案

在可能恰好是acos的值上调用+/-1.0是危险的,因为舍入错误可能导致计算出的值超出此范围。

但这很容易解决-改用以下功能:

double SafeAcos (double x)
  {
  if (x < -1.0) x = -1.0 ;
  else if (x > 1.0) x = 1.0 ;
  return acos (x) ;
  }

关于c++ - 取1.0f或-1.0f的acos合法吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8489792/

10-09 13:12