言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

久々に ODE

平らな面と直方体がぶつかった時に状況を正確に同じにしても跳ね返る方向が微妙に違う点について、Croquet で問題になるという事が前々から言われていた。ネットワークで使うときに、同じ場所にある自分の四角と相手の四角が違う風に跳ね返ったら世界に矛盾を起こすのだ。ODE の ML では何度も ODE は決定性があると書かれていたので、どうせこれも僕のせいだと色々原因を調べていたのだが、これはやっぱり C で書いても再現する事が分かった(と、Peter Moore さんが調べてくれた)。

多分誤解していたのが、決定性という言葉のニュアンスだったのだろう。C のレベルでは、たとえ乱数を使っていても起動時に種を初期化していれば、毎回同じ答えが得られる。それを決定性と言っていたんだと思うが、僕は同じ条件で跳ね返らすと同じ方向に跳ね返るというのが決定性だと思っていた。

ここで、何故同じ方向に跳ね返る事が難しいかについて。これは特に二つ以上の点で衝突する場合、例えば直方体と平面等で言える。衝突計算は線や面でなく点で行われるため、二つ以上の点が同時にぶつかるとその順序が問題になる。この順序を一定にすると沢山実行した時の結果に偏りが出るだろうし、ランダムだとミクロ的には同じ答えを期待出来ないのだ。