いまさらですが、思い返してみるとゲーム開発者ならではの話が少ない…ということに気付いたので、今回はゲームでの話をしてみたいと思います。これからもちょくちょくゲームでのデータ作成方法を紹介して行きます。
前回はジョイントが変形に与える影響を見ました。基本的にジョイントを増やせばクオリティも上がります。が、ゲームはリアルタイム性が命です。「自然にキャラが動いているけど、処理落ちして動きがカクカクでゲームにならない!」では困ります。
(モデルに対してもっとも変形の自由度が高いようにジョイントを配置するということは、各頂点にジョイントを置くことです。つまりブレンドシェープです。これについても話ができれば面白いのですが、そのうち。)
多いジョイントは高負荷につながり「処理落ち」を誘発します。なので、なるべく少ないジョイント数できれいに見せる必要があります。
昔は無茶苦茶ジョイントを減らして、とにかく処理を速くするという感じでした。減らしすぎてデータが見にくくなることもしばしば。最近はコンピューターの性能が高いですから、あまりにジョイントを減らしすぎてデータが扱いにくくなるよりは、ほどほどな感じでジョイントを減らした方が良いです。
減らしすぎると、普通の状態に戻すのがとても大変なんですよね…。
他のアプローチ方法としては、オリジナルのデータは映画同様のジョイント数にしておいて、ゲーム用のデータとしてコンバートしたり、ゲーム実行時にゲーム用データとして最適化する、という方法もありです。なかなかそこまでの環境を用意しているところは無いと思いますが、今後は増えていくことでしょう。
あとゲームではデータをクリーンに保つことも重要です。コントローラーで上を押せば+Zに歩き出すプログラムを作ったとします。キャラクターモデルの正面がうっかり-Zを向いていれば後ろに向かって歩いてしまいます。同じようなデータは同じ仕様にそろえます。そうすればプログラマーは残業することなく帰ることができるでしょう。
というわけで、プログラマーの健康をどのように保てばいいのか、デザインで出来ることはあるのか!?見ていきたいと思います。
スケールは使わない
下の図は同じスケルトンに見えますが、片方はジョイントのスケールで位置を調整し、もう一方は移動で調整しています。
Maya では別にエラーが出るわけでもなく、普通にバインドできるので特に問題ないのですが、ゲームに持っていくと様々な問題を引き起こします。スケールの計算処理は思っている以上にややっこしいのです。なので1以外のスケールになっているのが発覚すると、大体プログラマーの雷が落ちます!
Softimage や 3ds Max など他の3DCGアプリケーションとデータをやり取りする場合でもそれぞれのアプリケーションでスケールの処理が異なるのでスケールは常にXYZ=1,1,1にしておくのが無難です。Maya のツールでもスケールが1以外だと正常に動かないことが多々あります。本当に厄介な部分なので注意しましょう。
スケールを入れてしまった場合、Modify > Freeze Transformationsでフリーズすればスケールがリセットされ、ジョイントの位置情報に変換されます。これで大丈夫ですが、そもそもスケールを使わないようにしておけば「うっかりフリーズし忘れた」なんてことも起きないので安心です。
Rotateの値は常に0にする
Rotate値が0になるようにジョイントを作ります。そうすればRotate値を0にすることで簡単にいつでもデフォルトのポーズに戻すことができます。
また、キーフレームを打てばアニメーションは0の値を基準として始まるので、グラフエディターで複数アニメーションを表示したときに見やすくなります。下図のキーフレームを見てどう思いますか?
図のAはデフォルトでのジョイントのRotate値がバラバラな場合です。アニメーションによってどのジョイントがどれだけ回転しているのか把握しにくいですね。
BはデフォルトのRotate値が0になっているので、それぞれのジョイントがどのぐらい回転しているか一目瞭然です。これならアニメーションがつけやすいです。
さて、Rotate値0のジョイントの作り方です。ジョイントは通常のオブジェクトと異なり、内部的な、ローカルな回転情報を持っています。アトリビュートエディターを開くとJoint Orientというものがあります。
ここに数値を入れるとジョイントがRotate同様に回転しますがRotate値は0のままです。これを利用してスケルトンを構築します。
もっと手っ取り早い方法もあります。普通にRotateを使ってジョイントを回転して配置した後に、Modify > Freeze Transformationでフリーズすれば、Rotateの値がJoint Orientの値に変換されます。
Joint Orientにはマニピュレーターがありません。だからジョイントを操作するのが難しいです。普通に回転させて後でフリーズというほうがいいかもしれませんね。