開発ログ
■2006年
■2007年
■2008年
■2009年
■最新10件
冬コミ用にいろいろ体裁を整えてます。
タイトル画面を変更。

CDレーベルはこんなかんじ

中身はまだまだいじくりまわし中。
明日の昼ごろから焼き始めないと間に合わない予感。
Lv3魔法を仮実装。
エフェクトにテクスチャ貼らないとしょぼいわ・・・。

ダメージは低いけど広範囲。

で、3秒間のスタン効果。
Lv2とLv4のエフェクトもしょぼしょぼなので、何とかしなくちゃだわ。
D3Dデバイスを生成する前に、GetDeviceCapsでビデオカードの機能チェックをするようにしました。
自動で適切なシェーダーを選択するようにしたので、起動時のダイアログボックスから、
ピクセルシェーダーのバージョンを選択させる部分を削除。
マルチサンプリング機能の調査も行って、サポートしてない場合は使わないようにしたので、
FSAAが原因で起動に失敗しないようになりました。
ピクセルシェーダーが1.1より古いビデオカードは、相変わらず動きませんけども・・・
丸影でごめんなさい。
時間ないので今回はこれで勘弁してください。
ただ丸影出すだけじゃあんまりなんで、
キャラと接地面までの距離でスケーリング(地面から離れるほど小さくなる)とか

法線を参照して傾けたりとか。

でもまぁ所詮丸影なんで、複雑な地形だと浮いたり埋まったりしちゃうんですよね。
シャドウボリュームとかシャドウマップの検証は来年に・・・。
水面への写りこみ表現。

反射する平面(この場合水面)に対して反転させたモデルを追加するだけの、超お手軽フェイク技法。
そのかわり反射面は動かないことが条件。
なので水面の揺らぎが発生すると破綻します。
揺らぎはマジメにやると結構しんどいので、まだやりませんがー。
ひとまずUVスクロールでもやらしとこうかと。
固定配置の背景オブジェクトなら、最初から反転モデルを持ってりゃいいけど、
ゲーム中に動いてるもの、例えばプレイヤーやエネミーなどは、モーションによる
頂点の変形があるので、反転モデルを毎フレーム更新しないといけない。
これは処理速度的にキツイので保留。
テクスチャフィルタリングのテストとか。
テクスチャのロード時に、ミップマップを生成するような設定にしていたので、
そのまま自動で適用されるものだろうと思っていたのだけど・・・
デフォルトではミップマップはOFFになっているようです。
例えばテクスチャステージ0のミップマップを有効にするには
dev->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_POINT);
とします。これでミップマップが有効になります。(D3DSAMP_MIPFILTERのデフォルトはD3DTEXF_NONEになっているようです)
しかしこのままでは、ミップマップのレベルが切り替わるポイントがハッキリと見えてしまうので、
dev->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);
に変えます。これならミップマップの前後のレベルを線形補間してくれます。
↓地面に注目

遠方のちらつきが解消しました。
以下のサイトでテクスチャフィルタリングについて分かりやすく解説しています。
http://www.4gamer.net/specials/3de/nv_at/nv_at01.html
テクスチャの縦と横の線形補間でバイリニアというのは知ってたけど、
さらにミップマップの線形補間も加えてトライリニアと言うのかー!
異方性フィルタリングについても検証してみましたが、
ミップマップほどの劇的な効果は得られなかったため、今回は未採用です・・・。
今後オプションで選べるようにする予定。
木の葉を描画するためのレンダーステートの設定。
DirectX SDKのヘルプ ”アルファ テスティング ステート”
にそのままのっていました。
dev->SetRenderState(D3DRS_ALPHAREF, (DWORD)0x00000001);
dev->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE);
dev->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL);
D3DRS_ALPHAREFがアルファの閾値。
上の例だと、アルファが1以上なら描画するということになります。
アルファが0の場合、そのピクセルは無視され、Zバッファ書き込みもスキップされます。
木の葉テクスチャのアルファを0と255の2値のみで作ったとしても、リニアフィルタ付き拡大されると、
中間のアルファが出来てしまうので、閾値はもうちょい上げた方がよさそうです。
ここでは0x80(10進数で128)を採用しました。
拡大したときでも、アルファがちょうど半分を超えたピクセルのみ描画されます。

