Top
Index


3Dプログラム 開発日誌 Log01


これは3Dで適当なプログラを組もうとRJが奮闘する様を記録したものです。この分野にぜんぜん詳しくない作者RJがなぜこんなもの書いているかというと、ウェブに広がるこの手の記事にはかなりお世話になったので、その恩返しの意味もあります。
あと、書いておかないと自分で忘れちゃうし。

・このページは画像をONにしておいて欲しいです。
・不定期更新です。
・上から下に読んでいってください(冒険日誌とは逆だ‥‥)。

はじめに動機ありき


ナムコの「ドラゴンヴァラー」というゲームがえらく気に入る。うーんやっぱり時代はポリゴンかな。ちょっと自分でも作ってみようという気になる。

コンセプトはプレイステーション風なもの。つまりやたら細かいものではなくて、ちょっと学芸会のダンボールで作った扮装みたいなものをイメージしています。レトロさを感じさせるのが好きなもので。それに166MhZのノートで動かすにはデータも少ない方がいいし。

まずELで


DirectX 3Dに深入りする気はぜんぜんなかったので、名高いELライブラリを入手して、 「勇者王ガオガイガー」のロケットパンチ「ブロウクンマグナム」をさせてみようというコンセプトで適当に作ってみました。ELでアニメーションさせてみたいときにはパーツがばらばらなほうがよいので、手足胴体顔とかを作ってみました。
モデリングソフトはLightWave3D。でもなんというか、気に入ったデザインにしようとするとすごい時間かかるんですよね。ぼくだと。

ELからDirect3DXへ


最初はELライブラリを使用していたのですが、どうも現在のパーツの座標とかを得るのに苦労したりして(いやぼくが悪いんですよ)、それなら、Direct3D RMモードで組もうといろいろ調べてみました。しかし、ヘルプを見るとなんとRMモードこれ以降はバージョンアップしないと書かれているではないですか。うーん、Microsoft社はみんなに複雑怪奇なIMで組めというのかな?

でも、なんとDirect3DのサンプルはIMでなくてIMのラッパーコンポーネントであるDirect3DXユーティリティライブラリを使用している! よしこれにしよう。つまらない初期設定とかもすっとばせるみたいだし。だって、初期設定ってソースリストで4ページくらいの記述が必要なんだもの。

六角大王登場


フリーのモデリングソフトは数あれど、非Windowsライクな操作性とかかる手間にちょっと躊躇していたけど、なんと正解はすぐそこにあった。「六角大王」(フリー版)だ。
ふつうのモデリングソフトは四角とか円とかをけずっていくんだけど、 このソフトは点を打ってそれをつないでいくのだ。きわめて直感的。その代償として左右対称のモデルしかつくれないけど、まあそれは面を貼らないなりしてカバーできる。
コツがあって、真横と正面の絵を描いて、それをつなげていくとよい感じのようだ。 なにより、これで作ると頂点の数が少なくできるので、コンセプトにぴったり。

テクスチャが貼れない


で、SetTexture()でテクスチャを貼ってみたんだけど、貼れていない。‥‥なぜだ?なんと、Xファイルのuv座標がみんな0になっている。そうか、この座標を指定しておかないといけないのか‥‥。


六角大王(フリー)にはテクスチャの概念がないので、Xファイルにコンバートしてからテクスチャを貼らないといけません。ところがXファイルにテクスチャを貼るためのフリーのツールはほとんど見当たらないんですな。ひとつ見つけたんだけど、もちょっと使い易いといいかな〜と。

じゃあ、自分で座標設定してみよう。
まず、円筒マッピングを考える。 テクスチャのビットマップは縦横の長さが0.0〜1.0に正規化されているから、これを0〜2πに対応させればいいんだよね。モデルの各頂点の座標(x,y,z)から(x,z)を取り出して、これをアークタンジェントの関数atan2(y,z)に入れれば、-π〜πの値を返すので、+πしたあと2πで割ればu座標が求まってできるはずだ‥‥。
ところがなぜか最後にごみみたいなのが出ている。なんだか反転した絵が張り付いているではないか‥‥。



