HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2010
0314
いなえ「OBAQ」と「OBAQ+HGIMG3」におけるオブジェクトの挙動の再現性5解決


いなえ

リンク

2010/3/14(Sun) 00:41:40|NO.31195

HSP3.21のRC版が公開されていますが、
OBAQのオブジェクトをHGIMG3で表示できるとのことでいろいろ試しておりました。
ところでOBAQをそのまま用いた場合と、
hgobaq命令によってHGIMG3でOBAQのオブジェクトを表示するようにした場合とで
オブジェクトの挙動が異なってくるようです。
下のスクリプトはその確認用で、hgFlagの値で状況を切り替えるようになっています。
できればOBAQ開発者にお答えいただきたいのですが、
両者の物理演算に何らかの相違が存在するのでしょうか。
ご返答よろしくお願いいたします。


#include "hgimg3.as" #include "obaq.as" hgFlag=0 ; [0] HGIMG3未使用 [1] HGIMG3使用 if hgFlag=1{ hgini } qreset if hgFlag=1{ qgetptr obaq_ptr hgobaq obaq_ptr } qborder -80,-60,80,60 repeat 64 qaddpoly obj, 4, 5+(cnt\16)*10,5+(cnt/16)*10,cnt,3,3 loop *main if hgFlag=0{ redraw 0 color boxf } qexec if hgFlag=1{ hgdraw hgsync 10 } else{ qdraw redraw await 10 } goto *main



この記事に返信する


おにたま(管理人)

リンク

2010/3/14(Sun) 01:57:06|NO.31197

相違というのは、表示時の微妙な揺れ(ぶれ)を指しているのでしょうか。
物理エンジン自体は、OBAQのDLLを使用しているので計算はHGIMG3を使った場合でも、そうでない場合でもまったく同一です。
HGIMG3表示時の方が挙動が落ち着いて見えるのは、OBAQで演算した結果(頂点座標)を浮動小数のままで表示に反映しているためです。
HGIMG3を使用しない場合は、API(GDI)がそもそも座標を整数でしか受け取らないので、小数以下の情報が失なわれてしまいます。
当然、HGIMG3(DirectX)による描画の方が精度が高くなるわけで、このあたりが表示上の誤差として表れているのではないかと思います。



いなえ

リンク

2010/3/14(Sun) 16:36:30|NO.31223

>おにたま様
ご返答ありがとうございます。
上のスクリプトでhgFlagの値を変化させて実行しますと、
ひとしきり跳ね上がり等が終わった後のオブジェクトの配置が明らかに異なるため
物理演算の計算時に何らかの相違があるのではと思い、投稿いたしました。
「挙動が落ち着いて見える」等の相違は気にしていません。

具体的には、安定時にオブジェクトが大体2列に並びますが、
「斜めになっているオブジェクトがhgFlag=0では2つ、hgFlag=1では1つ」
「上列を左から見ていくとhgFlag=0では1,4,…、hgFlag=1では1,2,…のようにかたまっている」
などなど、配置が異なります。

環境依存なのかもしれませんが、
何らかの理由があるのではと思い、質問させていただきます。
もしかすると、計算時に浮動小数点の有効桁数が異なったりするのでしょうか。
ご返答よろしくお願いします。



mono

リンク

2010/3/15(Mon) 20:57:33|NO.31267

DirectXは速度を稼ぐために内部でFPUの演算精度を落とすようになっているので、
このことが計算結果に影響しているかもしれません。
CreateDeviceの呼び出し時にD3DCREATE_FPU_PRESERVEをセットすれば回避できますが、
その場合は速度が若干落ちるようです。



おにたま(管理人)

リンク

2010/3/15(Mon) 22:42:21|NO.31274

いなえさん、monoさん返信ありがとうございます。
確かに動作が異なっていたので調べてみました。
結論から言うとDirectXの初期化時に浮動小数演算ユニット(FPU)の精度がfloat(単精度)に変更されたことが原因でした。
OBAQ内部はすべてfloatで計算していたのでこの影響は受けないと思いこんでいたのですが、どうも数学関数が返す値など一部の計算で異なる値が出てきているようです。
ご報告ありがとうございました。
とりあえず、HSP3.21RC3ではFPU精度の変更を行なうかどうかをオプションで設定できるようにしてみました。
http://www.onionsoft.net/wp/archives/184

FPU精度を変更しなければ、通常と同じ結果になるのが確認できるかと思います。
尚FPU精度の詳細は、D3DCREATE_FPU_PRESERVE等のキーワードで検索してみてください。



いなえ

リンク

2010/3/16(Tue) 11:07:13|NO.31285

>mono様、おにたま様
早急の返信ならびに対処、誠にありがとうございます。
同じ結果が得られることを確認致しました。
今後ともよろしくお願い致します。



ONION software Copyright 1997-2018(c) All rights reserved.