地面に生えてる草もアルファ128以下の部分がカットされてしまってる・・・
マテリアルに属性追加して、アルファテストするものを特定しないといけないなぁ。
これで金網とか鎖とかもテクスチャだけで表現できそう。
2006/11/21のログで悩んでた件。
思い出した。dotXSI3.0より上のバージョンで吐き出すと、それを再度編集しようと思って読み込み直したときに壊れるんだ・・・
XSIのアホー!なんで自分で出力したものも満足に読めないんだよ!
残り1ヶ月。時間ねぇー!
今回も前日ギリギリまで作りこむことになるでしょう。
まだ仮組みのマップモデル。某氏よりいただきました。

木の描画に失敗。アルファで抜ける部分もZバッファに書き込んでいるため、
描画順が後で、しかも遠い木はデプステストではじかれてしまう。
うまく描画するには、
”ある閾値よりアルファが小さいピクセルは描画しない”
というようにレンダーステートを設定しなければならない。
そんな都合のいい設定できるのか。現在調査中。
剣の軌跡バグ判明。凾伯v算部分でした。
凾狽ニいうのは、ものすごーく短い時間のことです。
どんな性能のPCでも同じような挙動をさせるために、タイマーを使ったフレーム制御がよく使われます。
例えば秒間60フレームのゲームなら、約0.016秒経過するまでsleepさせるってやつです。
プログラムは、毎フレーム約0.016秒という固定の経過時間を期待し、処理を進めて、描画します。
しかしこの場合、1フレームの処理に0.016秒以上経過してしまうと、実時間より遅れた挙動
いわゆる”処理落ち”になります。
これを回避するためには、可変の経過時間に合わせたプログラムを書くことです。
1フレーム処理するのに費やした時間を凾狽ニします。
ここでは
オイラー法
というのを使用してます。
凾狽謔閧烽チと小さい一定の時間を、凾狽ノなるまで繰り返し計算するってやつです。
モーションのボーン更新処理は、処理速度を稼ぐために、この繰り返し計算を避けて、
描画寸前に1回だけ凾狽ナ処理させてました。
なのでいくらボーンを参照しても、描画されるまでは
いつまでたっても同じ値しか帰ってこなかったのです。
寝かせるとかいいつつ半日ほど悩んでしまった・・・。
置いといてボスでも作ろうかと思ってたのに。
でもまー直ったので良し。

かなりキレイになりました。某キャリバーのような感じ。
しかしまた新たにコリジョン抜けバグが発覚。
道のりは険しい。
剣に軌跡。

ボーンの位置を参照して動的生成。
2〜3フレームくらいの短い時間なので、キレイな軌跡を出すには中間部分を補間で生成しなければならない。
剣の柄の部分(始点)から先端の部分(終点)へ向かうベクトルを生成し、
その中間のベクトルは、前フレームで生成したベクトルとの間の線形補間で求める。
始点も線形補間しておく。
正規化して、一定の長さを掛けて始点に足してやれば、それっぽい終点の位置が得られる。
わりと滑らか・・・になるはずだったんだけど、なんかバグってる。
下半分だけうまくいってるのが不思議・・・。
補間部分で何か見落としてるのか、徐々に太くしようとしていじくり回したのが悪いのか。
コード追ってみたけど原因不明・・・むぅ。
しばらく寝かせることにしよう。
エフェクト強化。