貼っているテクスチャ

最後にごみがある

原因発覚!


むちゃくちゃ悩みました。おかしいな〜。 u座標はちゃんと0.0〜0.9くらいになっているのに〜と悩んで数日。もしかして、0.0〜0.9と増えてきて、その次の値でもとの値0.0に戻るからなのかな?まさか〜。それならみんな円筒マッピングどうやっているのさ〜
他のツールで円筒マッピングしたデータのuv座標を調べてみると、なんか0.0→0.5→0.0→-0.5→0.0と貼り付けている。それじゃあ、一枚の絵をシールみたいに貼れないではないか、どうりでこのツールでうまく貼れていないわけだ。

Webの海に潜ってはや数日。やっと見つけました。LightWaveからXファイルに変換するコンバータを作っている方のページで、「Xファイルでは頂点にはひとつのテクスチャ座標しか持てないので、このツールは円筒マッピングとかは1周する地点のために座標を追加します」と書いてあるではないですか。げげっ予想通りだ〜!
やってくれるなXファイル。道理でゲーム作りに使う人が少ないわけだ。

そう言われてみると、DirectXのサンプルにあるCreateSphere関数は球データを作るのと同時にさりげなく点を追加していたなあ。

モデリングしなくちゃ


テクスチャのことは後で考えるとして、まずモデリングしてみることにした。
う〜ん、六角大王は使いやすいけど、それでも一体のキャラクタを作るのはめんどい。顔がうまく作れないと嫌になるんだよなあ。よく市販のゲームはさくさくモデリングキャラクタが出てくるよな〜。しかもみんな六角大王以外で作っているんだよね。

とりあえず一体完成


芸術家のように途中まで作っては壊して、作っては放り投げていたけど、拉致があかないので、とりあえず、一体完成させてみようと決心して作ってみました。


うーん、横顔はまあまあだけど、正面がちょっとなあ。まあ、はじめて「完成」させた人体モデルってことで、こんなところにしておくか。でも、はじめの人形にくらべると格段に作者の意志は反映されています。

ロックマンDASH2


ゲームは持っていないんだけど、ロックマンDASH2の攻略本を購入。このゲームはイメージイラストとギャップのないポリゴンを実現しているという点でとっともすごいゲームだと密かに思っているので、参考書として買ったのだ。

これからどうなる


今度リリースされるDirectX8は、いままで分かれていたグラフィック関係のライブラリがそっくり統合されてしまうらしい。じゃあ今やっているのは無駄になるのかなと、さっそくベータ版のサンプルソースをチェック。‥‥D3DXユーティリティを使う立場から見るとあんまり変わってないね。同じ泳ぐイルカのサンプルもあるし。

六角大王Super2


フリーで統一したいと言った舌の根も乾かぬうちに、「六角大王Super2」を七千円で購入。ぼくの興味あるところだけ言うとレイヤー機能、テクスチャマッピング(円筒・平面のみ)、Xファイル出力、テクスチャ用展開図出力、片面ポリゴンの機能が加わっている。ま、これで充分でしょう。

みんなは何を‥‥


3Dソフトにプロは何を使っているかという記事をちょくちょくみかけるので、独断と偏見でちょっとまとめてみると、こんな感じ。

ゲーム名 使用ソフト
ザ・バウンサー ムービーにSoftImage3D
決戦 戦闘シーンにSotImage3D
バイオハザードcode:Veronica リアルタイムムービーにSoftImage3Dほか
鉄拳3 ムービーSoftImage3D/Alias PowerAnimator
R4-RIDGE-RACER TYPE4 ムービーにLightWave 3Dほか
風のクロノア ムービーにLightWave 3D
ドラゴンクエストVII マップと戦闘シーンにN-World/PowerAnimatorほか
アーマード・コア2 モデリングとムービーにLightWave 3D /3D Studio Max
NITENDO64ソフト N-Worldがわりと基本らしい

