« ビームサーベル | トップページ | キャラクターモデリング part1 »

2012年1月21日 (土)

剣の軌跡

剣に軌跡をつけてみる。

 

サーベルを持たせたので、軌跡をつけてみようかなーと。

 

 

正直、ゲームシステム自体が全然できてないのに、

 

システムに関係のない、見た目にしか影響が無い軌跡をやるのはどうかなーと思ったんだけどね。

 

周りの友達は軌跡つけているし、やってみようと思ったので。 

 

 

 

軌跡自体はすごく簡単。 

 

 

剣の根元の位置と剣先の位置を取得し、

その座標の位置を、ある程度の過去フレーム数分保存しておき、

その位置を使ってポリゴンを描画するだけ。

 

 

Photo_8

過去5フレーム分の位置を保存したとして、

その位置を使ってポリゴンを描画したとしたら、こんな感じかな。 

 

青が先端で、赤が根元として、それぞれ5つの配列で保存すると分かりやすいか。

全部で10こあるから、10個の配列を使って前半が先端、後半が根元としてもいいけど、

それはちょっと分かりづらい気がするぜ・・・。

過去フレーム数*2の配列より、

過去フレーム数の配列二つの方が頭に優しいかなーと思う。

 

 

UVは、

どの位置の頂点だろうとVは先端が0,根元が1で固定。

横方向のUがちょっとややこしいけど、

最後のフレームの位置が1になるように、割合を出してやればいけるかな。

 

 

上の5フレーム分の頂点だと、

最後が1になるようにUを均等に増やしていくとなると・・・ 

最初の1のUは当然0、

次の2のUは0.25、

次の3は0.5、

次の4は0.75、

最後の5は1。

 

増加数は0.25。

 

5個あるから、

単純に1 ÷ 5かなーと思ったけど1÷5って0.2だよね。

1÷4が0.25だから、 

Uの増加数は 1 ÷ 過去フレーム数-1って事かなー。

 

 

さて、この頂点をポリゴンの4頂点に適切に設定し、

UVも適切に設定すればテクスチャを貼ることも可能だし、

これでまぁ軌跡が出るね。 

 

 

しかし、まだ問題はある。

 

 

剣で攻撃するときって、

当然ながら早く振る。 

もしかしたら5フレームかからずに振り終わるほど素早い攻撃もあるかもしれん。

 

 

そうなると、過去の位置の差が大きくなって、

ポリゴンのカクつきが激しくなって、汚く見える。

 

 

さっきの例の画像ですでにちょっとカクついて見えるかもしれない。

ギリギリ許せるレベルかもしれないけど。 

 

カクカクな軌跡よりも、

 

2_3

こういう曲線の軌跡だと許されるだろう。

 

 

曲線を作る・・・。 

 

 

んー難しそうだなー。

 

 

 

でも、友達はこれやってるもんなー。

 

 

 

なので自分もやるぜ。無理なら聞くか。

 

 

どうやって滑らかな軌跡にしているか分からない。 

 

 

だけど、考え方は同じはずだ。

 

 

過去フレームの位置をそのまま使うんじゃなくて、 

その位置をガイドに曲線を生成し、ポリゴンをより細かく分割して描画する・・・。

 

 

 

最初考えたのは、

 

位置を線形補間すれば、ただただポリゴンを分割しただけでカクカクなのは同じ。

だって線形補間なんだから直線なんだもん。

 

線形補間ではなくて球面線形補間ならば、滑らかにつながるんじゃないか?だって「球面」とか言ってるし。

とか妄想してみたけど、試す前に断念。

 

あれって曲線を作るための式じゃないし、「lerp」を「slerp」にしただけで何の苦労もなしに完成するとは思えない。

 

 

曲線を作る方程式はにネットで調べられるからgoogleに聞くか。

 

 

曲線の種類自体結構あって、どれがいいか分からん。

 

 

CG検定とるときに勉強したのがなつかしいなー。

ベジエ曲線とか・・・

ベジエ曲線とか・・・

ベジエ曲線とか・・・ 

 

やばいベジエしか名前覚えて無いし、ベジエ曲線がどんな曲線か説明できんわ。

 

 

曲線を作る方法は大体同じで、

必要なパラメータが4つほどいる。

 

曲線の始点と終点は共通で、

あとは方向ベクトルやら、制御点やら・・・曲線の種類によるね。 

 

 

いろいろと調べた結果、

 

点を与えるだけで、その点を通る曲線を作る、

Catmull-Romスプライン曲線

というのがベストだと判断した。

 

 

 

他の曲線だと、

方向ベクトルとか速度ベクトルとか与えないといけないみたい。

 

軌跡の方向や速度ベクトルとか、算出するのめんどくさそうだ。

 

 

そういう曲線はフォトショップのパスの曲線みたいな感じになるのかな。

 

 

制御バーによって曲線が移動する。みたいな。

 

