ODE講座5:Hello World ! こんにちはシミュレーションの世界

2008-7-10: dInitODE(), dCloseODE()の追加


ゲーム開発やロボットの研究者にも使われているオープンソースの物理計算エンジンODE(Open Dynamics Engine、オープン ダイナミクスエンジン)を学ぶODE講座の5回目です。
今回はODE(Open Dynamics Engine)を使った超簡単なサンプルプログラムを紹介します。プログラミングの教科書では初めの例題はHello Worldが定番です。ここでもそうしましょう。
ODE
落下する赤い林檎?上の画像はそのスクリーンショットです。


ODEを使ったシミュレーションの流れを代表的なAPIと関連付けて列挙します。ODE-0.10からdInitODE()で初期化し,dCloseODE()で終了しなければエラーになります.

  • 描画用関数ドロースタッフの設定
    • カメラの設定 dsSetViewPoint()
  • ODEの初期化 dInitODE()
  • 動力学計算の世界worldの生成 dWorldCreate()
  • 重力加速度の設定 dWorldSetGravity()
  • 剛体の生成
    • 質量の設定 dBodySetMass()
    • 位置の設定 dBodySetPosition()
    • 姿勢の設定 dBodySetRotation()
  • シミュレーションループ(この部分は繰り返し実行される)
    • 動力学計算の実施 dWorldStep()
    • シミュレーションに必要な処理を書く
  • 動力学worldの破壊 dWorldDestroy
  • ODEの終了 dCloseODE()
    • dBodyID dBodyCreate(dWorldID world)
      剛体を作り、そのID番号を戻り値として返す
    • const dReal *dBodyGetPosition(dBodyID body)
      剛体bodyの重心位置を取得しそのポインタを返す
    • const dReal *dBodyGetRotation(dBodyID body)
      回転行列を取得しそのポインタを返す
    • void dBodySetMass(dBodyID body, const dMass *mass)
      剛体bodyに質量パラメータmassを設定する
    • void dBodySetPosition(dBodyID body, dReal x, dReal y, dReal z)
      剛体bodyの重心を絶対座標系(x,y,z)の位置に設定する
    • void dBodySetRotation(dBodyID body, const dMatrix3 R)
      剛体bodyを回転行列Rで表す姿勢に設定する
    • dGeomID dCreateBox(dSpaceID space, dReal lx, dReal ly, dReal lz)
      spaceに各辺の長さ(lx,ly,lz)の直方体ジオメトリを生成する
    • dGeomID dCreateCylinder(dSpaceID space, dReal r, dReal l)
      半径r、長さlの円柱ジオメトリを生成し、そのID番号を返す
    • dGeomID dCreatePlane(dSpaceID space ,dReal a, dReal b, dReal c, dReal d)
      spaceにax+by+cz=dの平面ジオメトリを生成する
    • void dGeomSetBody(dGeomID geom, dBodyID body)
      物体の2つの属性であるジオメトリgeomと剛体bodyを関連づける
    • dSpaceID dHashSpaceCreate(0)
      衝突計算用スペースを生成し、そのID番号を返す
    • void dJointGroupEmpty(dJointGroupID)
      接触点が格納されているジョイントグループを空にする
    • void dJointAttach(dJointID joint, dBodyID body1, dBodyID dBody2)
      剛体body1とbody2にジョイントjointを取り付ける
    • dJointGroupID dJointGroupCreate(0)
      接触点のグループを格納するジョイントグループを生成し、そのID番号を返す
    • void dMassSetBoxTotal(dMass *mass, dReal m, dReal lx, dReal ly, dReal lz)
      サイズ(lx,ly,lz)、全質mの直方体の質量パラメータmassを計算する
    • void dMassSetCylinderTotal(dMass *mass, dReal m, int dir, dReal r, dReal l)
      方向dir(1=x,2=y,3=z)、半径r、長さl、全質量mの円柱の質量パラメータmassを計算する
    • void dMassSetZero(dMass *mass)
      質量パラメータmassの要素を0に初期化する
    • void dRFromAxisAndAngle(dMatrix3 R, dReal ax, dReal ay, dReal az, dReal angle)軸ベクトル(ax,ay,az)周りにangle[rad]回転させた時の回転行列Rを求める
    • void dSpaceCollide(dSpaceID space, void *data, dNearCallback *callback)
      spaceで衝突する可能性のある2つのジオメトリを選び出し、引数のcallback関数を呼び出す。dataはcallback関数へ渡すデータへのポインタ
    • dWorldID dWorldCreate()
      物理計算用ワールドを生成し、そのID(識別)番号を戻り値として返す
    • void dWorldDestroy(dWorldID world)
      物理計算用ワールドworldを破壊する
    • void dWorldSetGravity(dWorldID world, dReal x, dReal y, dReal z)
      ワールドworldに(x,y,z)[m/s2]の重力加速度を設定する
    • void dWorldStep(dWorldID world, dReal step_size)
      ワールドworldのシミュレーションを1ステップ進める。2番目の引数step_sizeは積分のステップ時間[s]
    • void dsDrawBoxD(const double pos[3], const double R[12], const double sides[3])位置posに回転行列Rを取るサイズsidesの直方体を描画する
    • void dsSetViewPoint(float xyz[3], float hpr[3])
      視点xyzと視線hpr[°]を設定する
    • void dsSimulationLoop(int argc, char **argv,int w, int h, dsfunction *fn)
      シミュレーションループを呼び出す。1、2番目の引数はmain関数の引数で、3,4番目は描画ウインドウの大きさ(横w,縦h)で、5番目の引数は描画関数クラス

  • 次に、詳しいコメントのついたソースコードを以下に示します。main関数から読んでください。

    [cpp]
    
    / / Hello World  by でむ
    
    #include    // ODEのヘッダーファイル(動力学計算用)
    
    #include // ドロースタッフヘッダーファイル(3Dグラフィクス用)#ifdef  dDOUBLE
    
    #define dsDrawSphere dsDrawSphereD   // 単精度と倍精度の描画関数に対応するおまじない
    
    #endif
    
    static dWorldID world;  // 動力学計算用ワールド
    
    dBodyID ball;          // 玉
    
    const dReal radius = 0.2, mass = 1.0; // 玉の半径(m)、玉の重さ(kg)
    
    // シミュレーションループ 毎回呼び出され実行されます。
    
    // 動力学計算はステップサイズだけをここで指定すれば自動的に計算されます。
    
    // ただし、描画はここで書かないと何も表示されません。
    
    static void simLoop (int pause)
    
    {
    
      const dReal *pos,*R; // 位置、回転行列dWorldStep(world,0.05);  // シミュレーションのステップサイズを0.05秒に設定。
    
    dsSetColor(1.0,0.0,0.0);  // 色のセット。引数は光の3原色(赤、緑、青)。値は0から1.
    
      pos = dBodyGetPosition(ball);  // 玉の位置を取得
    
      R = dBodyGetRotation(ball);   // 玉の姿勢を取得
    
      dsDrawSphere(pos,R,radius);   //赤玉を描画
    
    }
    
    // ドロースタッフの前処理関数
    
    void start()
    
    {
    
      // カメラの設定
    
      static float xyz[3] = {0.0,-3.0,1.0};    // 視点の位置 (x, y, z [m])
    
      static float hpr[3] = {90.0,0.0,0.0};   // 視線の方向(ヘッド、ピッチ、ロール[°])
    
      dsSetViewpoint (xyz,hpr);            // 視点の設定
    
    }
    
    // メイン関数 ここから読んでください。
    
    int main (int argc, char **argv)
    
    {
    
      dReal x0 = 0.0, y0 = 0.0, dReal z0 = 1.0; // ボールの初期位置[m]
    
      dMass m1;   // 質量パラメータ構造体(質量、慣性モーメントなど)
    
    // 描画API(ドロースタッフ)のおまじない(設定)
    
      dsFunctions fn;        // ドロースタッフ構造体
    
      fn.version = DS_VERSION;  // ドロースタッフのバージョン
    
      fn.start = &start;      //  シミュレーションの前処理関数
    
      fn.step = &simLoop;    // シミュレーションの各ステップで呼ばれる関数
    
      fn.command = NULL;     // 関数がないのでNULLポインタを指定
    
      fn.stop    = NULL;    // 関数がないのでNULLポインタを指定
    
      fn.path_to_textures = "../../drawstuff/textures"; // テクスチャへのパス
    
    // 動力学計算用世界の創造
    
      world = dWorldCreate(); // 動力学計算の対象となる剛体を入れるworldを作る。戻り値はそのID番号。
    
      dWorldSetGravity(world,0,0,-0.001); // 重力加速度(x, y, z)の設定  -0.001 m/s^2
    
    // 玉を作る
    
      ball = dBodyCreate(world);        //  剛体(body)を作る。戻り値はそのID番号
    
      dMassSetZero(&m1);             // 質量パラメータm1の初期化
    
      dMassSetSphereTotal(&m1,mass,radius); // 質量パラメータm1に剛体の質量を設定
    
      dBodySetMass(ball,&m1);          // 剛体に質量パラメータm1を設定
    
      dBodySetPosition(ball, x0, y0, z0);     // 剛体ballの絶対座標での位置(x, y, z)を設定
    
    // シミュレーション本体
    
      // argc, argvはmain関数の引数、ウインドウサイズ352 x 288ピクセル, fnはドロースタッフ構造
    
      dsSimulationLoop (argc,argv,352,288,&fn);
    
    // 世界の破壊
    
      dWorldDestroy (world); // 動力学計算の対象となったworldを破壊する
    
    return 0;
    
    }
    
    [/cpp]

    これは赤玉の自由落下のプログラムです。これがなぜHello Worldかというと、上のソースコードでworldは動力学計算をする世界のことです。動力学計算のWorldに初めてお目にかかったのでこのコードもHello Worldと呼ぶことにしましょう。

    また、小文字のdで始まる関数はODEのAPI(application interface)で、dsで始まる関数はdrawstuff(ドロースタッフ)のAPIです。drawstuffはODE付属テストプログラム表示用のライブラリのことです。

    説明はこのぐらいにしてこのファイル(sample1-071001.tgz)をダウンロードして以下の手順で実行してみましょう!

    実行方法
    1. sample1-071001.tgzを/home/ユーザ名/src/ode-バージョン番号/myprogの下にダウンロード
    2. これからはターミナルで以下のコマンドを実行してください。$はプロンプトです。
    $ cd /home/ユーザ名/src/ode-バージョン番号/myprog
    $ tar xvzf sample1-071001.tgz
    $ cd sample1
    $ make
    3. 実行
    $ ./sample1

    ここでは重力加速度を赤玉がゆっくり落下していきますが、なんと地面を通り抜けて消えてしまいます。
    実は上のプログラムには衝突検出機能が組み込まれていなかったのです。
    次回はこのプログラムに衝突検出機能を組み込みます。

    今回登場したAPI


    更新履歴

    • 2008-7-10: dInitODE(), dCloseODE()の追加
    • 2008-4-14: 実行方法のファイル名の間違いを訂正
    • 2008-1-13: ソースコードを整形した
    • 2007-10-1: sample1のmakefileを変更して怒られず済むようにした。
    • 2007-1-20: 本文の説明並びにソースコードのコメントをより詳しくし、API集を収録した。
