2008-06

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

なんとかXNA上でキャラが動くようになりました

テストに必要なモーションも揃ったので、早速XNAに乗せてみましたが問題多発…。まず、最初に問題になったのが、AnimationClipのDuration(アニメーションの持続時間)。1秒未満のデータはすべて1秒として認識しているようです。SkinnedModelProcessorのProcessAnimationを変更して対応しました。要は、各キーフレームの時間を見て一番デカイ数値をアニメーションの長さとしました。
そして次の問題は…、Matrix.Lerpってそんなに信頼しちゃダメ?的な問題。キーフレーム間の補間や、モーションブレンドに多用していましたが、どうもダメなニオイがします。キーフレーム間の場合はキーが多ければキー同士の情報はほとんど同じなので、それほど気にならなかったのですが、モーションブレンドではかなり無理のある補間をするため、問題が浮き彫りになりました。かなり歪みます。キャラの頭部が歪むのはさすがに厳しく、とりあえずクォータニオン補間にしておきました。キーフレームはすべて行列なので、いちいちスケーリング、位置の要素を抜き出す必要があり、非常に煩わしいものがあります。ていうか、コンテンツパイプライン上で全部のキーフレームをクォータニオン化しておいたほうがいいでしょうね、この方法でいくなら…。さすがにここまでくると、このサンプル(SkinnedSample)ってかなりダメなニオイを発しているような気がするのですが、気づくのが遅かったでしょうか…? やっぱAnimationComponentLibraryの方がいいのかな…?

そして次はMatrixのLookAtなんですが、なんか変? キャラは位置と向きのベクトルで持っていて、LookAtで回転行列を作ったのですが、どうしてもZの向きが逆になる。意味がわかりません。しょうがないので、これも自作して対応…。

これでなんとかキャラが動くようになりました。早速動画に保存してみようと思い、画面キャプチャーのソフトをチェックしてみる。国産もいろいろあるようですが、やっぱりFrapsが一番キレイに撮れました。最新版は日本語化パッチがないっぽいですが、簡単な英語なのでなんとかなりました。シェアウェアなので未登録だと30秒までしか撮れません。かなり強力なソフトなので、これは買ってもいいかなぁと思いました。圧縮はWindowsMediaエンコーダを使いました。タダだし。

最終的なゲームではここまでキャラはデカくないし、キャラの向きは左右限定にするつもりです(上下移動中は若干傾かせるかも)。基本は古いゲームのようなわかりやすさと、奥の深さを追求していきます。
スポンサーサイト

今日は攻撃モーション

今日はショートソードと盾の組み合わせによる攻撃モーションを作成しました。これで『立ち』『移動』『攻撃』が揃ったので、あとは『ダメージ』を作ればあるていど作業が進められそうです。内容的には弱い部類の攻撃として作ったのですが、ヒットまでが20フレーム(秒間60フレーム)あるので、重めな印象です。全体的に重いゲームにしたいと思ってます。一発一発の重み、痛い感触、そういうところを掘り下げていきたいです。

今日は歩きモーション作成

昨日に引き続きモーション作業。今日は歩きモーションを作成しました。最初はもっと構えながらのモーションにしていたのですが、ちょっとキドった感じにしました。キャラの雰囲気がツン入ってるので、こういう歩きは映えますね。というわけで、またYouTubeに貼ってみた。
前回同様ツール上のものなので、タイツは元になるテクスチャーが貼ってあります。これに乗算で色を乗せています。他の金属部分もリフレクションが入っていないし、エッジも入ってません。
本当はすぐプログラムに乗せられるんですが、武器や盾は後付けを想定しているため、その辺の処理を入れないと装備のない状態になってサマにならないんですよ…。

YouTubeって何MBまで動画アップできるんだろ? と思いヘルプを見みてみたら…いくらでもアップしていいらしいです! 初めて知りましたが、スゴイな~。

youtubeのアカウント取ったりモーション作ったり

