チュートリアル / 読んで触ってよくわかる!Mayaを使いこなす為のAtoZ
第22回:ゲームでのスケルトン作成

更新日 2011.12.19

いまさらですが、思い返してみるとゲーム開発者ならではの話が少ない…ということに気付いたので、今回はゲームでの話をしてみたいと思います。これからもちょくちょくゲームでのデータ作成方法を紹介して行きます。

前回はジョイントが変形に与える影響を見ました。基本的にジョイントを増やせばクオリティも上がります。が、ゲームはリアルタイム性が命です。「自然にキャラが動いているけど、処理落ちして動きがカクカクでゲームにならない!」では困ります。

(モデルに対してもっとも変形の自由度が高いようにジョイントを配置するということは、各頂点にジョイントを置くことです。つまりブレンドシェープです。これについても話ができれば面白いのですが、そのうち。)

多いジョイントは高負荷につながり「処理落ち」を誘発します。なので、なるべく少ないジョイント数できれいに見せる必要があります。

昔は無茶苦茶ジョイントを減らして、とにかく処理を速くするという感じでした。減らしすぎてデータが見にくくなることもしばしば。最近はコンピューターの性能が高いですから、あまりにジョイントを減らしすぎてデータが扱いにくくなるよりは、ほどほどな感じでジョイントを減らした方が良いです。



減らしすぎると、普通の状態に戻すのがとても大変なんですよね…。

他のアプローチ方法としては、オリジナルのデータは映画同様のジョイント数にしておいて、ゲーム用のデータとしてコンバートしたり、ゲーム実行時にゲーム用データとして最適化する、という方法もありです。なかなかそこまでの環境を用意しているところは無いと思いますが、今後は増えていくことでしょう。


あとゲームではデータをクリーンに保つことも重要です。コントローラーで上を押せば+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にはマニピュレーターがありません。だからジョイントを操作するのが難しいです。普通に回転させて後でフリーズというほうがいいかもしれませんね。


〈 次ページへ続く 〉余分な位置情報入れない

更新日 2011.12.19
著者プロフィール
築島 智之
築島 智之
株式会社セガ 第二研究開発本部 デザインリーダー
学生の頃に今は懐かしいO2やIndigo2で琴の音色を聞きながらMayaを学んだ後、2002年から株式会社セガにてMayaを使ったゲーム開発を行っています。これまで「アヴァロンの鍵」「Let’s Go Jungle!」「頭文字D5」等アーケードゲームの製作に携わってきました。モデリングからアニメーション、レンダリング、カットシーン等様々なアートワーク作成及びテクニカルアーティストとしてMel、Python、APIを使用したツール製作まで幅広く開発に関わっていますのでコラムの内容も実践的なものからネタ的なものまで色々取り揃えて飽きないようにしたいと思っています。

カテゴリ

トレンド&テクノロジー
トレンド&テクノロジー
チュートリアル
チュートリアル
Autodesk GAMEWARE
オートデスク クリエイティブ フィニッシング アーチスト名鑑
DEC iNews
オートデスクの業界メールマガジンを月刊でお届けいたします。
登録
Design Visualization

カテゴリ別最新記事

コラム
ユーザ事例
イベント情報

体験版ダウンロード

Autodesk Entertainment Creation Suite Autodesk Entertainment Creation Suite
Autodesk 3ds Max Autodesk 3ds Max
Autodesk 3ds Max Design Autodesk 3ds Max Design
Autodesk Maya Autodesk Maya
Autodesk Softimage Autodesk Softimage
Autodesk MotionBuilder Autodesk MotionBuilder
Autodesk Mudbox Autodesk Mudbox
Autodesk Showcase Autodesk Showcase