与えられる方向ベクトルによって曲線が引っ張られるような感じになるとか・・・いらん!!

 

そんなのよりCatmull-Romスプライン曲線だと

過去フレームの位置だけでその位置を通る曲線が作れるって事だよね。

 

 

まぁそれぞれの曲線にも良い所や最適なシチュエーションはあるけど、

 

剣の軌跡では、最低限過去フレームの位置を通らないと違和感が出るはずだ。

 

4点の制御点を与えて、2点は通っても残り2点は通らない曲線だと、

軌跡が剣先に届いて無いことになって困るよね。 

 

なので必ず制御点を通る曲線を作るCatmull-Romスプライン曲線がベストだと思うわけですぜ。

 

 

http://markun.cs.shinshu-u.ac.jp/learn/cg/cg3/index4.html

http://www.t-pot.com/program/2_3rdcurve/index.html

こちらのサイト様を参考に、曲線を作成しましたぜ。

 

 

曲線を作るのはいいけど、

 

どの位置を取得するか、どれくらいポリゴンを分割するかが問題。

 

 

Photo_9
極端な話、過去フレームの位置がこんな感じだと、

1から2,3にかけては差が大きいので、4,5分割くらい必要かと思うけど、

3,4,5あたりは差が大きくないので、1,2分割くらいで十分滑らかに見える。

 

そういう処理は行うべきなのか。 

 

位置どうしの距離を測り、それによって分割数を変える・・・。 

 

しかし、分割数を変えるという事はポリゴンの描画数が変わるという事だし、難しそうだなー。

描画時に計算して処理ループ数を変えるとか? 

いや、自分は面倒な事はなるべくやらないと心がけている。

 

 

ってことで、単純に分割数は各区間で統一という仕様にしました。

 

 

4分割すると、こんな感じか。

Photo_10
頂点数を数えてみると、

Photo_11

5から17個になってる。

 

分割数4なので、

 

最終頂点数は、

(過去フレーム数 - 1) × ( 分割数 - 1 ) + 過去フレーム数

で計算できるのかな。

 

(5 - 1) * ( 4 - 1 )+ 5 = 17だよね。

 

 

これを剣先と根元の二つ分用意か。

 

 

 

さっきの式を使えば過去フレーム数と分割数を自由に変数で変えられるようにできるな。

 

 

軌跡クラスを作り、

コンストラクタで過去フレーム数と分割数を設定し、位置の領域を動的に確保するか。

 

 

 

・・・ 

 

いろいろと試行錯誤し、

 

軌跡ができました。

 

試行錯誤といってもネットで拾った公式をプログラムにどうやって落とし込むかってだけだったなー。

 

6

過去フレームの位置をそのまま使っているの図。 

 

過去フレーム数は5と、上での例と同じにしているぜ。 

 

これにテクスチャを貼ってみる。

Photo_12

こう、斜めのグラデーションのテクスチャ。

 

これで、

Photo_13

まぁそれっぽく見えるね。

 

 

でもやはりカクつきが目立つ気がするなー。

 

 

なので軌跡の過去フレームの位置を元に、

曲線を生成し、よりポリゴンを分割して描画する!

 

Kiseki8_2

Kiseki9

おー滑らか!! 

 

正直、感動したぜ・・・。

 

 

うまくいってよかったー。

 

 

曲線の分割数は4と、例で考えた数と同じにしてみた。

 

 

Photo_14

テクスチャを貼ってみる。

 

うん綺麗だねー。

 

 

 

過去フレームの値と、分割数を変えたらちゃんと滑らかさが変動するかテスト。

過去フレーム数10,分割数2と、

過去フレームを二倍で分割数半分にしてみた。

 

 

軌跡が長くなってよりカクついているというのが、

正しい動きのはずだ。 

 

Photo_17

うーむ、より長くなってよりカクついている感じだな。

 

うん、うまいこといってるみたいだね。

 

 

いろいろと試したけど、

分割数は4が安定だな。

 

4以上は滑らかさの違いが分からないし・・・。

 

 

過去フレーム数は結構迷うなー。

 

 

自分的に、7が安定かなーと。 

 

 

まぁあんまり考えずに決めたけどね。

 

てか作ってるゲームのゲームスピードによるか?

 

いや剣を振るキャラクターによるか?

 

12

13

軌跡によってどう剣を振ったかが分かるのが良いね。

 

軌跡なんて見た目が変わるだけだと軽視してたけど、

有ると無いで大分違うな。

 

 

まぁ、これでも軌跡としては違和感がでないわけじゃない。

むちゃくちゃなモーションだと軌跡が一部ゆがんだりする。 

 

 

その場合はもっとちゃんとした曲線の計算を行うべきか・・・。

 

いや、面倒だからモーションをちゃんと作るべきか。

« ビームサーベル | トップページ | キャラクターモデリング part1 »

ゲーム開発記」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: 剣の軌跡:

« ビームサーベル | トップページ | キャラクターモデリング part1 »