通常攻撃でこれはちょっとやりすぎたかもしれない。
縮小画像でよう分からんけども、粉飛びまくってます。
dotXSI3.0フォーマットでは、テクスチャを貼ると、そのマテリアルの
ディフューズとアンビエントが初期値でしか出力されないという問題がありました。
ほっとくわけにもいかないので、ファイル読んで指定マテリアルを書き換えるツール作成。
XSIで出力した後、このバッチをたたく。
一時しのぎだなぁ。手間が1つ増えてしまったけどしゃーないか。
dotXSI3.5以上なら大丈夫らしいのだけど、何か別の実装するにあたって致命的な
問題があって3.0に決定したような記憶が。うーん・・・思い出せない。
さてそろそろ告知しておきましょう。
冬コミ落ちましたが、委託で参加します。
コミックマーケット71
|
12/31(日) 東地区 イ-52b 「牛乳家族」
|
こちらで委託配布の許可をいただきました。ありがとうございます。お世話になります。
Mesogears v0.30を予定しております。よろしくお願いします。
とはいってもね、今月から来月下旬あたりまで仕事の方も修羅場なんですわ。
下手すると、今このサイトにアップしてあるv0.26と全然変わらないやん!
という可能性もナキニシモアラズで
まさに
物売るっていうレベルじゃねーぞ!
という状況でありまして。
こりゃきっと今回も無料配布ですね・・・。
なんとか時間作って少しでも新要素盛り込めたらいいなぁ。
いまさらって気もしますが、ビルボード実装。
常にカメラの方を向くポリゴンのことで、エフェクトなんかに多用されてますよね〜。
実装方法はいろいろありますが、今回は変換行列を弄るだけの手軽な方法でいきます。
普段モデルを描画する際に、頂点シェーダに渡す行列は
World * View * Project
で、ビルボードの場合は、移動せずにカメラの逆回転を行うだけの行列「InvView」を
ワールド行列の前にもってきます。
InvView * World * View * Project
以上。これで常にカメラの方を向きます。
このInvViewはビュー行列の平行移動成分をクリアした後転置すりゃできますね。
システム出来たので次は素材。
ビルボードに貼っ付けるテクスチャかきかき。

んまー、とりあえずこんなもんでいっか。
相変わらず、鉛筆・消しゴム・フィルター>ぼかし(ガウス)程度しか使いこなせてない。
高級ソフトが泣いてるぜハハハハ・・・・orz
ゲームに反映しました。
頂点カラーで色付け。素材をグレイスケールにしたのはこのためです。
時間でスケールとアルファを更新。ここら辺が結構面倒だったりします。

そうだパーティクル描画システムも作ろう。
処理落ち上等!画面が白飛びするくらいガンガン出してやるぜー
・・・・・・
・・・
一ヶ月もあけといて何やってんだとかいわない。
あー冬までもぉー時間ねぇー!!
新キャラモデルとか追加したいんだけど微妙です。
ゲージの中身とタイマー実装
タイムリミット0になっても今のところ何もなし。ひとまず雰囲気だけ・・・。
ゲージの中の緑がライフで下の細くて青いのが経験値。

エネミー側もちゃんと実装しましたよ。

ダメージ判定があってから2秒間表示してます。
横切りとかチャージLv2なんかは範囲が広いから、一気に3〜4匹表示されたり。
ところで、
v0.25でFSAAx4をハードコーディングしちゃったのですが、
それが原因で起動しないマシンが意外と多い事が判明。
ちなみに、うちのセカンドマシン(RADEON9200)とノート(LetsNoteT5)も駄目でしたorz
んー、アップする前に複数の環境で起動チェックするべきだったなぁ・・・。
つーわけで急遽対応することに・・・。

起動時のダイアログボックスで [ NONE, x2, x4 ] の中から選べるように。
デフォルトはNONE。
これなら大抵のマシンで動くと思われます。
ハイスペックなマシン所有者は是非x4で!ホント綺麗になるんで。マジオススメ!!
せっかくの3連休なのに半分くらいWC3で無駄にした・・・バカカオレワ
タイトル周りとゲーム中のスプライト関係をガシガシ実装。
絵を描いてる時間の方がコーディングより長かった。
普段絵なんて描かないからしんどいわー。

どうしても幾何学的な物で逃げてしまいがち。
しょぼいけどしゃーない。凝ると失敗するし。
んで、実機に反映。

んー。一気にゲームらしくなったなぁ。
アイテムはひとまずテストとしてMAXまで持たせてみました。
ライフゲージの中身の処理はまだ未実装・・・
攻撃当てると内部的に敵のHPは減ってるんですけどね。
倒したら経験値となるジェムをばら撒く予定。
現在はコリジョンテスト用の球を出してます。
そのほか、
タイトル周りと足音のSE付け
キックモーション修正
ジャンプアタック追加
とりあえずこんなとこかなー。
実行ファイルageときます。
filesからどうぞ。
FSAA(フルシーンアンチエイリアシング)の実験。
コード的にはたいしたことは無い。
D3Dデバイスの作成時に必要なプレゼントパラメータにちょいと設定を追加するだけ。
D3DPRESENT_PARAMETERS d3dpp;
d3dpp.MultiSampleType = D3DMULTISAMPLE_4_SAMPLES;
d3dpp.MultiSampleQuality = 0;
以上。
これでFSAA(x4)が出来てしまうというスバラシイ機能なわけです。
違いは以下の通り。

