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!!!!");
}

次に、オブジェクトが目的地に到達したかどうかを確認したいと思います。はいの場合、メッセージが表示されます。速度が 1.0 に設定されている場合、まったく問題はありません。しかし、たとえば速度を 0.1 に設定すると、オブジェクトは目的地に到達せず、メッセージは表示されません。では、オブジェクトを正確に目的地まで一定の速度で移動するにはどうすればよいでしょうか?

*gkVector3 は Ogre3D Vector3 を表します

4

2 に答える 2

0

問題は、gkVector3 が浮動小数点精度を使用し、丸め誤差が発生することだと思います (バイナリ システムでは 0.1 を正確に測定できないため)。これは、myObj が宛先と正確に等しくないことを意味します。1e-16 のオーダーのエラーが発生します。

1 つの解決策は、バッファーを作成することです。例:

イプシロン = gkVector3(0.00000001f, 0.00000001f, 0.00000001f);

if(abs(myObj - 宛先) <= イプシロン)

abs() は絶対値です

于 2013-10-11T11:24:23.200 に答える