まず,ここにあるODEのFAQを読んでからコメントお願いします.
ODE質問・要望5!のコメントがちょうと100件になりましたので,新しい質問や要望はこちらにお願いします! ご質問の内容を詳しく説明して頂けると的確に回答できますので,時間を節約できると思います.
また、私のコメントやご自分の努力により問題が解決 された場合に、問題の原因がわかれば投稿して頂くと大変助かります。その情報はODEの初心者にとって重要なものです。ある程度たまりましたらFAQに掲 載したいと思いますのでご協力のほどよろしくお願いします。
コメント
ポッターさん,
言葉足らずですみません.何度もウインドウが開いては閉じるという意味でした.ポッターさんの現象を確認できました.確かに,球だと2回目以降は表示されません.Linuxでも同様な現象を確認できましたが,原因を特定できていません.
ウインドウを試行毎に閉じたり開いたりする必要はないと考えますので,以下のコードではだめでしょうか?大きさ,質量,反発係数などはsimLoop関数の if (simtime > 3000) { }の中でお好きなように設定してください.
void simLoop(int pause)
{
static int simtime = 0;
dWorldStep(world, 0.01);
dsSetColor(1.0, 0.0, 0.0);
const dReal *pos = dBodyGetPosition(apple);
const dReal *R = dBodyGetRotation(apple);
dsDrawSphereD(pos,R,r);
printf(“apple position z=%f\n”,pos[2]);
simtime++;
if (simtime > 3000)
{
//dsStop();
simtime = 0;
dBodyDestroy(apple);
apple = dBodyCreate(world);
dMass mass;
dMassSetZero(&mass);
dMassSetSphereTotal(&mass,m,r);
dBodySetMass(apple,&mass);
dBodySetPosition(apple, 0, 0, 2);
}
}
int main(int argc, char **argv)
{
setDrawStuff();
world = dWorldCreate();
dWorldSetGravity(world, 0, 0, -0.01);
//while (1)
//{
apple = dBodyCreate(world);
dMass mass;
dMassSetZero(&mass);
dMassSetSphereTotal(&mass,m,r);
dBodySetMass(apple,&mass);
dBodySetPosition(apple, 0, 0, 2);
dsSimulationLoop(argc, argv, 640, 480, &fn);
//}
dWorldDestroy(world);
return 0;
}
でむ
でむさん,
質問ですが,私が載せたプログラムをでむさんの環境で実行した場合,描画ウインドウがたくさん表示されるのでしょうか?
私の環境(windows xp, msys, ode0.9)の場合,描画ウインドウが表示されて,時間が来ると閉じて,改めてウインドウが表示されています.このとき,球だと二回目以降のウインドウで赤い玉が描画されず,ボックスだと描画されています.
申し訳ないですが,簡単な繰り返し計算のプログラムを教えていただけませんか?
例えば同じappleが落下するプログラムで,1回目と2回目で大きさや重さ,反発係数などのパラメータが変化するものが良いのですが...
宜しくお願いします.
たくさん,
ハードウェアベースのDEPサポートですか。勉強になりました。また,何かありましたらコメントください。
でむ
でむさん,こんにちは
返答ありがとうございました。
返事が遅くなってすいません。
1月前にデータ実行防止について質問した件ですが、無事demo_basket.exeを起動できました。システムプロパティからは解決できなかったのですが、
BIOSの設定変更からできました。理由はプロセッサがハードウェアベースのDEPをサポートしていたからでした。
やっとこれではじめられます。
ありがとうございました。
たろーさん,
お久しぶり。
ODEはオープンソースですから,ご自分でソースを書き換えれば何でもできます。
drawstuff.cppの1080行目にあるdsDrawFrame()の1114行目から光源の設定なのでそれを変更すれば良いと思います。なお,drawstuffはOpenGLを使っているのでOpenGLの知識が必要です。
でむ
ぽったーさん,
ご質問を誤解していました。さて,見せて頂いたプログラムのようにwhileループの中に,dsSimulationLoopを入れるとウインドウがいくつも開いてしまうのでやらない法が良いと考えます。
スピードをあまり気にしないのなら,simLoop関数の中の描画命令をキーボードや繰り返し回数でON/OFFすれば良いでしょう。スピードを気にする場合はdrawstuffを変更する必要があります。
なお,drawstuffのバグかどうかに関する質問は良くわかりません。私の環境では問題なく球もボックスも表示されました。参考までに環境を教えてください。
ただ,現在,drawstuff上位互換ライブラリを作っていて,球だと表示されますが,ボックスだと表示されない現象が生じています。drawstuffのコードを参考にIrrlichtで作っているので,drawstuffのバグかもしれませんが,原因が特定できていません。
でむ
でむさん,
もしかすると,私の質問が悪くて意図が伝わっていなかったかもしれません...申し訳ないです.
単純にwhile(1)をはずすと,dsStop()の処理のあとシミュレーションが終了してしまいます.そうではなく,例えば遺伝的アルゴリズムなどのシミュレーションのように,何回も繰り返してシミュレーションをしたいと考えています.
その場合もwhile(1)を使用しないほうがよろしいでしょうか?
ちなみに前回質問したプログラムで,描画を球からボックスに変更するとwhile(1)で繰り返しても描画されました.(ある意味目的を達成できました.)
こちらはdrawstuffのほうのバグでしょうか...
お久しぶりです、でむさん。
一つ質問がありますのでご回答いただければ幸いです。
ODEのシミュレーションの画面の照明条件を変えて
実行することはできるのでしょうか?
具体的には、全体を明るくしたり、暗くしたりなどです。
描画関連だからdrawstuffあたりを見ているのですが、いまいち
わかりません!
demu さん,
drawstuff.cpp を見たら簡単な記述でピラミッドグリッドを描画していたので,すぐに変更できまた.
ありがとうございました.
ぽったーさん,
OFF会?やりましたよね。
さて,ソースコードを読んだところdsSimulationLoopをwhile文に入れているところがおかしいです。 dsSimulationLoopの中身はwhile文になっているので必要ありません。whileに入れるとウインドウがいくつも生成されてしまいます。
私の環境(Windows Vista, g++, ODE0.10.1)では,while文を取ると問題なくうまくいっています。while文をとって試してみてください。他のことが原因かもしれません。
でむ
skasaiさん,
drawstuff.cppのコードをいじる必要があります。地面のマーカーはピラミッドグリッドと呼ばれています。
1044行目から1077行目にあるdrawPyramidGrid()のfor文をいじれば簡単に変更可能だと思います。 大きさも簡単に変更できます。1061行目のkの値を変更してみてください。
でむ
でむさん
お久しぶり(?)です,ぽったーです
最近,繰り返し計算を必要とするシミュレーションをプログラムしたところ,なぜかシミュレーションの1回目のみ物体が描画され,2回目以降描画されなくなりました.確認のため,hello.cppをもとに繰り返し計算するプログラムにおいても同様の結果となりました.
ソースファイルを載せますので,確認をして頂けますか?
お忙しいかと思いますが,宜しくお願い致します.
/*———- 以下ソースファイル ———-*/
#include
#include
dWorldID world;
dBodyID apple;
dReal r = 0.2, m = 1.0;
dsFunctions fn;
void simLoop(int pause)
{
static int simtime = 0;
dWorldStep(world, 0.01);
dsSetColor(1.0, 0.0, 0.0);
const dReal *pos = dBodyGetPosition(apple);
const dReal *R = dBodyGetRotation(apple);
dsDrawSphereD(pos,R,r);
printf(“apple position z = %f\n”, pos[2]);
simtime++;
if(simtime > 3000) {
simtime = 0;
dsStop();
}
}
void stop()
{
}
void start()
{
}
void setDrawStuff()
{
fn.version = DS_VERSION;
fn.start = &start;
fn.step = &simLoop;
fn.stop = &stop;
fn.path_to_textures = “../../drawstuff/textures”;
}
int main(int argc, char **argv)
{
setDrawStuff();
world = dWorldCreate();
dWorldSetGravity(world, 0, 0, -0.01);
while(1) {
apple = dBodyCreate(world);
dMass mass;
dMassSetZero(&mass);
dMassSetSphereTotal(&mass,m,r);
dBodySetMass(apple,&mass);
dBodySetPosition(apple, 0, 0, 2);
dsSimulationLoop(argc, argv, 640, 480, &fn);
}
dWorldDestroy(world);
return 0;
}
お世話になります.
地面(z=0の面)には黄色や赤や青のマーカーがあります.
これらマーカーを制御する方法を知りたいです.
特に期待したいのは,z軸方向を含む表示のONOFF,間隔と数の変更です.
色,大きさもいじることができのでしたら,尚うれしいです.
パラメータを変更して,容易に変更可能でしょうか.
drawstuffのソースをいじる必要があるのでしたら,どのあたりでしょうか.
ご教授いただくことできませんか.
yoshiさん,
すみませんが,開発環境(Windows, コンパイラ)とどのページを手順どおりやったか教えてください。
おそらくincludeファイルのパスが設定されていないように思われますが。
でむ
demuさんはじめまして。
C++で手順通りにやって、pro1-1のプログラムをビルドすると
fatal error C1083: include ファイルを開けません。’ode/ode.h’: No such file or directory
という、エラーが出るんですがどうすれば良いですか?
鉄さん,
コメントありがとうございます.
興味深い御指摘なので調べてみたいのですが,9月9日からロボット学会がありその準備のため調べる時間がありません. 開発中のdrawstuff互換ライブラリについてお話する予定ですがあまり進んでいません...
さて,ウェブでは以下のサイトが少し関係ありそうですが試していないのでわかりません.
http://homepage1.nifty.com/herumi/prog/prog90.html
上のページにあるWindowsの演算精度をLinuxと同じ64ビットに変更したらどうなりますか?
また,Windows上ではVC++とgccの値は異なるでしょうか?
お時間があれば試して結果を教えて頂けるとありがたいです.
でむ
でむさん。度々申し訳ありません。
先ほど,ode-src-0.8.zipをインストールし直してtest_basketの例で
バスケットボールの各ステップごとの位置を取得したところ,
やはりVC++とLinuxとでセンサの取得結果の違いがでました。
これは,OSの違いから来るものなのでしょうか?
でむさん.はじめまして.
さっそく質問なのですが,VC++とLinuxとで同じプログラムをコンパイルしたところ,微妙に違う計算結果が現れました.
違う計算結果と言っても,似た値は出力されているのですが,これはどのようなことが原因で起こっているのでしょうか?
ちなみに,このサイトに乗っているセンサの取得実験で確かめました.
toshiさん,
すみませんが,VC#は使ったことがないのでわかりません.
でむ
demuさん初めまして.
これからODEを使って研究を行うのですが,VC++ではなく,VC#を使おうと考えています。
VC#でODEを使えるようにする方法を教えてください.
でむさん、
さっそく返事をいただき、ありがとうございました。
教えて頂いたODE Wikiのページも読んでみました。
OPCODEとGIMPACTをライブラリにしているので、直接使っているのかと思っていました。
Trimeshを使った場合以外は使用していないようですね。
また質問させて頂きます。
Yamaさん,
はじめまして!
ODEでは,AABBしかサポートしていません.つまり,ご自分で実装するしかありません.
なお,衝突検出空間としては,dSimpleSpace, dQuadTreeSpace, dHashSpace, dSAPSpaceを選択可能です.衝突検出に関してはODE Wikiの次のページを是非1読願います.
http://opende.sourceforge.net/mediawiki-1.6.10/index.php/How_Collision_Detection_Works
でむ
じろうさん,
Windows Vista Business, Visual C++ 2008 EEでは問題なくビルドできました.ご使用の環境を教えてください.
でむ
でむさん,こんにちは.
初めて質問します。
OBBによる衝突検出を試したいのですが、どのようにしたらよいでしょうか。
よろしくお願いします。
でむさん,ご指摘ありがとうございます.
ですが,問題の箇所を修正しても同じエラーが出てきてしまいました(><;)
重ねての質問になってしまうのですが,
ポリゴンの描画に使用しているdsDrawTriangleで描画される三角形に
表や裏といった概念はあるのでしょうか?
dsDrawTriangleで描画した図形で
思い通りに面が描かれている部分とそうでない部分があったので・・・
じろうさん,
ソースコードを拝見しましたが,ODEの問題ではなく配列の宣言に問題があるようです.
でむ
tetuさん,
良い本をご紹介頂きありがとうございます.ODEは剛体の動力学計算エンジンなので,人体を剛体近似できない場合の運動解析に利用するのは難しいかもしれません.
また,初音ミクの挙動がおかしいという現象は見ていないのでわかりませんが,恐らく衝突検出の部分だと思われます.ODEは衝突ライブラリとしてOPCODEを標準として使っていますが,GimpactやOPCODEを改善したものもビルドのオプションで利用できるので試してみてはいかがでしょうか?
それでも,だめな場合は,ODEの本家メーリングリストに投稿すると次のバージョンでは改善するかもしれません.ODEはオープンソースなので,利用者がフィードバックすると益々良くなります.
でむ
申し訳ありません、以前に質問したのですが解決しました。
dInitODE();
dCloseODE();
をmain関数に入れることでERRORはなくなり解決しました。
demuさん
ソースプログラムを送付しました.
よろしくお願いします.
ODE0.9で動いていた、自分で作成したcppファイル(segwey.cpp)をode0.10.1で動かそうとしたのですが、
ODE INTEANAL ERROR 2
colliders array not initialized in dcollide()
と表示され動きません。
これを回避するにはどうしたらいいでしょうか?
よろしくお願いします。
じろうさん,
連絡先のメールアドレスにお願いします.
でむ
demuさん,返事が遅れてすみません.
趣味で作ったプログラムなのでソースの公開は問題ありません.
送付先は”連絡先のメールアドレス”でよろしいですか?
ODEで、人体の力学計算が、まったく手つかずというのはあまりに惜しい。
人体の運動学の教科書とかも手に取ってみて、
http://www.ishiyaku.co.jp/search/details.cfm?bookcode=215320
3DCGの動作がどうしておかしいのか考えてほしいです。
初音ミクとかね。
じろうさん,
私も原因を知りたいので,差支えがなければソースコードを送って頂けますか?
差支えがある場合は,その部分を取り除いて送ってください.
基本的にはこのページで公開します.
でむ
キャストの件ですが,
(const dReal *)で引数をキャストしても同様のエラーが出てきました.
floatでpos[3]とR[12]を定義して,dBodyGetPositionとdBodyGetRotationを代入するといった無理やりな方法で一応は実行できるようになりました.
サンプルプログラムは問題なく実行できました.
今後も原因を究明していこうとは思います.
たくさん、
私が試したときはデータ実行防止が働かなかったので原因がよくわかりません。
データ実行防止(DEP)を無効にする方法はネットを探すといろいろありますが、原因がわからないのでお勧めはできません。自己責任でお願いします。
コントロールパネル→システムとメンテナンス→システム→システムの詳細設定→パフォーマンス→設定→データの実行防止→重要なWindowsのプログラム及びサービスついてのみ有効にする(T)にチェックを入れる
でむ
でむさん,はじめまして
インストールについて教えていただきたいことがあります。
講義 Visual C++ 2008 Expression Editionに沿ってインストールしましたが、
データ実行防止が働いて、demo_basket.exeの起動に失敗してしまいました。
使用環境は以下のとおりです。
OS:vista
CPU:intel core2 duo
起動させる良い方法はないものでしょうか。
よろしくお願いします。
でむさん,早速のお返事ありがとうございます.
お盆期間は大学の電源が落とされているため,現在は試せる環境がありません.
来週の月曜日には,経過報告できると思います.
じろうさん,
初めまして
(const dReal *)で引数をキャストしてください。
エラーがでるということは、ODE本のサンプルプログラムもエラーがでますか? 私が、Visual C++ 2008 EEで試したときは問題はなかったと記憶していますが…
でむ
でむさん,はじめまして.
今年度から研究にODEを導入して現在勉強中の者です.
描画についての質問なのですが,
dsDrawSphere,dsDrawCylinderを使用したときに
”1 番目の引数を ‘const dReal *’ から ‘const float []’ に変換できません.(新しい機能 ; ヘルプを参照)
指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です.”
といったエラーメッセージが出てきてしまい実行できなくなってしまいます.
引数としてはdBodyGetPosition(torso.body)などを使用しています.
monoBot.cppなどのdsDrawSphereを使用している他のプログラムはちゃんと実行できます.
開発環境はVisual Stadio 2005 Professional です.
お忙しいと思いますが,どうぞよろしくお願いいたします.
tadaさん,
つくば市へ出張していて返事が遅くなりました.
さて,問題は全部解決したのでしょうか?
でむ
先ほどの質問は解決しました。
dInitODE(); と dCloseODE();
をメイン関数にいれてあげればいいだけでした。
プログラム2.5(ホッピングロボットを作ろう)においてビルドは成功するのですが、
”colliders array not initialized (c:\ode-0.10.0\ode\src\colision_kernel.cpp:256)”
というエラーが出てしまいます。
どのようにすれば解決するのでしょうか?
ご指導ください。
先ほどの問題は単にソースコードの間違いでした。
矢継ぎ早で申し訳ありませんがジョイントをHingeからその他(Ballなど)に変更する時、 ”識別子が見つかりませんでした”
となりコンパイルエラーとなってしまいます。どうすればよいのでしょうか?教えてください。
画像を表示する際
”Bad argument(s)(c:\ode-0.10.0\src\collision_kernel.cpp:462)”
なる表示が出てしまいます。ビルドは成功してるのにどうしてこのようになってしまうのでしょうか?
でむさん、ご返答ありがとうございます。
返事が遅くなってすいません。
わかりました。ありがとうございます。
また質問させてもらうかもしれませんが、そのときはまたお願いします。
かつさん,
おはようございます.
dWorldStep(dWorldID World, dReal stepsize)のstepsizeはシミュレーションを進める時間なので実時間とは直接関係ありません.
シミュレーションの時間と実時間を同一精度で終わらせるためには,シミュレーションの1ステップに要する実時間とstepsizeの時間を同じにする必要があります.
つまり,1ステップ(衝突検出,動力学計算,制御,描画等を全て含む)の時間を毎回計測し,それとstepsizeとの時間差分だけSleep()などを使って時間を調整すれば良いでしょう.
以上です.
でむ
demuさん,こんにちは.
ODE講座12のトルクセンサのプログラムで,x軸周りのトルクの表示をfeedback->t1[0]からfeedback->t2[0]に変更するとTx=4.9となるのはなぜでしょうか?軸周りに力がつりあうのならば,Tx=9.8となるのではないかと思うのですが.ただ単に私に物理のセンスがないだけでしょうか(^ ^;)
おでさん,
ODEは動力学計算エンジンなので,そのようなAPIはありません.回答したキーボードの入力はODEではなく,drawstuffというODE付属の3Dグラフィクスライブラリの機能です.
なお,PCから加速度センサの値を読めれば,その情報をODEで作成したワールドに反映することは可能だとは思います.
こんな回答でよろしいですか.
でむ
>ご回答ありがとうございます。
>言葉が足りなくてすいません。キーボードからの操作はできているのですが、
>加速度センサーなどを使ってPCの外部からも操作出来るんですか?
でむさん,こんにちは.
計算周期(ステップ)について質問があります.
P11にありますが,ODEで設定している0.01秒(10ms)というのは,あくまで計算上のステップであり,実時間とはリンクしない,
つまり,計算負荷が軽く・PCのスペックが高ければ計算それだけ計算スピードは早くなるわけですよね.
そこで質問なんですが,計算周期(タイミング)をWindowsタイマか何かを参照して,実時間のタイミングで計算させることはできるのでしょうか?
もちろん高い精度は無理でしょうが,10秒のシミュレーションを約10秒で終わらせることができたら良いなと思い質問しました.
よろしくお願いします.