C# Box2D 衝突

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら

C# Box2D 衝突

#1

投稿記事 by » 14年前

こんばんは。black_catです。
すいません。またBox2Dの質問です。
皆さんのおかげで順調にアプリケーションの制作が進んでいます。いつもありがとうございます。

と、本題に入らせていただきますが、Box2Dのオブジェクト同士が
衝突した瞬間に起こるイベントを作りたいのですが、どうすればいいのでしょうか。

調べてみたところ、Contactというものを使うみたいなのですが、その使い方がよく分かりませんでした。
http://hokori.net/2009/05/27/box2dflashas3_contact/
http://parpue.net/web/35
http://www.ficc.jp/labs/archives/ando/box2dflashas3/
↑ここのページにFlash版ですが少し載っていました。(読んでも分かりませんでしたが...)

衝突イベントの作り方を教えていただけますか?
開発環境はVisual C#です。

よろしくお願いします。

すいません。結構な頻度で編集しているのは毎回確認しているはずなのに誤字が見つかるからです。 画像

Re:C# Box2D 衝突

#2

投稿記事 by » 14年前

Justyさん、もしよければ回答お願いします。

Justy

Re:C# Box2D 衝突

#3

投稿記事 by Justy » 14年前

 呼べばいつでも出てくるという訳じゃないんですけどね。

 基本的には他言語版とたいして大して変わらないはずです。
 他言語版だと b2ContactListenerクラスを継承して独自の処理を記述したインスタンスを作成し、
そのインスタンスを b2World::SetContactListenerでリスナー登録をしておくと、
所定のメソッドが呼ばれるという仕組みです。

 C#版も多分同様でしょう。

 ASですが、こちらが判りやすいと思います。
http://www40.atwiki.jp/spellbound/pages/646.html
http://namunamu15.blogspot.com/2009/06/ ... tener.html

Re:C# Box2D 衝突

#4

投稿記事 by » 14年前

Justyさん、申し訳ございません。
確かに毎回毎回呼ばれると迷惑ですよね。
反省です。
これからも質問はさせていただくと思いますが、呼ぶのはやめようと思います。
Box2Dの質問でも、時間が空いて気が向いたときだけ答えていただけたら、それだけで十分嬉しいです。
お忙しいときはスルーしていただいて結構です。

と、今回の件なのですが、
class contactListener : Form
        {
     public override void function Add(ContactPoint point)
     {
             Body bodyA = point.Shape1.GetBody();
             Body bodyB = point.Shape2.GetBody();
     }
        }
とすると、Addのところに「;が必要です」と出てしまいます。
どこに「;」がいるのでしょう?
functionがよくわからなかったので、消してみると、「オーバーライドする適切なメソッドが見つかりません」
となります。
こちらもなにをしていいのか分かりません。

クラスの継承の仕方が間違っているのでしょうか? 画像

Justy

Re:C# Box2D 衝突

#5

投稿記事 by Justy » 14年前

>;が必要です
 functionは要りません。