キャラのセットアップも完成し、いよいよモーション作業に入れる準備が整いました。といっても、まだプログラムへの受け入れ態勢が万全ではないので、すぐにデータは乗らないんですけどね…。まだやっていないのは、複数アニメーションを持ったXファイルの作成と、無駄なデータの削除、フレームレートの調整などなど、コンバーター周りの調整が必要そうです。アニメーションを複数持たせるのは昔のXファイルビューアーでもできるんですが、これだといちいちツール弄らないといけないので面倒なんですよね~。もしかしたらコマンドラインで指定とかできるかもしれませんが、面倒なので自分で作っちゃいます。一応設定のテキストを読み込んで、それに即したコンバートができるようにするつもりなので、汎用的に使えそう。要望あればソースとかアップするかもしれませんが、C#1年生の私が作ったものですので、とてもじゃないけど参考してはいけません!!

そういえばYouTubeのアカウントを作りました。っていうかなんかいつのまにかできてたらしくて、2006年9月23日とか書いてある。このメールアドレス作ったのが2008年の4月なのに…。よくわからないですYouTube。とりあえずツールで作った立ちモーションをテストでアップしてみました。

モデルのセットアップ

腕の長さの問題があって骨の調整をすることになり、それに伴いスキンの入れ直しとなってしまいました。このウェイト作業というのが面倒なんですよね…。結局、エッジのカラーを指定するためにメッシュの分割も随分と変わってしまったため、スキンの入れなおしは不可避だったといえます。さて、気を取り直してウェイトをいれ、モーション作成用の制御構造(Rig)も作ったのですが、武器で戦うのがメインなので、汎用Rigだけではモーション作業が困難です。武器用のRigを作るためにはダミーの武器が必要なので、その辺も用意しないといけないですねぇ。剣は今までのものを使うとして、盾を作らないと…。できるだけ一番大きい盾を作っておけば、モーション作成時のガイドとして使えます。というわけで、盾!
080621_PGirl.jpg

早速作った! カモの紋章の入ったカイトシールドですw
盾との組み合わせなので剣はショートソードにしました。

エッジを入れてみた

キャラモデルに輪郭線を入れてみた。モデルの名前でエッジの色も指定できるようにした。タイツの色はプログラム内で設定しないといけないなぁ…。輪郭線はよくある頂点を法線方向に押し出すシンプルなタイプ。実装自体は非常に簡単なんですが、レンダーステートの設定ミスやら、モデルごとに法線の向きがバラバラだったりして、無駄に時間を喰ってしまいました。眠い…。
080620_PGirl.jpg

ブログのテンプレを元に戻しちゃいました。こっちの方がカワイイね。

今日は水泳でグッタリ…

1300mほど泳いで限界…。体力なさすぎ。また明日から頑張る。というわけでブログのテンプレートを変えてみた。アヒルじゃなくて鴨がいいんだけど、まぁ…あるわけないですね。チッ。

モーションブレンドの実装

SkinningSampleにはモーションブレンドみたいな機能はないので、新たに追加してみました。変更はAnimationPlayerだけでOKでした。必要なメンバー(boneTransformsとかcurrentClipあたり)をブレンド用にもう1組用意しておき、モーションブレンドが発生したら今までのデータをそちらに退避する。あとはUpdate内のUpdateBoneTransformを2回(ブレンドのため)実行して、結果をUpdateWorldTransformで合成しました。UpdateBoneTransformではメソッド内で使用しているメンバー変数は全部引数にして、数値型のものはref付けて参照渡しにしました。これでブレンド用のアップデート処理に対応できました。引数がすごい数になっちゃいましたが、まぁここでしか使わないので良いかなぁと思ってます。サンプルが少ないので本当に完成したのか微妙ですが、なんとか形になったので、良いテストデータが仕上がるまでは放置ということで。

