1

Windows 7 の Eclipse でパーティクル エンジンに取り組んでいますが、これまで見たことのない問題があります。私は自分のコードにこれを持っています:

float start = startPosition.getY();
p.position.addTo(p.moveVector);

float end = startPosition.getY();
if(start != end){
System.out.println("hit");
}

そして、それはかなり頻繁に印刷されます。これを行った理由は、startPosition が変更されていて、プログラムが台無しになっていたためです。

また、デバッガーに入って、プリンターがヒットしたときの値を調べました。これを最後に取得しました。

これが私のコードです。

粒子エミッタhttp://tinyurl.com/9ahwodx

粒子http://tinyurl.com/8rw979d

ベクトル 3f http://tinyurl.com/9do6v2k

問題のコードは ParticleEmitter の下部にあります。

他に何か見たい、または知りたい場合はお知らせください。ただし、それがすべての関連情報だと思います。

4

2 に答える 2

6

particleEmiterコンストラクターは、startPositionをそれぞれの位置として、一連のパーティクルオブジェクトを作成します。

Javaは参照によって物事を渡します[オブジェクトの共有(オブジェクトの「参照」は値によって渡されるため、全員が同じオブジェクトを共有します)]。したがって、各パーティクルインスタンスは同じVector3fオブジェクトの位置を参照します。

p.position.addTo(...)を実行すると、startPositionだけでなく、パーティクルのすべての位置も変更されます。

パーティクルコンストラクターを呼び出すときに、位置のクローンを作成する必要があります。

編集:

クローンは、「同じ値を持つ新しいオブジェクトを構築する」ための単なる用語です。以下を渡すことにより、ケースバイケースでこれを行うことができます。

new Vector3f(startPosition.x, startPosition.y, startPosition.z)

startPositionの代わりに。

ただし、Vector3fに何らかの状態が発生した場合は、それらの呼び出しを更新する必要があるため、これはそれほど堅牢ではありません。 代わり に呼び出すだけのインターフェースについては、Cloneableを参照してください。startPosition.clone() [えーと、脳が凍る]

編集2:または、指摘したように、Vector3fパラメーターを受け取るVector3fにコンストラクターを配置します。コードはnew Vector3f(startPosition)、Particleコンストラクターに位置を渡すときになります。

于 2012-08-14T03:21:16.777 に答える
2

最初の質問に答えると、1.0E-5 は本質的にゼロです。

全体として、あなたの問題は、float変数を平等に比較しようとしていることだと思いますが、これは決して良いことではありません。私の推測では、値は実際には「変化」しているのではなく、使用される浮動小数点近似を実行するたびに、少し異なる表現になっているstartと思います。endこれは、同じコードが毎回少し異なる動作をしているように見える動作を説明します。

詳細については、こちらをご覧ください。

Java でフロートを比較するために == を使用することの何が問題になっていますか?

于 2012-08-14T03:12:52.483 に答える