↓FSAA適用

FSAAの方がジャギーが目立たなくなってます。
でもやっぱりデメリットはあるわけで。単純に処理が重くなります。
ビデオカードの要求スペックも当然上がっちゃいますねぇ。コマッタモンダ。
ちなみにうちの環境(GeForce6800)では
・ウインドウモード時
Default 47fps
FSAA(x2) 47fps
FSAA(x4) 35fps
・フルスクリーン時
Default 50fps
FSAA(x2) 50fps
FSAA(x4) 50fps
というような結果でした。
x2までならFSAAやってもやんなくても同じっていうのは意外。フルスクリーンならx4でも変わらない。スゲェ。
たぶんビデオカードによって違うんでしょう。
オプションで弄れるようにするのがベストかもなぁ。
サンクリ行ってきました。
規模はコミケより小さいので、どうせ今回も余るだろうなぁと思っていたのだけど・・・
・・・ゴメンナサイ。サンクリなめてました。
めちゃんこ人来るじゃないですか!
いやぁおかげさまで在庫全て配布完了です。どうもありがとうございました。
要求スペック高すぎて動かない人続出なんだろうなぁ・・・
ブランクメディアとして使えるように書き込みセッション閉じないでおけばよかった。
Dホールだけなのかなぁ終了アナウンスが流れなかったり。
端の方から拍手が上がり、伝染して場内全体が拍手になってそのまま終わり。
終了時間が経過しておろおろしているスタッフが面白かったので良し。
てかね今回も、はいだ画伯の恐ろしさを実感しましたよえぇ。
みんな銀様スルーで某黄色い物体に人気集中ですよ!
作業時間比およそ100:1なのに!
チクショウこうなったらプラクティスモード限定mobとして隔離していじめてやるわ!
・・・んで、近況。
エフェクトの描画に使うクラス作成。管理方法で思案中。
剣の奇跡とかはやっぱり特別処理になるかなぁ・・・
新しいマップキタワァ

某2面です。裏ルートなら3面か。(分かる人だけニヤニヤしてください・・・)
XSIで作ったポリゴン形状をそのままマップコリジョンとして使えるようにしてあるので
すぐにでもここでテストできるのはいいんだけど・・・重い。
手間だけどコリジョンデータは手動でリダクションせにゃならんね。

しかもコリジョン抜けが予想以上に頻発する。階段周りがかなり怪しい。
判定周り見直しだなぁ。
告知です。
サンクリに委託で参加します。
サンシャインクリエイション33
|
10/1(日) Dホール ソ19b 「牛乳家族」
|
こちらで委託配布の許可をいただきました。ありがとうございます。お世話になります。
Mesogears v0.2の無料配布を予定しています。
よろしくお願いします。
えーっとまぁ・・・所謂夏コミの在庫処分ですスイマセン。
ちなみに、知り合いの某イベントスタッフ様から大変ありがたい言葉を頂戴しております。
「サンクリはゴミ捨て場じゃねぇんだよ!」
本当にありがとうございましたorz
タイトル周りをぼちぼち。

凝った演出とかは後にして、先ずはオーソドックスな感じで。
PhotoshopCS2を購入してアルファ付きPNGの出力も可能になった。
しばらくPNGでやっていこうと思う。
理想は独自形式だけどいろいろと面倒くさい。
タイトル周り製作中にちょいとテクスチャのサイズで悩まされた。
800*600のテクスチャがうまく表示されない。
1時間ほど見当違いな場所を弄るも効果なし。
読み込んだときに、自動的に一回り大きい2のべき乗にリサイズされるのをスッカリ忘れてた・・・バカカオレワ
しゃーないので1024*1024でテクスチャ作り直し。
アスペクト比そのままだと1024*768なので、縦に無駄な領域が出来ちまったけどまぁいいや。
どこかで有効活用してやろう。
キックモーション追加。
チャージLv1からの3段コンボに使用。


