我试图以恒定速度将对象移动到它的目的地(均由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
答案 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()是绝对值