んで、その辺の作業をやっているうちに一つ問題が。3Dツール上では秒間60フレームで1秒(60フレーム)のデータを出力したのですが、CurrentClipのdurationを見ると0.75秒になっているじゃないですか! 計算してみると秒間80フレーム計算になっているっぽい? Xファイルを除いてみるとその辺の設定が見当たらないし。確か、前に出力したときは『AnimTicksPerSecond』があったはずなのに…。しょうがないので昔のデータを見てみるとそちらには確かにある。なぜだ!? とりあえず新しいデータに追記してみた。

AnimTicksPerSecond {
3600;
}

これで秒間60フレームのデータになりました。よくわかんないですが…。元の数値は4800で秒間80フレームだったので、80で割ったところ60になりました。んで、秒間60フレームにしたかったので60を掛けてみたら3600になりました。やってみたらうまきいきました、と。人生行き当たりばったり、試したもん勝ちでしょうか。意味不明ですが。

スキン入れなおしでグッタリ

Rig(モーション作成用制御構造)を入れ込み中に『二の腕』が短すぎることが発覚! ゲーム的に腕は長い方が都合が良いので、伸ばしついでに直すことにした。問題はウェイトの入れなおしが面倒!ということ。やれば1時間も掛からないんだけど、精神的にキツイ。すでに2回やってるし…。あふぅ…。気長にやるかな…。

Xファイルのコンバーター一応の完成

前回のエントリーでも書いたように、固定ポーズのモーションが正常に出ない問題を解消するためにコンバーターを作りました。勉強中のPythonも検討しましたが、やっぱりC#にしました。統合環境で慣れちゃってインテリセンスがないとキー打つのが面倒なんですよね…。終わってるなぁ…私…。まぁ、そんなわけで、コンソールアプリというのに挑戦。正規表現というのも初めてなので、Webで検索しまくりながらなんとか完成。Xfile内の行列キーで0.0を0のように書くとうまく動作しないようです。Xfileを読み下しているときに一度floatとして保管しておき、あとで文字列として必要な箇所に入れたのですが、そこで小数点以下を省かれちゃったみたいです。確かどこかでこういう問題について書かれた記事があったような気がするんですが…。忘れた! しょうがないのでfloatにしないでstringのまま保管する方向で修正しました。
これで固定ポーズのモーションが画面に出ました!
080615_PGirl.jpg

キャラの方は若干足を長くすると同時にスカートの丈を下げました。前の状態だと歩くだけでも股が見えまくってて、ほとんど露出狂状態で切なかったので…。

スキン作成時の注意点

とりあえず完成したモデルに骨を入れて出力してみたが、うまくビルドされない。どうやら、メッシュに2つ以上の骨が設定されていないといけないっぽい。使用しているエクスポーターがその辺を最適化しているためなのか、SkinnedModelProcessorの仕様なのかは区別がつきませんが…。

さらに進めていくと私の使っているエクスポーターがキーが1つしかない階層はアニメーションとして出力していないことが判明。考えられる対策としては…

1:エクスポーターを自作…面倒なので却下
2:コンテンツパイプラインを修正していみる…できればやりたくない
3:出力されたXファイルを修正する…これもどうだろう…

といったところ。とりあえず手作業で3番をやってみたらうまくいったので、コンバーターでも作るかな…。DirectXSDKのビューアーではきちんと表示されていたんだけどな~。

リフレクションマップの調整

リフレクションマップは、元のテクスチャーと反射するテクスチャーを加算・又は乗算していたのですが、加算の方を変更して乗算(3倍)にすることにしました。この変更の意図は元のテクスチャーで描いた黒い影のラインには反射の影響を受けさせたくなかったためです。こんな感じです。
0613_PlayerGirl.jpg

左が加算リフレクションで、右が3倍乗算です。元の画像が明るければ2倍でもいいのですが、暗めに作ってしまったので3倍にしました。左のただの加算はアルミっぽいですが、右のガントレットはラインが強調されていて、締まった印象になりました。暗い部分と明るい部分に差がでて重厚感もあります。これでブルーミングとかさせれば結構今どき感はでるんじゃないかな? 重くなければブルーミングも試してみたいですね~。

