3Dゲームの製作を始めたので、過程を動画付きで公開していこうと思います。
3Dに関する知識がほぼゼロの状態からはじめるので、同じようなゲームを作ろうという人にはかなり参考になるのではないか。
つまづくところはだいたいみんな同じだろうしな……。
同様の企画はしばしば見かけるものの、きっちり完成までいくのは少なめだと思うので、ここはひとつ作品完成率90%越えの僕ががんばってみようというわけですよ。
僕は過程を見せるのは好きじゃなくてできるなら何も情報のないところからいきなり完成品を出したいんですが、今回は最初から最後まで丸裸の大公開時代という感じでいこうと思います。
ストーリーとかシステムの試行錯誤も公開してしまうぞ。
主な開発環境は、c++、DXライブラリ、Blenderです。
.
●Blender
Blenderは相当癖が強くてしばしば泣きそうになるものの、素人が3Dゲームを作るなら現時点で最良の選択肢ではないかと思います。
メタセコイアも使用感は素晴らしく最初はこれでモデリングしたのですが、4.0切り替え期のゴタゴタで嫌になり、モデリング専門のソフトにお金を払うくらいならとBlenderに移行しました。
メタセコイアも最近はボーンを入れられるようになったようです。将来性はあるかもしれない……。
Blenderは奇怪なUIを我慢すればかなり高機能です。「えっ? ここまでできるの?」という感じです。3Dに関してはこれ一本で何から何までできるというのは強い。しかもそれが無料というのがすごい。
そして実はモデリング自体はかなりやりやすいです。難解難解と言われているせいで誤解してる人も多いかもしれない。
モデリングやモーション付け等の、直接的な編集作業に関しては優秀です。
3D未経験でもモデル作成やモーション付けならすぐにできるようになると思います。
UV展開やウェイト付けといっためんどうな作業も、自動生成するだけでかなりしっかりやってくれます。
問題なのは、内部的な構造や概念といったものが従来の創作系ソフトとはかけ離れていて、「これができるはずだけどやりかたがわからない。何を探せばいいのかもわからない」となっていることです。デファクトスタンダードなんてクソでも食らえという勢いですよ……。
キーボードのいたるところに意表をつく効果のショートカットキーが潜んでいるので、ちょっと押し間違えようものならわけのわからないことになって戻せなくなることもしばしば。
Painterも相当変なソフトだと思ってましたが、今思えば可愛いものです。
マテリアル、テクスチャ、UV関連がほんとに複雑怪奇で、画面ではちゃんと出てるのにエクスポートしてゲームに組み込むと無茶苦茶になるということが頻出します。
このあたりはデータリンク構造とかにも関わっていて、「熟練すれば合理的」っぽい雰囲気が漂っているものの初心者には地獄としか言いようがない。
ウィンドウに関してもかなり個性的な仕様で、最初のうちは「画面が変になって戻せない!」というのが多くて泣きそうになりましたよ……。
モデルの編集はアンドゥが利くので多少奇怪なUIでもいいでしょう。しかし画面中を埋め尽くすさまざまなアイコンは、下手にいじると元に戻せない(戻し方がわからない)状況に陥るわけです。こうなると解説サイトも役に立たない……。
しかし、苦戦しつつもなんとかモデル作成とアニメーションまではできるようになりました。
初代PSの高解像度版みたいなゲームならできそうだと思い、Blenderでやっていこうと決意したのでした。
製作過程はentyのほうにもアップしています。
https://enty.jp/akiragoya
ブログでは悩んだところなどをもう少し詳しく書いていこうと思います。
.
●2016/05/01
というわけでまずはモデルとアニメーション。
モデル製作時代は前から少しずつやっていて、このノークンディは二体目です。
最初はメタセコイアで作り、後でBlenderで作り直しました。
しかしまだ細かい部分は作っておらず試作状態です。
ゲームの基本ができるまではこのまま進め、ステージ製作を開始できるようになったらモデルから作り直す予定。
最初からしっかり作りこんで「このやり方はまずかった!」となって作り直しになるのは避けたいわけです。
僕は何をするにしてもトップダウン型で考えるタイプなんですよ。
ノークンディは身体能力は高めだけど不器用という設定なので、あまりかっこいいモーションにならないようにしています。
田舎のわんぱく少年といった感じを狙ってます。
僕が3Dを敬遠していた理由に「素人ではいいモーションを作れないだろう」というのがあったのですが、思ったよりも簡単かつそれっぽいのができて驚きました。
モーションキャプチャーしなきゃだめだと思ってたよ……。こんなことならもっと早くからはじめるべきだった。
ポイントとなるポーズをいくつか作り、タイムラインに登録するだけで中間部を勝手に補間してくれます。
単純な攻撃などは、振りかぶったポーズと打ち切ったポーズの二つだけでもけっこういけます。
このあたりはドット絵アニメーションと似ている。
しかしドット絵よりもはるかに簡単です。まだ3Dゲーム一本も作ってないのに今後はすべて3Dにしたくなってきました。
IKを設定できるらしいですが、とりあえずIKなしでやってます。
.
DXライブラリで使用するためのエクスポートでかなり悩みました。
xファイルで出力すると、なぜかテクスチャが内側に貼られてしまいます。法線を逆向きにしても同じでした。
エクスポート設定をいろいろいじったけど全部だめ。
検索してみたところ同様のトラブルの人がいたものの、その人の対策も口かありませんでした。blenderのバージョンによるバグなのか。(この時点では2.6を使用)
はやくも挫折しかけましたよ……。
が、fbxで出力しDXライブラリのモデルビューワで独自形式mv1に変換したらうまくいきました。
独自形式は避けたかったものの、まぁ仕方ない。独自形式は読み込みも早いそうなので、これがいいのだろう。
fbx出力だとマテリアルの設定がうまく反映されないので、モデルビューワ上で変更してmv1で保存しています。
DXライブラリのサンプルプログラムを丸写ししたあと、ボタンでアニメーションを切り替えられるようにしました。
モデルの表示とアニメーション自体はものすごく簡単です。
「int MV1SetAttachAnimTime( int MHandle, int AttachIndex, float Time )」のfloat Timeの値を増やすことでアニメーションが進んでいきます。float型で指定できるので再生速度も自由自在だぞ……。
モデル表示とアニメーションがここまで簡単というのはすごい。動くものがすぐ見られるというのはモチベーションが上がる。
座標系が2Dとは違うのだけが若干困りました。画面上がYプラスです。これは現実世界でいう「高度」と考えればいいのかもしれない。
あと、画面奥がZマイナスというのも少し気になりました。なぜなら、今まで使っていた「トグロエンジン」が画面奥はZプラスだからなのでした。
.
●2016/05/02
モーションの合成。
モーションが滑らかに繋がるようになりました。全部DXライブラリまかせです。
一つのモデルに二つのモーションを同時にセットし、その両方に対して「ブレンド率」を設定してやることでモーションを滑らかに移行できます。
blend率は0.0f~1.0fの範囲となり、クロスフェードの要領で片方を「blendRate」もう片方を「1.0f-blendRate」と指定してやります。
簡単簡単。が、そううまくはいかないのだった……。
仕組み自体は単純なものの、かなり悩みました。モーション合成をすると手足が変形してバケモノのようになってしまうのです。
変形はずっと引き継がれてしまう。
結局、「古いほうのモーションは動かさない」としたらうまく行きました。
両方のモーションを動かしていると、ボーンの位置が合成される感じで巨大化していくっぽいです。
アニメーション合成のときは片方の動きを止める、これですよ。
blend率の変化が早すぎるとこれまたモデルが変形します。しかしスローで見なければわからないのであまり問題ないでしょう。
.
●2016/05/04
トグロエンジンに組み込む。
機械種子以降で使っている「トグロエンジン」に組み込みました。キャラオブジェクトのクラスに3D用のものを追加し、ついでに内部的な処理もいろいろと変えました。
トグロエンジンのおかげでいきなり大量のキャラが蠢いています。
今まであまり使ってなかったテンプレート機能も積極的に使って色々と整理できました。新しいことへの挑戦というのは、敬遠していたものに取り組むいい機会でもある……。
僕はプログラム関係の仕事をしたことないしまともに学んだこともないので、実はプログラム技術は相当低いんですよ。
こんな僕でもゲームを完成させられるのだから、みんなもがんばろう。僕よりいいものが作れるはず……。
カメラは注視点とカメラ位置を設定するだけです。めんどくさい計算はいらない。これはすごい。
注視点までの距離を変数で持ち増やしたり減らしたりすれば、それだけで寄ったり引いたりできます。
3Dでは移動量や座標などをベクトルで扱います。移動方向を角度ではなくxyzの座標で指定するわけですよ。
この考え方に慣れるのがなかなかむずかしいかった。
2Dでは、現在座標、目標角度、移動量でキャラを動かしていました。
いっぽう、DXライブラリにベクトルの計算用の関数がいろいろと用意されているので、概念さえおぼえれば計算の手間は減りそうです。
.
●2016/05/05
地形を出し、その上を歩かせる。
アクションゲーム最難関のひとつと言える地形接触判定です。
かなり悩みました。が、2Dで自力でやることを考えるととんでもなく楽だといえる。一日でできてしまうんだからな……。
夜光蛾7の地形判定はきっちりできるまで一週間近くかかったような。
DXライブラリ様のおかげで線分とポリゴンの検出が簡単にできます。接点の座標まで取得してくれるぞ……。
しかも、線だけでなく球やカプセルとの判定までほぼ自動でやってくれる。
なんだよ2Dより3Dのほうが簡単じゃん……。
技術の進歩のおかげでむずかしい部分はだいたい誰かがやってくれるようになりました。いい時代だ……。
地形のテクスチャをループさせる方法がわからず、1024*1024の芝生画像がそのまま貼られています。
地形テクスチャを縮小&ループさせるのは地形判定よりも難しいぞ……。
.
●2016/05/07
壁ずり移動。
難関の壁ずり移動です。前回の地形接触と同じじゃん!という感じですが、これがなかなかめんどうなんですよ。
胴体部分に直径50cmくらいの判定球を設定しています。
かなり苦戦したもののこれといって書くことがない。
ずりずりしてるとめりこみの押し返しでプルプルするのに悩んだかな……。
芝生のテクスチャ問題はまだ解決できない。
blender上ではできてもエクスポートするとうまくいかないのでした。
こっそりとダッシュできるようになっています。歩きモーションのままダッシュ。
.
●2016/05/09
TPSカメラ、TPS移動、ジャンプを導入。
歩きモーションのままダッシュジャンプ。
TPSカメラは簡単そうに見えてめんどくさいんだろうなーと思ってたら実際そうでした。この後照準のずれ問題が待っているかと思うと気が重くなる……。
今まではサインコサインを使って回転させてましたが、3Dをやるからにはベクトルで片付けねばと思いなおし行列使ったりしてます。
これがよくわからなくて困った。便利なんだとは思うけど、今までやってたことと概念が違いすぎてつらい。まぁ慣れればこのほうが圧倒的に簡単になるのだろう。
芝生テクスチャはまだ解決できない。
.
●2016/05/10
モーション追加。
壁突き抜け問題。
ジャンプとダッシュのモーションを作成しました。
今後の開発効率のことを考え、モデルの縮尺をメートル単位にしました。これで距離やスピードの感覚がわかりやすくなるぞ……。
ダッシュの移動速度を増やしたりしてテストしていたら、壁突き抜け問題が起きてしまいました。
完璧に作ったつもりなのに、すごい勢いで貫通してしまう。
いろいろ調べたところ、足元チェックが絡んだりして根の深い問題なのだった。垂直に近い壁に高速で突っ込み、モデル中心と足元が同時にめり込むと突き抜けるらしい。
いろいろと対策を練ったもののうまくいかず、こうなったら力技でいこうと速度に応じた複数回判定でごまかしたのだった。
しかし高速で動いてめり込む物体というのはそれほど多くないので、負荷もあまり高くないのではあるまいか。
.
●2016/05/13
上半身と下半身に別のモーションを割り当てる。
弾を撃たせる。
ビルボード型エフェクト。
弾撃ちモーションがいまいちだけど、モーションもモデルも後で全部直すからいいんだよ……。
部分的モーション合成はけっこう悩みました。DXライブラリでは隠し関数になっています。
ボーン指定のモーションブレンドという形で、フラグ設定により子以下のボーンにも適用できます。
最初のモーション合成のときと同じくモデルの変形が起きてしまい悩みました。
これも結局、関係ない部分が動いているのが原因なのだった。
上半身だけ合成する場合、指定ボーン以外(下半身ボーン)を動かしてしまうとその動きがボーン座標に加算されモデルが変形するようです。
つまり、モーションを作るときに下半身は直立のままで上半身だけモーションをつければいいわけです。
.
弾撃ちはこれと言って問題はありませんでした。このあたりは2Dゲームと全く同じかな。
.
そしてビルボード型エフェクトの追加により、噂に名高い半透明問題が現れたのだった。
爆風の透明部分が後ろのものを消してしまっています。
Zバッファとかアルファテストとか、耳にしたことはあるけどあまり考えたくない問題が間近に迫っている……。
.
●2016/05/14
Zソート、地形への複数テクスチャの適用。
Zソートですよ。
カメラ視点から見てZの大きさ順にソートしたリストを作り、その順番で表示です。なんだこれトグロエンジン以前のanaruエンジンでもやってたことじゃん。余裕だろ。
と思ったのは甘かった……。
「Zバッファを使用するがZバッファには書き込まない」という禅問答のような指定をしなければならなかったのでした。
この半透明描画関連はよくわからないことが多すぎて思考停止状態になり、適当にいろいろ試して偶然解決した感じです。
こんなことじゃいかんとは思うものの、今の僕には3Dの仕組みをきちんと理解するのはつらい……。
.
地形の壁状の部分に別のテクスチャをつけてみました。
地形への複数テクスチャの適用はかなり悩みました。できるはずなのにやり方がわからない。
解説サイトを見てもうまくいかない。投げ出したくなりましたよ……。
これはBlenderの謎仕様にも関わっていて、モデル、マテリアル、テクスチャ、UVの複雑怪奇な関係が原因のようです。
Blender上ではきちんと表示されていてもfbxで出力するとなぜかテクスチャが入れ替わってたりします。何がなんだかまったくわからない。
半泣きになりながらいろいろ試したところ、Blenderのプロパティの「表示と編集を行うアクティブデータのタイプ(逆三角形のアイコン)」でUVを全部削除してから再設定したらうまくいきました。
あとフォグをかけたら画面が急にそれっぽくなりました。関数一行追加しただけでこれとは……。ほんと技術の進歩というのはすごい。
.
エフェクトを少し追加しました。
弾の発射エフェクトはもうちょいなんとかしたい……。
ビルボード型エフェクトは2Dと全く同じなので、次はポリゴン型エフェクトに挑戦したいと思います。
.
今のところ予定しているゲーム内容は、Doom型のTPSに若干のステルスとコンボアクション要素をつけたものです。
弾とキャラの当たり判定はポリゴンではなくカプセルとカプセルにし、エイム要素を減らし全方位STG的な感じにしたい。
敵はできれば最初に全部配置したいけど、Doomみたいなステージデザインはさすがにつらいのでスクリプト沸きも取り入れねばならないだろう……。
経路探索がめんどうなためきっちりとしたステルスにはしないものの、敵の視界と警戒度に応じた行動の変化は取り入れたいところです。同士討ちも。
コンボアクション要素は、近接攻撃に毛が生えたような軽いものになりそう。
まだキャラの行動の基礎もできていない状態なので、基本システムの出来によってゲーム内容はどんどん変わっていくと思います。
カメラから見て右の方向に自キャラを移動させるには
どのような考え方が必要ですか?
コメント by 匿名 — 2017 年 2 月 6 日 @ 01:15:06
TPS型のゲームの場合、カメラ座標と視点の座標からカメラの方向ベクトルを出し、そのxとzの値を使って2D空間(見下ろした状態)での角度を出します。
cameraAngle=VSub(cameraPos,cameraView);
cameraAngleXZ=atan2(cameraAngle.x,cameraAngle.z);
これがカメラから見た画面奥方向への角度となるので、この角度に90度足せば右方向になります。
フライトシューティングなどのようにロール軸で回転する場合は、クォータニオンを使うことになると思います。
コメント by 坂葉 — 2017 年 2 月 6 日 @ 20:00:31