衝突判定によるカウントについて

CINEMA 4DおよびBodyPaint 3Dに関する一般的な議論や情報交換をするフォーラムです。
BUTTON_POST_REPLY
yuu
記事COLON 77
登録日時COLON 2010年6月21日(月) 08:44

衝突判定によるカウントについて

投稿記事 by yuu » 2011年2月20日(日) 23:19

二つのオブジェクトが接触した数をかずえたいのですが、うまくいきません。
定数に、値を一足していって、合計を表示したいのですが、方法があれば教えてください。

miyata
記事COLON 512
登録日時COLON 2009年12月29日(火) 16:25

Re: 衝突判定によるカウントについて

投稿記事 by miyata » 2011年2月21日(月) 18:43

あまりスマートなやり方ではありませんが、次のような方法でできると思います。
まずは、どこかにユーザーデータを作り、数字を記録する設定にします。
次に、衝突判定ノードで衝突判定が行われたかどうかを判定するようにします。
衝突判定を比較ノードの入力1につなげ、さらに、「値の記録」ノードの入力にもつなげます。
値の記録は、データタイプを実数、値を記録する回数を2、古さを1にします。
これで、値の記録ノードは、前のフレームのブール値を書き出します。

比較ノードでは、前後のフレームで、衝突判定のブール値(出力値は、当たっているときは1、当たっていないときが0)を比べ、
前のフレームより大きい時(比較演算子は「>」)、ブール値を出力して、それを現在のユーザーデータに加算する設定にします。
これで、衝突判定のカウント可能です。

注意が必要なのが、ユーザーデータの値は再生を繰り返したり、ビューで何度も衝突させるとドンドン値が増えるので、
計算させる前にかならず0に戻す必要があるので、注意してください。
1.png
1.png (28.65 KiB) 表示数: 6127 回
R12で作成したサンプルファイルも添付しました。
添付ファイル
count.c4d.zip
サンプルファイル
(13.34 KiB) ダウンロード数: 224 回

miyata
記事COLON 512
登録日時COLON 2009年12月29日(火) 16:25

Re: 衝突判定によるカウントについて

投稿記事 by miyata » 2011年2月21日(月) 19:03

フレーム0でカウントが0になる設定をしたものもアップしました。
添付ファイル
count2.c4d.zip
(19.07 KiB) ダウンロード数: 233 回

yuu
記事COLON 77
登録日時COLON 2010年6月21日(月) 08:44

Re: 衝突判定によるカウントについて

投稿記事 by yuu » 2011年2月21日(月) 21:05

ありがとうございます。解決できました。
ノードの特性を勉強して、応用していきたいと思います。

tofuji
記事COLON 828
登録日時COLON 2011年3月10日(木) 10:41
お住まいCOLON 東京都渋谷区

Re: 衝突判定によるカウントについて

投稿記事 by tofuji » 2011年4月05日(火) 00:25

 COFFEEノードを使って衝突判定の回数をカウントするXPressoをアップロードしました。
http://www2.11moon.com/sample_files/201 ... lision.zip


 構造は宮田さんが作ったものとほぼ同じですが、衝突回数を記憶する場所として、ユーザーデータの代わりにCOFFEE のグローバル変数を使っています。グローバル変数を使うと、COFFEEノードやXPressoタグを別のシーンにコピー/ペーストした時に、そのまま動くという利点があります。ユーザーデータを使った場合、ペースト先でもユーザーデータを新規に作り、ノードのリンクを更新する必要があります。

 ただし、グローバル変数は初期化が必要なので、その点は面倒です。初期状態では全ての値が「NULL」です。したがってサンプルファイルでは、衝突状態の値が「NULL」の時に初期化しています。

 しかし、「NULL」と「0」は同じ値とみなされるので、プログラム実行時も非衝突の値を「0」のまま扱うと毎回初期化がかかってしまいます。そこで、衝突状態の値に「10」を足し、「10なら非衝突」、「11なら衝突」として扱っています。
---

Toshio Fuji<gtofuji@gmail.com>

掲示板に書いたサンプルのまとめサイト
http://www2.11moon.com/index_as.html

yuu
記事COLON 77
登録日時COLON 2010年6月21日(月) 08:44

Re: 衝突判定によるカウントについて

投稿記事 by yuu » 2011年4月15日(金) 23:43

ありがとうございます。COFFEEの特性を理解していきたいと思います。

ひとつ、聞きたいのですが、カウントと同時に、効果音を鳴らすようにしてるのですが、
長めの音ですと、衝突が離れると音が最後まで鳴らずに途中で、止まってしまいます。
衝突が離れても最後まで、効果音を鳴らす方法がありましたら、教えてください。

tofuji
記事COLON 828
登録日時COLON 2011年3月10日(木) 10:41
お住まいCOLON 東京都渋谷区

Re: 衝突判定によるカウントについて

投稿記事 by tofuji » 2011年4月16日(土) 02:49

 投稿を読んでも、どのように効果音を制御しているのかわかりません。明快な文章で説明するか、図やファイルを添付するようにして下さい。

 とりあえず、マニュアルの「サウンド」ノードの項にあるサンプルを元にして作ったのが以下のサンプルです。
http://www2.11moon.com/sample_files/201 ... sion_2.zip

 このサンプルでは、「サウンド」ノードから「再生時間」を取得し、その時間をカウントダウンタイマーで数えています。カウントダウンタイマーには、グローバル変数「timer」を使っています。

 そして、衝突が発生するとtimerの値が再生時間に設定され、サウンドノードの「再生」がONになります。そして、timerの値が0になると、サウンドノードの再生がOFFになります。


 ただしこの構成では、サウンドが停止する前に再度衝突が発生した場合にサウンドをリセットできません。そこで、サウンドを再生する前に一度停止させるようにしたのが次のサンプルです。
http://www2.11moon.com/sample_files/201 ... sion_3.zip

 このサンプルでは、衝突が発生したフレームでグローバル変数「flg_1」をONにし、サウンドの再生をOFF にしています。そして、次のフレームでサウンドの再生をONにし、その後「flg_1」をOFF にしています。

 通常XPressoでは、ノードは1フレームにつき一つの値しか出力できません。それでこのような面倒な操作をしています。とは言っても、「timer」、「flg」両方とも非常によく使う手法なので憶えて損はありません。
最後に編集したユーザー 1 [ tofuji ], 累計 2011 回
---

Toshio Fuji<gtofuji@gmail.com>

掲示板に書いたサンプルのまとめサイト
http://www2.11moon.com/index_as.html

yuu
記事COLON 77
登録日時COLON 2010年6月21日(月) 08:44

Re: 衝突判定によるカウントについて

投稿記事 by yuu » 2011年4月16日(土) 13:10

ありがとうございます。衝突時に、音を最後まで鳴らす方法を理解できました。
COFFEEのスクリプトにも、詳しく説明されていて、
グローバル変数「timer」、「flg」などの使い方を応用していきたいです。

これからは、図を添付していきたいと思います。
今後も、よろしくお願いします。

BUTTON_POST_REPLY