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



我正在尝试以恒定的速度将对象移动到其目的地(均由 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

我认为

你应该读一些关于浮点运算的知识。一般来说,使用 == 测试浮点数的相等性是一个坏主意。有关在 c++ 中比较浮点数的更多信息,请参阅此处。

我认为

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

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

epsilon = gkVector3(0.00000001f, 0.00000001f

, 0.00000001f);

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

其中 abs() 是绝对值

相关内容

最新更新