以恒定速度移动到一点并不够精确

时间:2013-10-11 11:09:27

标签: math move precision point

我试图以恒定速度将对象移动到它的目的地(均由Vector3表示)。

设定:

destination = gkVector3(1.0f, 0.0f, 1.0f);
myObj = gkVector3(0.0f, 0.0f, 0.0f);
velocity = 0.1;

循环:

gkVector3 direction = destination - myObj;
myObj = myObj + direction * velocity;

if(myObj == destination) {
    gkPrintf("THE SAME!!!!");
}

然后,我想检查对象是否已到达目的地。如果是,将显示一条消息。 当速度设置为1.0时,根本没有问题;但是当我将速度设置为0.1时,对象将永远不会到达目的地,并且不会显示消息。那么,我怎样才能以恒定速度将物体精确地移动到目的地?

* gkVector3代表Ogre3D Vector3

2 个答案:

答案 0 :(得分:0)

我认为您应该阅读一些关于浮点运算的内容。一般来说,使用==测试浮点数的相等性是个坏主意。有关在c ++中比较浮点数的更多信息,请访问here

答案 1 :(得分:0)

我认为问题是gkVector3使用浮点精度并且你得到一个舍入误差(因为在二进制系统中无法精确测量0.1。)这意味着myObj将不完全等于目标。它将具有1e-16阶的错误。

一种解决方案是制作缓冲区。 例如:

epsilon = gkVector3(0.00000001f,0.00000001f,0.00000001f);

if(abs(myObj - destination)< = epsilon)

其中abs()是绝对值