ページ 11

斬られたときの振動の表現

Posted: 2010年5月31日(月) 07:58
by ゆう
ドラクエ系のRPGの戦闘なんかでよくある
「斬られたときの振動」のようなエフェクトを作りたいと思っています。
モンスターがソード等でダメージを受けたときに、上下(もしくは左右)に一瞬揺れる表現です。
要は表示位置を調整してやればいいのだとは思うのですが、
具体的にどのように処理するといいのか考えがまとまりません。
何かいい方法、もしくはヒント等ありましたらお願いします。

Re:斬られたときの振動の表現

Posted: 2010年5月31日(月) 20:54
by Justy
 大きく分けると方法は2つあります。

1 全てのオブジェクトをオフセットで移動する

 丁度龍神録が採用している方式です。
 移動量を管理するクラスを作って、揺らしたい全てのオブジェクトの座標にこのクラスの x方向と y方向の
オフセット移動量を足します。

 龍神録では「ドンと揺れる」dn_t型がその移動量クラスとなっています。
 
龍神録プログラミングの館 22章
http://dixq.net/rp/22.html

 実際の使用例は

龍神録プログラミングの館 24章
http://dixq.net/rp/24.html
のソースの dn変数の使われ方を見て下さい。

 ボスの描画(graph_boss関数)や弾の描画(graph_bullet関数)で表示する座標に
dn.xや dn.yを足し込んでいます。

 この dn.xや dn.yは 22章の dn_calc関数内で、揺れていないときは 0、揺れるときは
毎フレームランダムな移動量になるよう管理されています。



2 全てを描画後最後に移動する

 1と同様揺れる移動量を管理するクラスを作ります。
 
 揺らしたいオブジェクトをバックバッファではなく、画面と同じ大きさのテクスチャにそのままの位置で
レンダリングしていきます。
 画面上のオブジェクト全てを揺らすなら、全てをここでレンダリングして下さい。

 これで揺らしたい絵が出来上がりましたので、レンダリング先をバックバッファに切り替え、
そのレンダリングしたテクスチャの表示位置(揺れないときは左上が [0, 0])を移動量クラスの
情報に沿って適切にずらして表示します。
 このあたりは1と同じですね。


 実際の処理は状況に合わせていろいろあるでしょうが、考え方としてはこんなところです。

Re:斬られたときの振動の表現

Posted: 2010年5月31日(月) 22:29
by ゆう
丁寧な回答ありがとうございます。

私も、画面全体よりは個々のユニットを揺らす感じがほしいので、
1の個々の描画オフセット量をクラスか何かで管理する形になりそうです。
(2の、まとめて揺らすという手もあるんですね。とても参考になりました)

ただ、具体的なオフセット量の算出をどうしたらいいのかがよくわかりません。
もちろんここは、求める演出次第だとは思うのですが・・・。
龍神録ではランダムに揺らしてる感じになってるみたいですね。
私が想定しているのは、
・ランダムではなく一方向に揺れる(縦に揺れる感じ)
・最初が一番揺れが大きく、次第に小さくなって止まる
・揺れの一往復にかかる時間は、揺れ幅が違っていても常に(だいたい)一定
・数往復程度揺れて、最終的に止まるまでせいぜい1秒程度
という感じです。
イメージは大体あるのですが、それを実際うまくコードに起こせません。
もう少し悩んでみようと思います。

Re:斬られたときの振動の表現

Posted: 2010年5月31日(月) 22:56
by 組木紙織
(3^(-t/100))*COS(t/50)*COS(t/1)
ただし、"^"は指数を意味する。

t=80ぐらいのときにほぼ0となる。数回振動しながら小さくなっていく関数です。

100や50や1の値を自分が欲しい動きになるように調節してあげてください。
エクセルでグラフ書いてあげると分かりやすいと思います。


//式を明確にするために括弧を追加 画像

Re:斬られたときの振動の表現

Posted: 2010年6月01日(火) 03:18
by ゆう
おお、ありがとうございます。
Excelでグラフにしてみたら、確かに私が求めていたものにかなり近いです。
それにしても難しい式ですね・・・理解しようとしてもちんぷんかんぷんです。
自分で思いつくのは不可能でしたね、これは・・・。

厚かましいお願いですが、もしわかったら教えていただきたいのですが、
↑の式は「-○~○」の範囲で動きますが、
同じイメージで「0~○」の範囲で動く式はどのようになるのでしょうか。

Re:斬られたときの振動の表現

Posted: 2010年6月01日(火) 06:54
by 組木紙織
最大値は負の範囲にありますが、別にそのまま0以上の範囲で使ってくれてかまいませんよ。

こっちは使いやすいように係数の意味をきちんと与えたばーじょんです。
(2^(-t/D))*COS(t*B*(2*PI()))*COS(t*PI()/(C*2))*A
A:t=0のときの大きさ=最大値
B:振動数
C:値が0になるまでの時間
D:減少の仕方を表す。大きいと最初はなだらかに減少。
PI()は円周率を意味する。
"^"は指数を意味する。

Re:斬られたときの振動の表現

Posted: 2010年6月01日(火) 08:24
by 組木紙織
質問の意味を勘違いしてていたかも。
こちらはどうですか。
(2^(-t/D))*COS(t*B*(2*PI()))*COS(t*PI()/(C*2))*COS(t*B*(2*PI()))*A
画像

Re:斬られたときの振動の表現

Posted: 2010年6月03日(木) 21:04
by ゆう
返信が遅れて申し訳ありません。
係数の具体的な説明ありがとうございます。

新しくご提示いただいた式は、どうにも複雑すぎて理解不能でした。
(係数が具体的でなかったので、思ったようなグラフに出来ませんでした)

ただ揺らすだけなのでそれほど難しくないと思っていたのですが、
予想外に複雑になったりしますね。
教えていただいたことを参考に、やってみたいと思います。
ありがとうございました!