∧_∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
(・∀・∩< 愛がアップ
(つ 丿 \___________
⊂二_ ノ
(_)
ソースが大きくなってきたんで、cvs導入しました。
個人開発だから衝突の心配はないんですが、まぁ主に履歴用ですわ。
いつかまた参照するかもしれないと思って、わざわざ古いコードをコメントで残しておいたり、
#ifで分けてあったりで可読性が非常に悪かったのが、もう未練無くバッサリ切れます。
diffツールと併用して変更箇所が分かりやすく表示できるから、大変重宝しています。
ちなみに使用してるのは
WinCVS1.2SJISごった煮
ですが、どうやら現在は消えてる模様。
有志が1.3の開発をしてるっぽいけど・・・更新止まってるなぁ

はい。カラス除けが100円です。
只今当日朝5:00であります。
気合いで200枚焼き上げました。レーベル印刷も終了しました。もうヘロヘロです。
データサイズ1.3Mなので焼きよりレーベル印刷の方が時間が掛かる罠。
スプーが黄色のインク食いまくり・・・
レーベルデザインもうちょっと考えるべきだったorz
焼いて印刷して袋に詰めて、慣れてくれば大体1枚2分くらいかな。
100が限界かなーと思ってたけど意外といけるもんだ。
こういう単純作業って結構好きかもしれない。
余裕があれば二日かけて500いけちゃったりするかもね。
でもさすがにそれ以上はプレスになるだろうなぁ。
ってそんなことより刷った分ちゃんとはけるかどうかを心配したほうがよさそうだ・・・
-------------------------------------------------
20:00
只今戻りました。
えー、すいません、正直コミケをなめてました。
今回の売り上げ・・・300円です orz OTL ○| ̄|_
販売開始から2時間でたったの2枚です。
こりゃぁちょっとやばい。200枚も持ってきてんのにこれはまずい!!
ってことで途中から無料配布に切り替えたのです。
最初に100円で買ってくれた方・・・申し訳ありませんm(_ _)m
後半、無料なのにわざわざ100円払ってくれた方が1名。どうもありがとう!! おじさん嬉しくて涙が出てくらぁ。
で、結局無料にしても50枚ほどしか配布できなかったという体たらく。
興味を持ってくれる方はたくさんいたのだけれど、なかなかCDは持ってってくれない。むずかしいなぁ。
まぁそんなこんなで売り上げ的にはグデグデだったけど面白かったよ。
やっぱり直接見てもらって観想聞けるのってこういう即売会ならではだ。
銀様の反応はいまいち。スプーでニヤニヤしてる方が多かった。(スプーの人気に嫉妬!)
委託をお願いした場所がリリカルなのはのエリアだったので、ローゼンは浮いてたのかもしれない。
しかしまぁあれだねぇ、6年前、フロッピーで売ってた頃は100枚じゃぜんぜん足りないくらいだったのに。
時代は変わったなぁ。
最近は同人のレベルも上がってきて、3Dモデルがちょと動いてますよ程度じゃ珍しくもなんとも無いんだよねぇ。
今回のコミケはいろいろ勉強になりました。
残った分は10/1のサンクリで、今度は、はなっから無料配布でばら撒いてみようと思います。
さぁ冬に向けて開発がんばるぞー!!
・・・とその前にひぐらしやらなきゃ(だめじゃん)
あ、そうそう。販促用のムービー。
せっかくなんでアップしちゃおう。
filesからどうぞ。
ラストスパート!!
取って付けたようなスプーのHPゲージ。
攻撃モーション6種
魔法モーション3種
それぞれの当たり判定
スプーのダメージモーション3種
以上ぎりぎりせふで今回のROMに乗っかりました。
まぁまだ全然ゲームとしてはダメダメな領域ですよ。次は冬だなぁ。
スプー、襲来

歌のおねえさん、ごめんなさい。
魔法とか。

球モデルを加算半透明で重ね描き。
スプライトやらビルボードやらパーティクルやらのシステムをそろそろ作らないとなぁ。
3段目。
モーション編集もだいぶ要領得てきた感じ。

↓

↓

回転の力を利用した横斬り。
止め絵だと分かりにくいかなー。
動画でも作ってみようかしら。
・・・できた。
test.avi(336KB)
キャプチャツール Frapsを使用させてもらいました。
そのままだとサイズが大きすぎるので再圧縮しました。
再生するにはコーデック DivX 6.2が必要です。
2段目。

↓

足をどう動かしていいのかいまいち分からない。
まずは大まかに作って後から調整ですかね。
攻撃モーション1個獲得。

↓

6時間くらい弄った挙句この体たらく。
なかなかイメージ通りの動きって作れないもんだなぁ。
右手の指はボーン変形ではなくて単なる握ったモデル・・・
どうせアニメーションしないし、しばらくこのままでいこう。
ボーンを入れるのは時間に余裕が出来たときにでも。
告知です。
夏コミにてMesogears動作試験版(仮)を出しちゃいます。
多分ベンチマークのようなものになるんじゃないかなぁと思います。
ゲームとして成り立ってるかどうかは期待しないように!
ビデオカードが非対応で動かなかったとしても泣かないように!
コミックマーケット70
|
8/13(日) 東地区 ク-20b 「牛乳家族」
|
こちらで委託販売の許可をいただきました。ありがとうございます。お世話になります。
100枚くらい作って持ってくので、スペースの隅にでも適当に置いといてくださいorz
しかしまぁコミケねぇ、6年ぶりだわ。
時代はもうFDじゃなくてCD-Rだよなぁ。DVDなんてとこもあるのかな。
この調子だと今回も容量1M以内に収まるサイズなんですが。
ってそんなん言ってたってどうせCD-Rでいくんだろ自分。FDより安いし。(申し訳ありませんフロッピー麻生閣下!)
動かせるノートPCが無いからデモは無理。これはもうだめかもわからんね。
あ、羽忘れてた羽。

・・・ビミョー?
コリジョンディテクション実装中
・直線と平面
・球と球
・球と平面
(平面は3頂点指定型の有限範囲仕様)
今のところこんなもん。
それぞれ衝突座標と衝突面法線を算出できるような仕組み。
反射ベクトルを計算する関数も追加。
オブジェクトごとに質量と速度パラメータを持たせて、
軽くシミュっぽいことが出来るような感じになりました。
実行ファイルをうぷしました。filesからどうぞ。

衝突した瞬間スイングバイ軌道で小さいほうが吹っ飛んだり・・・
怪しい挙動満載です。
仕様じゃないですバグですorz
攻撃モーション作成を途中で放っといて、コリジョンディテクションの実装やってます・・・
現在はxsiファイルからトライアングルのみ抽出して、コリジョン用データの生成まで。
判定はマジメにやろうとするとかなりしんどいから、まずは簡単に全トライアングルとライン判定させよう。
今日中に目処つけたいなー。
・・・
・・・更新画像これといって特に貼るものないな。
mqoファイル拾ってきて遊んでたのでも貼ってみよか。

のめ!
ティーガー by CypherS TufT
赤提灯 by WITCH☆CRAFT
うめぇなぁ。
他にもいろんなサイトからモデルデータファイル拾ってきて遊んでました。
やっぱプロは違うワァ。自分も精進せねば。
剣モデリング

ポリゴン割りまくり。
こういうディテールはテクスチャで表現したほうが軽いだろうね。
XSIでのテクスチャの張り方調べなきゃ・・・
持たせてみる。

ゴイスー(゚∀゚)
あぁはやく振り回したい。
服のウェイト調整中・・・

今週もプログラム進んでねー。
夏コミまで残り1ヶ月だしそろそろゲーム部分作らないと間に合わないかも。
今週中に武器モデルと攻撃モーション作るとこまでいけっかなー。
服作成中・・・休日まるまる二日これだけでつぶれちまった。
プログラム全く進んでないわぁ。

なんだかのっぺりしてるし。
テクスチャ張ってないからなのかねぇ。
この後ウェイト付けもしなきゃならん。
服作成中・・・

ようやくここまで・・・
銀様の服って一部左右対称じゃないのかよ。
もっとシンプルなキャラにしときゃよかった。
靴どうすっかな。足のポリゴン消さないといかんな。
走りモーション修正

腕の振りってこんな感じでいいんだっけ?
指にもボーンいれなきゃだめだなー
古いビデオカードだとシェーダーのレジスタ足りなくなりそうだ。
XSIファンクションカーブ解析・・・
モーションデータとはキーフレームの羅列で構成されているのが一般的なわけですが、
XSIが出力するデータは、なんとも御丁寧に、キーフレーム間に2個の制御点を付けてくれるのです!
(しかもその制御点はユーザーが好きなように編集できる!スバラシイ!高い金払っただけのことはある!)

赤い点がキーフレーム
黒い点が制御点
黒い点を結ぶ点線はそのキーフレームの時の接線
これはまさに、隣り合う2つのキーフレームとその間の2つの制御点の計4点を
スプライン補完しろと言わんばかりですね。
今まではこの制御点を無視して、キーフレームのみに着目し、その間をリニアで補完していたのだけど、
リニア補間だとどうしても動きがカクカクになってしまうので、スプライン補間は必須でしょ
っつーことで、キーフレームのスプライン補間実装。
3次ベジェ曲線アルゴリズムを採用。
Q(t)=(1-t)3P1+3(1-t)2tP2+3(1-t)t2P3+t3P4
(0≦t≦1)
4点P1〜P4の間をtを使って求めるというもの。
tとは0から1の間を動く値のこと。
最初のt=0の時はQ=P1で、tをじょじょに増やしていくとQはP2に接近し、次にP3に接近し、
最後のt=1になるとQ=P4になる、というイメージを持つと分かりやすいですか。分かりにくいですね。そうですね。
ググれば図解が腐るほどヒットするんでそっち見ろって感じですね。
さて、モーションの要である回転成分を例に簡単に実装方法の説明。
時間(x1, x2, x3, x4)が線形に動くときのtを使って
回転値(y1, y2, y3, y4)の間を求める。
さぁ困った。線形に増えるtを使ってx1〜x4の間を求めると結果が線形になるとは限らない。・・・当然だ。
x1〜x2の距離とx2〜x3の距離が違えば、tが変動したときのxの変動も変わってしまう。
時間は一定速度で流れるので、線形に増えるxの時のtを求めたいのに・・・。
・・・てことは、xに関するtの三次関数の解を求めるってこと?
解3つもでてくるし、無理じゃね?
そもそも二次関数の解き方すらもう覚えてないよ?
そうだここはCPUパワーに任せてゴリ押ししよう。
tを少しずつ変えながら何度もベジェ関数にトライだ!
結果のxが求めたい時間近付くように、二分割法でtを細かくしていこう。
8回ほどまわせばtの精度は 1/256 = 0.00390625 か。十分じゃん!
これで時間xになるようなt(に近似できたt)がゲットできたので、
こいつを使って回転値y1〜y4の間を計算しよう。
ちなみにこれもボーンごとにしかもその成分ごとに独立して計算する
とってもめんどくさい処理なのです。
アニメーションミキサー実装。
モーションとブレンド率を格納できるトラックが複数個存在し、
それがリングバッファ構造となっている。
全トラックのブレンド率は時間の経過とともに減少していき、
モーションの取得要求が来たときに、全トラックのモーションを
各ブレンド率で混ぜ合わせたモーションを返すという仕組み。
現在はトラック数4つで様子見してます。
例えばプレイヤーが待機状態から歩きになった等で、モーションチェンジが発生した場合、
その歩きモーションを、アニメーションミキサーにブレンド時間指定つきで登録。
トラックが4つのリングバッファなので、5つ目のモーションが来た場合は一番古いモーションが消えます。
そんな頻繁にモーション変えなければ多分大丈夫。
5つ目のモーションを登録する頃には、最初に登録していたモーションは、既に
ブレンド率0%になってる事が多いだろうと予想できます。
これ以上トラック数増やしても、処理負荷が増える割には、
”プレンド率が0%に近くなっている古いモーションが消される可能性が低くなる”
というだけなので、あまり効果は期待できません。
ちなみにモーションをブレンドするとか書いたけど、
これは実際には各ボーンの
スケールのX成分
スケールのY成分
スケールのZ成分
回転のX成分
回転のY成分
回転のZ成分
平行移動のX成分
平行移動のY成分
平行移動のZ成分
のそれぞれ独立してのブレンド処理。
もー、とにかくめんどくさい。
最終的には行列に合成しちゃうから、プレイヤー等の使う側からすれば、
特に気にしなくていい事なんだけどね。
ハードウエアスキニングやっと一段落した。
2週間くらいかかったかなぁ。
シェーダー部分はわりとサックリできたんだけど
xsiファイル解析してアニメーションデータ生成がうまくいかずに悩んでた。
XSIが右手座標系、DirectXが左手座標系なもんだから、とにかくややこしいのだわ。
それでもSkinnedMeshサンプル解読するよりは楽だったのかもしれない。
適当に歩きモーション作って再生してみた。

キーフレーム間はリニアで繋いでるので動きがXSIと微妙に違う。
後でスプラインも対応しなきゃなぁ。
待機モーションから歩きモーションへ滑らかに移行するように
アニメーションブレンド機能を先に作ろう。
体のウェイト調整ほぼ終了。
肘や膝のような2Dチェインは割とさっくり終わった。
しっかし肩や股関節の3Dチェインの調整が非常に難しい。
ある方向に曲げて違和感なく調整できたとしても
別の方向に曲げてみると全然ダメだったり。
どんだけ調整しても100%納得のいく変形は期待できそうもないので
適当なところで妥協することにする。

激しい動きをさせなければ、まぁまぁ耐えれる。
服着せてしまえば見えないだろうし、こんなもんでいいや。

/⌒ヽ
⊂二二二( ^ω^)二⊃
| / ブーン
( ヽノ
ノ>ノ
三 レレ
エンベロープ設定。
これはすんなり出来た。
で、いざ変形してみようとすると

これはひどい。
XSIデフォルトの自動ウェイトアサインの結果がこれか。
単純にボーンからの距離で判定してるから、ゴムホース曲げたようになるなぁ。
股関節の部分なんてぐちゃぐちゃだし・・・
ウェイト手修正は必須くさい。
で、しばらく頂点いじったり骨いじったり

ウェイト調整だいぶコツが分かってきた。
変形で伸びる側は上腕ボーンから下腕ボーンへ滑らかなグラデーション、
変形で縮む側はハッキリと分かれるように、ウェイトを調整していく。
骨の位置は中心より変形で伸びる側に置いたほうが綺麗に変形してくれるようだ。
回転の中心に近い頂点は大きく変形しないからだろう。
自分のひじを曲げて見て、あぁ確かにそうなってるなぁと確認^^
頂点ふたつみっつ選んで微調整→曲げてみて変形の確認 この繰り返し。
これだけで相当時間食ってる。適当なとこで止めとこう。
この後モデリングの修正入ったら今付けてるウェイト無駄になりかねないしね。
ボーン入りました。

SIにプリセットされてある基本スケルトンを持ってきてサイズ合わせて角度合わせて
ってとこまで。まだ変形はできない。
エンベロープ設定してウェイト調整はこれから。
親マトリクスを継承するようにした。
DirectInput周りを作成。カメラ操作できるようにした。
同一モデルデータを使いまわして複数表示とか。

マップも一緒に表示。
目のテクスチャいじったら怖くなったorz
データでかいのでマップ削ってアップしました。
最近あまり乳酸菌取ってません。

服はボーン仕込んでからにしようかなぁ
どうもピクセルシェーダー2.0に対応してないって人が多いようなので1.1にも対応。
これでだめならあきらめるしかねー。
モデルの階層構造にも対応。
ソース付きでアップしなおしました。
SOFTIMAGE|XSI 5.0 Foundation
と
Visual Studio 2005
を購入。
ソフトレンダリングの頃のソースは全部破棄。
もう見たくない。
DirectX9実践本
とSDKサンプル見ながらD3D描画システムを組んでます。
ノウハウがないので結構シンドイ。
表示が狂ったときに何が原因なのか分かるまで時間がかかったりとか。
今年に入ってから主に休日を利用して進め、ようやく見れるようなとこまで来た。
dotXSI3.0フォーマットで出力したファイルを読み込んで
シェーダー経由で描画ってとこまで。
それにしても7000ポリ出して300fps↑ってすごいな。
もうソフトレンダには戻れないわ。
[Back]