情報源は日経CGとGW誌です。しかしムービーには何を使っているかという情報ばっかりだなあ。ゲーム本編の情報の方が参考になるんだけど。LightWave 3DとSoftImage 3Dが多いなあ。意外とShadeという声を聞かないですね。

六角Super2のXファイル出力問題


モデルにテクスチャを貼って、Xファイルで出力すると、テクスチャが上下反対になるという問題発見。早速サポートにメールを出すと、データをくれというので、データと証拠ビットマップまで送った。返事はMicrosoftに問い合わせて必要ならアップデートするとのことだった。すばやい対応とレスに感心。ところで、ぼくが言うまでもなく誰か気がつきそうなもんだけど。みんなXファイルで出力しないのかな。

アクションする


かゆいところに手のとどかないD3DFileを書き直して、腕をうごかせるようにした。 とはいってもインバースキネマティックとかそんなんではなく、腕を動かしたデータ1,2,3,4‥‥を用意して、座標を更新して動かしているだけ。DirectX7のサンプルのように各パターンの間を補完してなめらかアニメーションさせたいね。あと、複数フレームのXファイルに対応させないと‥‥。

インバースキネマティック‥‥階層構造と違って任意な関節を起動点にできる制御手法。人は歩くときに支点が変わるのでそーゆーのを表現できるらしい。


写真ではわからないけど動いています!

複数フレーム


Xファイル。とっても困った名前だ。DirectXファイルとかXフォーマットとかみんないろいろな名称で呼んでいるし。 「Xファイル」とかで検索しようものなら「やつら」と戦うモルダーとスカリーのページが大量にヒットしてしまうし。

それはともかく。フリー六角から変換したXファイルはひとつのフレームしかなかったけど、 六角Super2は複数のフレームで出力できる。データが増えるのだけど、ひとつのファイルで頭、腕とかわけて扱えるので、これはこれで便利だ。 ところがフレームの名前がわからないと、座標データとかが得られないという問題がある。今のところ六角Super2出力では フレームの名前はつけられないようで、フレーム名""になる。だからオリジナルD3DFileに処理を追加して、名前のないフレームだった場合は番号をふるようにした。 これで、腕なら腕、頭なら頭だけ動かせるようになった。腕だけのXファイルとか用意してデータを節約できそうだ。


六角Super2のXファイル出力問題 解決


DirectX7のヘルプを読んだら、「このサンプルでXファイルを読み込むとテクスチャが上下逆に表示されることがある。Direct3D の以前のバージョンでは、ビットマップを上下逆さにロードしていたため、いくつかのXファイルでは、ツールの作者が座標を逆にして対処していた。」という記述があった。
原因はこれだな。古いDirect3Dビューアに合わせれば、新しいDirect3Dビューアでは逆さになり、その逆もあると‥‥。六角は悪くないよーな気がする。


点と点とを補間


腕を動かす座標は6パターン用意してみた。腕の座標データを単に切り替えるだけだと、 カクカクして見える。実際にはあんまり気にならなかったけど、ここはやっぱり、 各パターンの点と点を補間するべきでしょう。‥‥で、やってみると。おおっ、 なめらかに動く。しかし、なんだかモーフィングみたいであまり手を動かしている よーには見えないなあ。まあ、これはデータの作り方が悪いってことで。
さらに腕だけのデータを用意してみた。でも、歩きモーションみたいに、体全体を動かすときはどうしようかな。



振り上げた拳は巨大化!

動きをつけたい


これで変形はできたけど、動かす部位の座標データを全部用意するのは、容量がかさばる。 歩くモーションなんかはやっぱり、身体全体が動くわけだし、足や腰のパーツの 回転と移動だけで表したい。
これにはやっぱりモーションエディターとかモーションウェアとか呼ばれるツールが必要で、 それに適したフリーなツールとして次のようなものを見つけた。