それと、カラータイツを11色作りましたw
起動のたびにランダムで変わるようにしました。バカです…w ちなみにカラータイツも乗算(1倍)に変更しました。内股の筋などはポリゴンで立体的に表現していたのですが、このままリフレクションさせるとメタリックな印象になってしまいました(ちょうど前回アップした画像がそんな感じでした)。そこで、ポリゴンによる立体表現ではなく、(真っ白な)テクスチャーにあらかじめ暗くなりそうな部分に薄っすらと陰を入れておき、乗算でおうとつを表現しました。ついでに股にタイツのラインとかも入れておいたりして…。この陰の色が結構難しくて、ただの灰色だとくすんでしまうんですね。そこで暖色系の陰を入れたのですが、今度は寒色系のタイツでは陰がくすんでしまいます。う~ん、どうしたものか…。

ビルボードとか

今日はサクっとビルボードを作る。3軸のほか、Y軸のみのビルボードも作っておく。ついでに、メッシュの名前から取得するフラグも整理する。uintの各ビットをフラグにしていたが、あとでなんかあったときに面倒になりそうなのでクラス化しておく。今日は早めに寝る。

テクスチャー描き

今日も1時間ほどテクスチャーを描く。服のシワが決まるまで何度もツール間を行き来する。30回は往復したと思う。疲れるけど、決まると気持ちいい。なんとかシャツは終わったので、明日はブーツあたりをやりたい。眠いので寝る…。

テクスチャー作業に入る

キャラの方向性もだいぶ固まってきたので、テクスチャー作業に入る。ある程度できてきたので、プログラムに乗せてみる。ついでに金属部分に加算映りこみを入れてみる。顔とYシャツ以外がリアル路線な気もするが、まぁ…いいんじゃないかな?たぶん。
0608_PlayerGirl.jpg

BasicEffectを使用せずにモデルを描画

ベーシックエフェクトから独自のエフェクトに乗せ変えたいんだけど、パイプラインを作るのは面倒なんですよね。そこでモデルを読み込んだ後でエフェクトを乗せかえるんですが、この辺が微妙にうまくいっていませんでした。ベーシックエフェクトはメッシュごとに個別にエフェクトを持っているため、後でテクスチャーを指定する必要がないです。ですが、普通にエフェクトをロードするとインスタンスが返されてしまうので、個別にテクスチャーを設定できません。どうやらエフェクトクラスのメンバーにあるクローンを使うみたいです。でもうまくいかないんですよ…。メッシュがバラバラになったり、最後に描画したモデルしか表示されなかったりするんです。なんだろうな~と小一時間悩んだ末、ヘルプと全く同じやり方にしてみたら問題なく動作しました…。for文をforeach文に書き換えただけなんだけど…。微妙に動作が違うのか? とりあえず、この辺のヘルプがまさにそのことを書いていますので、同じような問題にぶつかりましたらお試しください…。