35 Comments
  1. お返事ありがとうございます。
    インストールをやり直したらsampleが正常に動くようになりました。

    簡単なことで質問してしまいすみません。
    これからもdemuroで勉強を頑張っていきたいと思うのでよろしくお願いします。

  2. mamoさん,

    初めまして.

    windresが見つからないようですね.

    /mingw/bin/windresがありますか?

    windresはMinGWについてくるので,MinGWのインストールが完全にできていない可能性があります.一度,アンインストールしてから,注意深く入れ直してください. 

    でむ

  3. はじめまして。mamoといいます。
    demuro.netを参考にODEの勉強をさしてもらっています。

    今回、講座5のsample1を実行しようとしたのですが、makeをしたときに以下のようなものが出てきてしまい、makeできません。

    windres ../../drawstuff/src/resources.rc -O coff resources.o
    make: windres: コマンドが見つかりませんでした
    make: *** [resources.o] エラー 127

    質問コーナーを参考にし、mekefileでおかしい所がないか見て、いろいろ試行錯誤してみましたが、できませんでした。
    もし、解決法が何かありましたら教えてください。よろしくお願いします。

  4. 初心者Jさん、

    ご連絡ありがとうございました。

    ODE講座のサンプルプログラムは古いので、最新のODEにmakefileが十分に対応できていない可能性もあります。うまくいかない原因のほとんどは、makefileに書いてあるライブラリの場所に、ライブラリがない場合です。

    make installを忘れたり、あるいは、./configure –enable-double-percisionと打つときにスペルミスをしたり、enableの前に” – “が2個必用なのを間違って1個にしたりする場合です。

    また、うまくいかない箇所があればご連絡ください。

    でむ

  5. はじめまして、最近ODEに着手し始めた者です。

    自分も悩める初心者様同様、makeが通らず(同じエラー文が出た)苦戦していましたが、解決できました。
    講義2のcrashが出来た人は、ode-0.9内にある configure configure.in をコピーして、sample1やらsample2に入れて、makeの前に./configure –enable-double-percision
    の後にmakeすればとおりました!

  6. どうにか自己解決することができました。

    1度ODEコンパイルしなおしたらできるようになりました。
    長々と質問してしまい申し訳ありませんでした。
    今後ともよろしくお願いします。

  7. でむさん、
    返信ありがとう御座います。

    エラーは前回上げた分だけです。
    また、講義6のプログラムでも試しましたが同様のメッセージが出てきましたので、何か根本的なところを間違って恐れがあるのでもう少し調べてみます。

  8. 悩める初心者さん、

    サンプルプログラムはsample1-071001.tgzという名前で、サーバーに置いています。ダウンロードする環境によっては強制的に拡張子がtarに変わるようです。

    さて、エラーメッセージですが、これで全部でしょうか?他にもあったら教えてください。情報が少なすぎて原因を特定できません。

    でむ

  9. たびたびすいません。
    追加します。
    先ほどできなかった理由は、tar xvzf sample1-071001.tgzと記載されてますが
    ファイルをプロパティで調べた結果sample1-071001.tarでした。
    tar xvzf sample1-071001.tarで試したら無事に通過できましたが、
    makeのところで以下のエラーが出てきてしまいます。
    $ make
    g++ -Wall -fno-exceptions -fno-rtti -g -DWIN32 -mwindows -o sample1 sample1.o -L../../drawstuff/src -L../../ode/src -L/usr/X11R6/lib -L/usr/local/lib -L/usr/lib/w32api/lib -I. -I../../include -I/usr/X11R6/include -I/usr/include -I/usr/include/w32api/include -lode -ldrawstuff -lstdc++ -lcomctl32 -lkernel32 -luser32 -lgdi32 -lopengl32 -lglu32 -lwinmm -lm resources.o
    make: *** [sample1] Error 1
    このソースだとどこでエラーがでているのかわかりません。
    よろしければ教えてもらえませんか?
    単純なしつもんですいません。

  10. でむさん、
    返信ありがとう御座います。

    sample1-071001.tgzでやってみましたが、前回と同じ結果になってしましました。
    $ tar xvzf sample1-071001.tgz
    tar (child): sample1-071001.tgz: Cannot open: No such file or directory
    tar (child): Error is not recoverable: exiting now
    tar: Child returned status 2
    tar: Error exit delayed from previous errors

    そこで確認したいしたいのですが、講座2の内容ができていれば
    このプログラムを実行することはできますでしょうか?
    もしかしたら何かインストールし忘れてないか心配になってきました。
    またこのエラーはどのような意味を表すのでしょうか?
    使用環境は、MINGW32です。
    たびたび変な質問をしてしまいすいません。

  11. 初心者さん、

    コメントありがとうございます。最近、コメントがなかったので寂しかったです。

    さて、ご質問ですが、サンプルプログラムのファイル名をsample1-0701001.tgzへ変更したにもかかわらず、説明の文章が昔の名前sample1-070919.tgzで出ていたのが原因です。

    お詫びして訂正します。なお、sample1の後は年月日です。

    でむ

  12. MINGWでSample1をうまく実行できませんでした。
    make以前に$ tar xvzf sample1-070919.tgzでエラーがでてしまいます。
    $ tar xvzf sample1-070919.tgz
    tar (child): sample1-070919.tgz: Cannot open: No such file or directory
    tar (child): Error is not recoverable: exiting now
    tar: Child returned status 2
    tar: Error exit delayed from previous errors
    ソースは以上のようになります。
    また、インストールした0701001.tgzと070919.tgzは、何か関係があるのでしょうか?$ tar xvzf sample1-070919.tgzと$ tar xvzf sample1-071001.tgzの両方で試しましたが無理でした。
    講座2のデモプログラムは上手くいきました。
    初めて間もないので、初歩的なミスをしていたらすいません。

  13. ロウさん、

    返事が遅くなりすみません。

    Visual C++ 2008 ExpressionでODE本のサンプルプログラムを動かすための方法をODE本カテゴリに書きましたので参考にしてください。

    わかりづらい箇所や間違いがあればご指摘ください。

    でむ

  14. はじめまして、でむさん

    只今ODEの本を見ながら勉強中です。
    自分でプログラムを組み立てて実行してみたいのですがどうすれば実行できるのでしょうか。因みに今自分は”Microsoft Visual Studio 2005″で作っています。しかしヘッダファイルがわからないので実行することができないでいる状態です。もしよろしければメールをください。

    下手な文章になってすみませんm(_ _)m

  15. Thomsonさん、

    はじめまして。

    ご指摘を受けるまで全く気がつきませんでした。現在、このページの中ほどにあるNext Pageはdemura.netの全記事(http://demura.net/archives/9ode/)の順番になっています。通常のブログならこの設定で良いのでしょうが、カテゴリ別の記事が多いので変更します。

    ただ、ODE講座に関する記事はODEカテゴリの中のサブカテゴリとなっているので、ODEカテゴリ内の順番になります。つまり、Next PageにはODEには関係しますが、ODE講座に関係しない記事がリンクされる場合があります。ご了承ください。

  16. はじめまして。
    Thomsondです。
    最近ODEを使用し始め、出村先生のホームーページを使って腕を磨こうとしています。
    とてもわかりやすいし、参考になっています。

    コメントなのですが、このページの中程にあるNext Pageのリンク先が間違っているような気がするのですがどうでしょうか?
    衝突回避の節には再度目次に戻らないと行けないようになっているようです。

    マイナーな指摘をしてしまい、すいません
    このホームページで勉強して実力を付けて、立派にプログラムを作れるようになりたいと思います。

  17. jimmyさん、

    私のiMac G5では以下のmakefileでコンパイルできました。
    TARGETをarmからkoboshiにしただけです。
    もし、以下のmakefileでコンパイルできなかったら教えてください。なお、ここにタブいれると書いたところにタブをいれてください。makefileのお約束です。

    CC = g++ -I -O2 -Wall -g
    TARGET = koboshi
    OBJS = $(TARGET).o
    SOURCE = $(TARGET).cpp
    HEADER =
    LIBS = -L../../drawstuff/src -L/usr/local/lib -L/usr/X11R6/lib -L/usr/X11R6/lib
    INDS = -I. -I../../include -I/usr/local/include -I/usr/X11R6/include
    OPTS = -lm -lode -ldrawstuff -lX11 -framework OpenGL -framework Carbon -framework AGL

    $(TARGET):$(OBJS) $(HEADER)
    ここにタブを入れる $(CC) -o $(TARGET) $(OBJS) $(LIBS) $(INDS) $(OPTS)

    $(OBJS):$(SOURCE) $(HEADER)
    ここにタブを入れる $(CC) -c $(SOURCE) $(LIBS) $(INDS)

    clean:
    ここにタブを入れる rm $(TARGET) $(OBJS) *.*~ *~

  18. でむさん、

    お返事どうもありがとうございました。
    ODE講座16のサンプルプログラムはうまく実行できました。
    でも、そのmakefileを使って (TARGET = koboshiにしました)
    koboshiサンプルプログラムをcompileすろと以下の問題があった。
    makefile:14: warning: overriding commands for target `koboshi’
    makefile:11: warning: ignoring old commands for target `koboshi’
    make: Circular koboshi <- koboshi dependency dropped.
    g++ -o .cpp
    i686-apple-darwin8-g++-4.0.1: no input files
    make: *** [.cpp] Error 1

  19. Jimmyさん、

    遅くなりましたがODE講座16にOS X用のmakefileを含んだサンプルプログラムを作りましたので参考にしてください。これはiMac G5で確認したので問題はないと思います。makefile.osxをmakefileにコピーしてからmakeしてください。

    お手数ですが、うまく実行できたらご連絡頂けたらありがたいです。

  20. でむさん、
    お返事どうもありがとうございました。問題はまだ解決されていないです。
    mv arm.c arm.cpp をしてmakeすると以下のようなerrorがでました。

    makefile:15: warning: overriding commands for target `arm’
    makefile:12: warning: ignoring old commands for target `arm’
    make: Circular arm <- arm dependency dropped.
    g++ -o .cpp
    i686-apple-darwin8-g++-4.0.1: no input files
    make: *** [.cpp] Error 1

  21. Jimmyさん、

    コメントが途中で終わっているのでよくわかりませんが、問題は解決されたのでしょうか?

    拡張子が.cと.cppと混在している理由は、本来初心者用の講座なのでc言語でプログラムを記述しましたが、cygwinではどうしてもgccではコンパイルできず、g++を使っていました。

    また、c言語もc99による新しい書式を多く使っているためgccのデフォルトのオプションではコンパイルできないサンプルプログラムを多いのです。

    さらに、Visual C++の利用者から拡張子が.cではエラーになるので.cppにして欲しいという依頼もあり、これから作成するサンプルプログラムは全て.cppにしようと考えています。

  22. でむさん、
    お返事どうもありがとうございました。
    プログランムをdownloadしたらmvで拡張子は .c から .cpp に変更しました。

  23. Jimmyさん

    あけましておめでとうございます。今年もdemura.netをよろしくお願いします。

    外しているかもしれませんが、このmakefileはC++用のコンパイラg++を使っています。また、拡張子が.cppでなければなりません。拡張子が.cということはありませんか?

  24. でむさん、

    あけましておめでとうございます。今年もよろしくお願いします。

    さて、makefileの件ですがいろいろなsampleを試してみました。
    普通問題はないですが、ときどき以下のようなmessageがでました。
    それに対してどうしたほうがいいでしょうか?

    makefile:15: warning: overriding commands for target `koboshi’
    makefile:12: warning: ignoring old commands for target `koboshi’
    make: Circular koboshi <- koboshi dependency dropped.
    g++ -o .cpp
    i686-apple-darwin8-g++-4.0.1: no input files
    make: *** [.cpp] Error 1

    makefile:15: warning: overriding commands for target `arm2′
    makefile:12: warning: ignoring old commands for target `arm2′
    make: Circular arm2 <- arm2 dependency dropped.
    g++ -o .cpp
    i686-apple-darwin8-g++-4.0.1: no input files
    make: *** [.cpp] Error 1

    makefile:15: warning: overriding commands for target `arm2IK’
    makefile:12: warning: ignoring old commands for target `arm2IK’
    make: Circular arm2IK <- arm2IK dependency dropped.
    g++ -o .cpp
    i686-apple-darwin8-g++-4.0.1: no input files
    make: *** [.cpp] Error 1

  25. Jimmyさん、

    すみません。大掃除や年賀状書きに追われて返事が遅れました。大掃除は大変ですが、終わった後はすがすがしい気分がします。

    さて、makefileをカットアンドペーストしたので、Tabが抜けていました。
    以下のmakefileで「ここにTabを入れる」と書かれているところにTabキーを押してTabを入れてください。

    # OS X用のmakefile
    CC = g++ -I -O2 -Wall -g
    TARGET = sample4a
    OBJS = $(TARGET).o
    SOURCE = $(TARGET).cpp
    HEADER =
    LIBS = -L../../drawstuff/src -L../../ode/src -L/usr/local/lib -L/usr/X11R6/lib -L/usr/X11R6/lib
    INDS = -I. -I../../include -I/usr/local/include -I/usr/X11R6/include
    OPTS = -lm -lode -ldrawstuff -lX11 -framework OpenGL -framework Carbon -framework AGL

    $(TARGET):$(OBJS) $(HEADER)
    「ここにTabを入れる」  $(CC) -o $(TARGET) $(OBJS) $(LIBS) $(INDS) $(OPTS)

    $(OBJS):$(SOURCE) $(HEADER)
    「ここにTabを入れる」  $(CC) -c $(SOURCE) $(LIBS) $(INDS)

    clean:
    「ここにTabを入れる」 rm $(TARGET) $(OBJS) *.*~ *~

  26. でむさん、

    お返事どうもありがとうございました。

    makefile:11: ** missing separator. Stop. でました。

    line 11 は: $(CC) -o $(TARGET) $(OBJS) $(LIBS) $(INDS) $(OPTS) です。

  27. jimmyさん、

    intelMacいいですね。私も欲しいのですが買えません…

    さて、makefileがMac用のものではありません。以下のmakefileを参考にされてはいかがですか?私はためせないので、結果を教えてくださいね。

    CC = g++ -I -O2 -Wall -g
    TARGET = sample4a
    OBJS = $(TARGET).o
    SOURCE = $(TARGET).cpp
    HEADER =
    LIBS = -L../../drawstuff/src -L../../ode/src -L/usr/local/lib -L/usr/X11R6/lib -L/usr/X11R6/lib
    INDS = -I. -I../../include -I/usr/local/include -I/usr/X11R6/include
    OPTS = -lm -lode -ldrawstuff -lX11 -framework OpenGL -framework Carbon -framework AGL

    $(TARGET):$(OBJS) $(HEADER)
    $(CC) -o $(TARGET) $(OBJS) $(LIBS) $(INDS) $(OPTS)

    $(OBJS):$(SOURCE) $(HEADER)
    $(CC) -c $(SOURCE) $(LIBS) $(INDS)

    clean:
    rm $(TARGET) $(OBJS) *.*~ *~

  28. でむさん、

    samplesどうもありがとうございました。

    IntelMacではなかなかうまくcompileするのができないです。
    makeすると以下のerrorがでました:

    gcc -Wall -g -DdDOUBLE -c sample4a.cpp -L../../drawstuff/src -L../../ode/src -L/usr/X11R6/lib -L/usr/local/lib -L/usr/lib/w32api/lib -I. -I../../include -I/usr/X11R6/include -I/usr/include
    In file included from ../../include/ode/ode.h:28,
    from sample4a.cpp:6:
    ../../include/ode/config.h:264:1: warning: “dDOUBLE” redefined
    :1:1: warning: this is the location of the previous definition
    gcc -Wall -g -DdDOUBLE -o sample4a sample4a.o -L../../drawstuff/src -L../../ode/src -L/usr/X11R6/lib -L/usr/local/lib -L/usr/lib/w32api/lib -I. -I../../include -I/usr/X11R6/include -I/usr/include -lm -lode -ldrawstuff -lGL -lGLU
    /usr/bin/ld: warning -L: directory name (/usr/lib/w32api/lib) does not exist
    /usr/bin/ld: Undefined symbols:

    どうすればいいでしょか?私のmakefileはこれです:

    # make file

    CC = gcc -Wall -g -DdDOUBLE
    TARGET = sample4a
    OBJS = sample4a.o
    HEADER =
    LIBS = -L../../drawstuff/src -L../../ode/src -L/usr/X11R6/lib -L/usr/local/lib -L
    /usr/lib/w32api/lib
    INDS = -I. -I../../include -I/usr/X11R6/include -I/usr/include
    OPTS = -lm -lode -ldrawstuff -lGL -lGLU

    $(TARGET):$(OBJS) $(HEADER)
    $(CC) -o $(TARGET) $(OBJS) $(LIBS) $(INDS) $(OPTS)

    sample4a.o:sample4a.cpp $(HEADER)
    $(CC) -c sample4a.cpp $(LIBS) $(INDS)

    clean:
    rm $(TARGET) $(OBJS) *.*~ *~

    よろしくお願いします。

  29. ODE初心者さん

    コメントありがとうございます。

    インストールを説明したODE講座2で一部作業忘れがありました。すみません。今は訂正済みです。
    http://demura.net/archives/2006/09/ode2.html

    以下の作業をしてください。
    mingwターミナルを開き以下のコマンドを実行してください。odeのライブラリを所定の位置にインストールする作業です。

    $ cd /home/ユーザ名/src/ode-0.7
    $ make install

    または、makefileの以下の行

    LIBS = -L../../drawstuff/src -L/usr/X11R6/lib -L/usr/local/lib -L/usr/lib/w32api/lib

    を次のように変更してください。

    LIBS = -L../../drawstuff/src -L../../ode/src -L/usr/X11R6/lib -L/usr/local/lib -L/usr/lib/w32api/lib

    つまり、リンクするパスに../../ode/srcを含めるのです。こうするとmake installする必要はありません。

  30. MINGWでSample1をうまく実行できませんでした。解決案を教えていただけないでしょうか。よろしくお願いいたします。

    $ make

    c:\mingw\bin\..\lib\gcc\mingw32\3.4.2\..\..\..\..\mingw32\bin\ld.exe: cannot find -lode
    collect2: ld returned 1 exit status
    make: *** [sample1] Error 1

  31. mashuさん

    testプログラムでも同様なエラーがでるということは,このページのプログラムの問題ではないと思います.

    make cleanを実行して,もういちどODE0.7をconfigureからやり直し,makeしてはいかがでしょうか?私の経験では,このエラーがでたときは他のパソコンからバイナリをコピーしたときでした.

    確認しますが,ODE0.7をmingwでコンパイル,実行していますね?

  32. たびたびすいません。
    こちらのページのファイルをインストールして実行してみましたが,できませんでした。
    実行すると「could not load acceleratod」と警告が表示されてしまいます.
    原因について心当たりがあれば,レスポンスの方お願いします.

    testプログラムに同様の結果になっているものがありました.(test_basket.exe, test_plane2d.exe)

コメントを残す

メールアドレスが公開されることはありません。