名前 対象 特徴
Humanmdl フリー六角 動きデータファイルが複数の動きを持てる/別ファイル/コンパクトである。
MotionWorks Xファイル 直感的操作性

Humanmdlは愛好者も多くて、生成するデータはいいことずくめだ。 でも、ぼくが使う上で問題になるのは、動きデータファイルを自分のプログラムで使うには手間がかかりそう(ちょっとレベルが高いのだ)と いうのと、ツールがちょっと馴染みにくいという点だ。
MotionWorksは、使いやすいんだけど、六角出力のXファイルを使うには、すこし加工しなければならない。 あとXファイル自体の問題が‥‥Xファイルに包括するアニメーションデータは1つなのか?

というわけで迷っているんだけど、とにかくXファイルについてまとめてみた。ここ

HuManMDL → ここ
MotionWorks → ここ

復活


かなりのブランクがあったけど、またもや戻ってきました。「スマッシュブラザーズ」のおかげです。 フィギュアのひとつひとつがよくできているよな〜。
さて、前回のちょっと後に上の「六角大王super」「MotionWorks」間のすきまを埋めることができる、 すばらしい構造設定エディタ「親がめ子がめっくす」 というものを見つけていたんだけど、なんとサイトがなくなっている模様。もったいないなあ。

ブランクをうめるべくサーチしまくると、 Humanmdlはソース公開の恩恵か、PollenHMDLなんていう改造版モーションエディタが 公開されていたりする(他にもある)。これが使いやすいなら、Humanmdlでもいいかなあ。
でもまずは、もうすこしまともなモデリングができるようにしなくては。

  HumanMdlで行こう!


HumanMdlを使ってみた。おお、別に元祖版でもちょっと慣れれば簡単じゃない。 六角大王で作成したデータをダイレクトにそのまま使えるのもいいね。誰だよ、 使いにくいとか言ったのは(←おまえだ)。

作成したデータを自分プログラムで使うのに手間がかかるかな〜という点を 懸念していたケド、ライブラリをそのまま使わせてもらうことにした。 まあDirect3DRMもそうだし、ここは割り切っちゃおう。完成することこそ大事だ。

ライブラリの使い方は簡単な説明文だけだけど、ソースリストがすべて公開されている(すばらしい!) のでちらっと見れば、ポリゴン人形を表示するのはむちゃくちゃ簡単だ。 ていていてい。ほら、できた。


キャラが変わらないのは御愛嬌

  クウォータニオンって何?


HumanMdlのライブラリでは回転をクウォータニオン*で指定する。いまや当然と言えば当然なんだけど、 慎重にこれを避けてきたぼくとしてはどうやって指定したらよいのかわからない〜。 調べると・・・なるほど使い方はちょっとわかった。とりあえず中身は理解しないまま道具として使ってみよう。 (マルカム博士*に怒られるな・・・きっと)
まあとにかく、こんな感じで、ブランク以前のDirect3DRM版には追いついたと思う。

動け〜


HumanMdlモーションエディタはすごい。 2パターンしか設定していないのに、結構歩いているように見える。 HumanMdlライブラリでは、 どうもThinkPAD系のマシンではテクスチャが上手く貼れないようだ。 まああんまり使う気がないからいいけど。

地形も必要だ


現在のところ、地形を表示してジャンプその他のアクションができるようになっている。 カメラが主人公の方を向く関数が欲しい今日このごろ。 目下の目標は地形との当たり判定か。起伏のある地面だけなら、 縦横の二次元配列にその場所の高さをいれたものを用意すれば問題ないはずだ。 これは地形のポリゴンファイルから自動で生成させたいところ。

もっとQuakeみたいな本格的3DゲームではBSP方式で格納したデータで表示するものを決定すると 共に判定などに使えるらしいけど…。


真ん中に埋まっているのはカブです