タイツシェーダー(汗

タイツシェーダーなんて大したものでもないんですが…。ただのリフレクションマップです。頂点の法線方向を見てUV値を決める単純なヤツです。手前ちょい上あたりを肌色気味にして、下方向は暗めにしています。また、上方向側面に近くなるほど明るくしています。実際のカラータイツはこんなに光沢気味ではないんですよね。もっとマットなイメージだと思います。明るい部分を調整すればもっとらしくなりそう。定番の黒タイツもつくってみたら、コッチの方は割りとリアルにできました。

キャラは3000ポリゴンで抑えました。自分のノートPCでは秒間60フレームで60体ほど描画できました。1秒間で約1000万ポリゴンですね。バッファローマンクラスかな。現状だとスキンモデルよりもノンスキンの方が重い状態です。やはり、読み込み後にBasicEffectを強引に差し替えたのが原因なのかな?
0607_PlayerGirl.jpg

XNAでのスキンアニメーションについて

XNAでスキンアニメーションする場合の選択肢と状況をまとめてみます。

SkinningSample
海外のオフィシャル、クリエーターズクラブオンラインにあるサンプル(無料)です。ソースごとプロジェクトに入れて使えば、平行して改造できます。なんだかんだで機能追加したくなるんですよね。ただ、キーフレーム間の補間をしてくれないので、毎フレームにキーがあるアニメーションしかキチンと再生できません。この辺の修正はContentsPipeline周りを直さないといけないので面倒です…。オフィシャルなサンプルなんだからもうちょい頑張ってほしかったなぁ~。

AnimationComponentLibrary
2007年4月から更新がとまってしまっているようですが、完成度は高いようなので多くの方に支持されているようです。公式サイトのものはGSE2.0に対応していませんが、同フォーラムにはGSE2.0で動作するバイナリがあがっているようです。参照設定にDLL入れて使う感じ。その他詳細はコチラのサイトが参考になります。

COLLADA
COLLADAというのはSCEが中心になって進めているオープンソースな3Dファイルフォーマットらしいです。いろいろなCGツールから出力するためのプラグインが公開されているようです。XNAでの入力サンプルをベンジャミンさんが公開されています。GSE2.0にも対応されているようです。公開されているソースを自分のソリューションに組み込んで使うっぽいです。COLLADA関連のファイル(エクスポーターとか)はこちらで。

モーションのスロー再生

モデル周りの整理ついでにモーションのスロー再生を試してみました。SKinningSampleでは時間はTimeSpanで渡すのですが、これだと再生速度は指定できないんですよね…。AnimationControllerへの引数をfloatにでもしようかと思ったんですが、どうにも深いところまで食い込んでいて修正するのが面倒…。とりあえず係数を一緒に渡して対応しました。経験上、スローだとループ再生時にガタツキが出やすいんですが、その辺もキッチリ確認。後はモーションブレンドとかかな、モーション周りは。

モデルのインスタンス

シーン内に同じモデルを複数配置する場合について調べていたら、同じモデルを読みこんだ場合、自動的にインスタンスが渡される、というヘルプの記事を見つける。試しにボタンを押したら100体ほどモデルを読み込むようにしてみた。ボタンを押しても、まったくHDDへのアクセスがなかった。いろいろ方法や問題点を危惧していたが杞憂に終わる。XNAすげ~。

今まで知らなかったんですが、クラスの配列は初期化時にコンストラクタが呼ばれないんですね…。こんな感じで書いていたんですが、
MyClass[] classes = new MyClass[5];
てっきり、それぞれコンストラクタが呼ばれているもんだと勘違いしていました。以下のようなやり方もありらしいですが…。
MyClass[] classes = new MyClass[3]{ MyClass(1), MyClass(123),MyClass(64)};
う~んC#ももっと勉強しないとなぁ~。

自宅のマウスがいかれてきたのでニューマウスを購入。新マウスは会社で使うことにして、会社のヤツを家に持ち帰ることにする。新マウスはゲーマー向けということで、オモリをセットできて自分で変えられるようになっている。バカっぽいけど、面白い。とりあえず一番重い状態で使用する。オモリがボタン電池のようだと同僚のツッコミ。ボタン電池8つぐらい必要なマウスってやだな…。

リフレクションマップ完了

昨日に引き続きリフレクションマップを実装中。昨日の段階で変な感じだったのは、やはり行列の掛ける順番でした。割とそれっぽくなっていたので、別の理由なども考えていましたが、やっぱこの辺はキチンと理解しないといけないですね…。リフレクションマップは元の画像と加算合成、および乗算合成のほか、写りこみだけの、3種類のテクニックを用意してみた。テクニックは3つあってもピクセルシェーダー部分だけが3つあるだけなので、作業自体は楽にできました。だいぶシェーダー周りも慣れてきたと思う。なんというか、RenderMonkeyとかとうまく連動できていないので、GSE上でFXファイルをガリガリ書くことが多かったです。C#を書いているときはインテリセンスがものすごい勢いで候補を出してくれるうえ、エラーをリアルタイムに出してくれるので、なんというか考えもなしにソース書いている感じですが、FXになると途端にインテリセンスが利かなくなり、不便に感じます。だんだんユトってきましたよ…。

せっかく実装したリフレクションマップでいろいろ応用してタイツの表現を試しています。視点方向に近くなるほど地肌が見えて、反れるほど色が濃くなる。側面付近にふんわりとライトが当たっているかのように明るくしてみる。ほんとうはさらにライティングすれば良いのだが、ライティングは全部OFFったので、リフレクションマップ上で下方向を暗くしていく。結構それっぽく見えたので、現在のモデルがある程度できたら、乗せてみたいところです。楽しみだ~。

シェーダーの練習

今日はシェーダー周りの練習をしてみる。RenderMonkeyを使って簡単なリフレクションマップを作ってみた。キューブマップではなく、単純な1枚のテクスチャーを用意して、頂点の法線でUVを決めるヤツです。RenderMonkeyにある写りこみのサンプルはレベル高すぎて参考にならない…。Webを探してみたが、うまく見つけられなかったので、自力で挑戦してみる。一応イメージどおりにはなったので、早速FXで出力してみた。だけれども…ソースがゴチャゴチャしていて使う気になれないので、SkinnedSampleのFXファイルを修正する形で実装してみる。実行してみると…なんか変? 写りこみ感がないのはなんなんだろう…。スキンモデルなので、トランスフォーム後の法線を使うとか? いろいろ試したがRenderMonkeyのときのプレビューのような結果が得られなかった。残念。明日は水泳だ! と思ったら日付超えてた…。今日は水泳だ…。

テクスチャーの描き直し

少しずつではありますが、テクスチャーの描き直しを進行中。最低でも1日1時間以上はやりたいけど、時間が作れない。プログラムの方は、モデル周りを整頓しながらバグ取り中。メッシュからのフラグはuintのビットでいいかと思ってたけど、エッジカラーとか指定したくなってきたので、フラグのクラス化を検討中。ていうかやらないとダメかな。Xファイルは何かと問題が出やすい気がするのは気のせいでしょうか?DirectXのXファイルビューアーだとちゃんとでるのに、XNA上ではでないことがあるような…でも試行錯誤しているうちに、理由もわからず突然正常にでたりする。う~ん、問題点が見えない。眠くなってきた…。

今日もモデリング

昨日に引き続きモデリング。頭部がさびしい感じがしたので、ヘルメットやティアラを付けてみたが、いまいちピンとこなかったので止める。代わりに肩にアーマーを付けたら戦士らしさが出た。また、スカートの裾にフリルを付けてみた。ないよりかは派手さがあるのは確かだが、なんか狙いすぎ感があって気になる。少し様子見かな。画像は完成イメージとして作ったもの。
0601_PlayerGirl.jpg

金属部分は別メッシュにしてあるので、後々リフレクションマップとかやってみたい。色はキャミソールをオレンジイエローにしたら割と落ち着いた印象。あとタイツも彩度を落としてみた。

NEW ENTRY «  | BLOG TOP |  » OLD ENTRY

プロフィール

Karu_gamo

Author:Karu_gamo
<メールアドレス>
karu_gamo#hotmail.co.jp
#を@に置き換えてえてください。

<自分リンク>
かるがも研究所【新】
YouTubeチャンネル
公開素材置き場
仕様書
旧ブログ(見るとこないです)
管理者ページ

リンク

YouTube動画

FC2カウンター

カテゴリー

Twitter

 

月別アーカイブ

RSSフィード

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。