ODE講座31: あのジオメトリの接触判定


赤ボール,青ボールと地面との接触判定

赤ボール,青ボールと地面との接触判定

hideさんからのご質問に刺激を受けて,本当に久しぶりにODE(Open Dynamics Engine)講座31を開講します.

ある特定のジオメトリが別のジオメトリと接触しているか知る方法を説明します.

初期高さの異なる2つの赤ボールと青ボールを同時に落下させ,それらのボールが地面と衝突する時に,ぶつかったボールがどちらかを表示する簡単なものです.ソースコードを表示するプラグインの設定が悪く,インデントしていない読みにくいコードになっています.時間を作り設定をやり直しますので,それまでご勘弁ください.学生なら怒られているところです…

さて,ソースコードを簡単に説明します.25行目のnearCallback()には衝突する可能性のある2つのジオメトリo1, o2が引数として渡されます.1番目の引数dataはユーザが渡すデータです.これは64行目のdSpaceCollide()の2番目の引数です.以下の例では0なのでユーザが渡すデータはありません.

実際に衝突しているかは34行目のdCollide()の戻り値(接触点数)を見るとわかります.1以上なら接触点数が1個以上あるので接触しています.0なら接触していません.これ例では地面との接触を考えているのでジオメトリ01, o2が地面かどうかで場合分けし,さらに,o1, 02が赤ボール,青ボールがで場合分けし,それぞれの接触を調べています.

このサンプルプログラムを少し変えるとあのジオメトリが接触しているかどうか簡単に調べることができます.

わからないところがあれば是非コメントください.

でむ

[viewcode] src=”ball2.cpp” geshi=”cpp” lines [/viewcode]

2 Comments
  1. ろぼっとさん,

    すみません.ODEをスレッドで使っていないので詳しいことはわかりません.御本家様のメーリングリストに聞いてみてはいかがでしょうか?

    でむ

  2. こんにちは。
    ODEシミュレーションで大変参考にさせていただいております。

    さて、質問があるのですが、2つのスレッドで、違うworldをそれぞれ1つずつ生成します。
    そこに、まったく同じ条件のロボットを1体ずつ設置して、同じ制御を同じ条件で行いました。

    ところが、違うworldで同じ機構のロボットを同じ制御法で動かしているのに、挙動はまったく違います。これは果たして正常なのでしょうか?

    よろしくお願いいたします。

コメントを残す

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