>オーバーライドする適切なメソッドが見つかりません
 継承元が違うからでしょう。
 b2ContactListener(C#だと多分ContactListener)で継承して下さい。

Re:C# Box2D 衝突

#6

投稿記事 by » 14年前

ContactListenerで継承したらできました。
ありがとうございます!

あと、これは今回の題とは関係ないので、本当は別の質問で聞かなければいけないのですが、
Box2Dで浮力の再現はどうすればいいのでしょうか?
いろいろなページを見ていると、「工夫すれば多分できるけど標準ではできない」と書かれているところがありました。方法は載っていませんでしたが。
ここです。http://d.hatena.ne.jp/ir5/20091230/1262145672

YouTubeでもやっている人を見かけました。
[youtube][/youtube]

これはかなりややこしいことですよね?でもとてもやってみたいです。
厚かましいお願いですが、もし出来そうなのであれば教えていただくというこことは可能でしょうか?

お忙しいのであればスルーしていただいて結構です。
お時間があればよろしくお願いします。

Re:C# Box2D 衝突

#7

投稿記事 by » 14年前

お忙しいようなので解決にさせていただきますね。
ありがとうございました。m(_ _)m

<追記>
お返事くださったので解決マークはずしておきます。 画像

Justy

Re:C# Box2D 衝突

#8

投稿記事 by Justy » 14年前

 遅くなりました。

 浮力に関しては実を言えば 本家 Box2Dに b2BuoyancyControllerクラスがあり、
この利用・参考にすれば浮力を再現できる、はずです(試していません)。

b2BuoyancyController | www.boristhebrave.com
http://personal.boristhebrave.com/proje ... controller

Box2D Forums • View topic - b2BuoyancyController
http://www.box2d.org/forum/viewtopic.php?f=8&t=1436

b2BuoyancyController - Box2DFlash Documentation
http://www.box2dflash.org/docs/2.1a/ref ... oller.html


 公式サイトの C++版は v2.1.2も SVNの方も Contributions扱いになっている上に、
一部の実装が見あたらないので、そのままでは使えない様な気がしますが、
こちらのサイトのはフルでそろっているようです。
http://personal.boristhebrave.com/proje ... -grab-pack

 で肝心の C#版 Box2DXの方は最新版(SVN)は含まれているようなので最新版を落としてきて
ビルドすれば使える様になるはずです。
http://code.google.com/p/box2dx/
http://box2dx.googlecode.com/svn/trunk/

ただ最新版なだけあって、Shapeが無くなり代りに Fixtureに変わっていますので
そのままでは動かないでしょう。
(その他軽く見た感じだと CircleShapeあたりの情報取得のあたりとか改変が必要かも)
 うまく古い Box2DXに移植するか、Fixtureを使用するように変更して動かしてみて下さい。



 しかしまぁ適当に処理を簡略化してもいいなら、各オブジェクト毎にこのオブジェクトの浮力は
この値、と一定値に決めてしまって、特定領域内にオブジェクトがあったらそのオブジェクトに
ApplyForceで上向きに力を与えるのが一番簡単なのかもしれませんね。

 浮力についてはこのページがわかりやすそうです。
http://www.wakariyasui.sakura.ne.jp/3-2 ... ryoku.html
http://www.max.hi-ho.ne.jp/lylle/vector3.html
http://homepage3.nifty.com/kuebiko/scie ... oyancy.htm

Re:C# Box2D 衝突

#9

投稿記事 by » 14年前

すいません。最新のC#版Box2DXはどこにあるのでしょう?
http://code.google.com/p/box2dx/
のBox2DX-2.0.1.3-r175-RC-DemoSuite.zip
は、ダウンロードのリンクには2.0.1.3と書かれているのに、Box2DXのプロパティを見ても
バージョンは2.0.1.0のままです。

あと浮力については最初のページが分かりやすかったです。
ありがとうございました。
ですが、やはりBox2DXを使って正確にやりたいと思います。 画像

Justy

Re:C# Box2D 衝突

#10

投稿記事 by Justy » 14年前

>最新のC#版Box2DX
 そのサイトの Sourceのタブに svnレポジトリの URLが書いてありますのでそこから subversionを使ってDLできます。
 ああ、最新とは言いましたが、ログを見ると最新版はまだ修正途中(といっても2009年7月以降更新されていない……)
のようなので、修正開始直前の rev58の方が良さそうです。

http://code.google.com/p/box2dx/source/browse/?r=59

 一応、rev58のコピーをこっちにあげておきました。
http://bit.ly/9nT62b

 見たところ、BuoyancyControllerを使ったサンプルも入っているようです。

Re:C# Box2D 衝突

#11

投稿記事 by » 14年前

ありがとうございます!^^
コピーまで上げてくださって本当に感謝です!
サンプルのTestBed動きました。

>ログを見ると最新版はまだ修正途中
あのログは修正途中という意味だったのですね。

>2009年7月以降更新されていない……
そうだったのですか...
開発者さんはどうされたのでしょうね。


今まで書いたコードに浮力の再現を追加していこうと思っているのですが、
きっとつまずくと思うので、その時はお願いします。

Re:C# Box2D 衝突

#12

投稿記事 by » 14年前

今のコードに浮力の再現組み込めました。
動きは完全に求めていたものでした!

そこで、buttonをクリックするとすべてのオブジェクトに浮力を適用させるというコードを書こうと思いまして、
private void button1_Click(object sender, EventArgs e)
        {
            Body body = m_world.GetBodyList();
            BuoyancyController bc = _bc;
            m_world.AddController(bc);
            bc.offset = 15;
            bc.normal.Set(0, 1);
            bc.density = 2;
            bc.linearDrag = 2;
            bc.angularDrag = 1;
            bc.AddBody(body);

        }
としてみたのですが、最後に作ったオブジェクト一つだけしか浮き上がりません。
多分GetBodyListを使うところが間違っているのだと思うのですが、
どうすればいいのか分かりません。
教えていただけますか?
画像

Re:C# Box2D 衝突

#13

投稿記事 by » 14年前

連続の投稿ですみません。

最初の水位を地面より低く設定して、先にすべてのオブジェクトを追加しておいて
buttonを押したら水位を上げるという形で解決しました。

また何かあったらよろしくですm(_ _)m

Re:C# Box2D 衝突

#14

投稿記事 by » 14年前

画像のような水の描画をしたいのですが、出来るのでしょうか?(画像はペイントで描きました。)
水面の線だけでなく液体の部分を青い半透明で塗りつぶしたいです。

僕の書いているコードの場合、重力と浮力の向きがしょっちゅう変わるので、画像の右の方のように斜めとかも対応させたいと思っています。
出来ないのであれば、流体の再現が可能なの別の物理エンジンと組み合わせてやろうかと思っています。
C#対応で2Dの流体の再現可能な物理エンジンって何かありますか?

もし流体の方が出来そうなのであれば、液体の部分だけそっちを使おうかと思います。
もちろん剛体のほうはBox2DXを使います。

ということで質問内容をまとめさせていただきます。
1.画像のような斜めに対応した水の描画はできますか?

2.C#用の2Dの液体の再現ができる物理エンジンを教えてください。

できれば波とかも表現したいので、2番のほうを教えていただけると嬉しいです。

よろしくお願いします。

Justy

Re:C# Box2D 衝突

#15

投稿記事 by Justy » 14年前

>1.画像のような斜めに対応した水の描画はできますか?
FillPolygon
http://msdn.microsoft.com/ja-jp/library ... S.80).aspx


>C#用の2Dの液体の再現ができる物理エンジンを教えてください
 詳しくはありませんが、知ってる範囲だと

Flui°D°emo
http://rene-schulte.info/
[youtube][/youtube]



Farseer Physics
http://farseerphysics.codeplex.com/

くらいですね。

 もちろんこれらについては全く触れたことがないので、詳細はわかりませんが。

Re:C# Box2D 衝突

#16

投稿記事 by » 14年前

ありがとうございます。
FillPolygonで水の描画できました!
斜めのになるとき時の動きが少しカクカクで、あまり水っぽくはなりませんでしたが
描画ができてとてもうれしいです^^

リンク見させていただきましたが、どちらもとてもおもしろそうですね。

>Flui°D°emo
さっそくデモをダウンロードして動かしてみましたが、すごいですね。
使いたくなってきました。

>Farseer Physics
FarseerはBox2Dに近いみたいなので、まったく知らないものをやるよりかは簡単そうですね。


しかしどちらもJustyさんが詳細をご存じないということなので、使うかどうか検討中です。
いろいろなページを読んでいて出来そうであれば使いたいと思っています。

本当にどうもありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る