0

我试图以恒定的速度将一个对象移动到它的目的地(均由 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!!!!");
}

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

*gkVector3 代表 Ogre3D Vector3

4

2 回答 2

0

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

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

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

if(abs(myObj - 目的地) <= epsilon)

其中 abs() 是绝对值

于 2013-10-11T11:24:23.200 回答
0

我认为您应该阅读一些有关浮点运算的知识。一般来说,使用 == 测试浮点数的相等性是一个坏主意。有关比较 C++ 中的浮点数的更多信息可以在这里找到

于 2013-10-11T11:22:53.447 回答