カテゴリー

アクセスカウンター


since 1996/06/14

Count per Day

  • 3今日の訪問者数:
  • 79昨日の訪問者数:
  • 1582月別訪問者数:
  • 0現在オンライン中の人数:

鎧を着たり、武器を装備したり

またかなり時間が開いてしまいましたが、今回はキャラクターモデル系のプログラムを書いていました。あと、そのネタ用のモデルデータを作るのも一週間くらいかかっちゃったかな。
まずは、人が走っているところ。

剣を装備したり。

 

盾を装備したり。

〜こっから技術的な話

モデルデータを表示するだけならかなり簡単です。モデルデータを市販のツールで書いてロードするだけでほとんど終わりですから。
アニメーションはちょっと面倒です。市販のツールでアニメーションデータを作るまでは問題無いですが、そのモーションデータをロードして骨格をシミュレーションしたりとか・・・まぁ、ほとんどどこぞのソースコードをコピペですが、、、。

で、今回の難関。そういったモデルデータを一部分だけ変更するというもの。たとえば剣を持たせたり。
やり方はいろいろありますが、何より市販のツールから読み込んで勝手にうまくやってくれる処理の中身を分解して自前で書いたりとか、だんだん三次元情報を数値と計算でコネコネしてやらないとダメになります。
申し訳ないが、そんなコード作る気合いも根性も無いですえぇ。で、かなり手抜きですが、今回の方法は以下の通り。

まず、素体君を作ります。素体君データはポリゴンモデルは適当です。むしろポリゴンもテクスチャもマテリアルもいりません。必要なのはボーン(骨格)とアニメーションデータです。
で、素体君をプログラム上で走らせたり歩かせたりします。これは、普通のアニメーションのコードでかけます。
ここからがキモですが、アニメーションってのは、たとえば肘が何度曲がったとか、腰がどのくらい折れたかとか、「時間と角度」だけのデータです。
なので、素体君が一コマ動いたら、その関節の角度をすべて記録します。
だいたいこんな感じ。

//初期化処理(関節の個数分、マトリックスの変数を準備)
D3DXMATRIXA16 savemat = new D3DXMATRIXA16関節の数;
〜ざっくり略〜
//アニメーション処理
D3DXMATRIXA16 mat;
〜ざっくり略〜
D3DXMatrixMultiply( &mat, ほげふが );//←関節の回転角度を計算
m_pD3DDev->SetTransform( ほげふが, &mat );←回転させる
savematx = mat; //←回転角度を関節の個数分の配列に保存

素体君の役割はここまで。
次に実際に描画したいモデルを準備。このモデルは関節毎にバラバラです。ただ、素体君がアニメーションしてない時と、関節の角度や腕などのパーツの位置は、寸分違わず作ります。で、バラバラに保存します(あとでばらせるなら、一緒に保存してもいい)。
で、バラバラのパーツを一つずつ読み込んで、素体君がアニメーションした時の関節角度と同じだけ、パーツを回転させます。
これであとは、必要なパーツだけ読み込めばオッケーです。剣を装備したいなら剣のオブジェクトを読み込んで、「手」と同じ角度分回転させればあたかも剣を装備したように見えます。
まぁ、これだと問題なのはマントやスカートみたいに、オブジェクトを歪ませるのは出来ません。それをやるには「オブジェクト毎の回転」ではなく、「ポリゴンの頂点毎に移動/回転」をさせなければなりません。
とりあえず、今回は技術的なことはなるべく二の次にして、やりたいことをやるのが最優先なので、そういうオブジェクトの変形はパスです。

それに、いずれもっといろんな服とか装備とか作らないとならないっすからね。
で、この人はまだ一カ所を走っているフリなので、今度は特定の箇所をクリックしたらそこに向かって走っていく…なんていう面倒な処理を考えナイト。

 

Leave a Reply

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>