3D マップに 2D キャラクターを配置してみた
かなり久しぶりの自作ゲームの報告です。何ヶ月ぶりだ(笑や、LWJGL のゲーム製作系記事で貯めてたノウハウをやっと自分のゲームにフィードバックできるようになったので、またちょっと進んだのです。
戦闘シーンの画面表示以外のロジックをちょこちょこ書いてたりはしてたのですが、見える部分を機能拡張するとだいぶ見栄えが違うなーということで少しだけお披露目です。
今週実装していたのは、Blender で作った 3D マップ上に 2D キャラクターを配置して動かすというものです。
http://chocolapod.sakura.ne.jp/blog/view.cgi?entryId=35
キャラクターは回転させない
Blender で作ったモデルを LWJGL で表示するというのは以前試したものをほぼそのままフォードバックしているのですが、同時に 2D キャラクターを配置するというのは初の試みでした。マップ自体は 3D なのでぐりぐり回転させられるのですが、キャラクターは 2D なので、キャラクター自体は回転させずに表示する必要があるのです。
普通にテクスチャーを上書いていくと、マップに対する glRotatef() がキャラクターにも効いてしまうんですよね。真上から見ると厚さのない 2D キャラクターは消えてしまうわけです。
それでもマップを回転させたらキャラクターが立っている位置もいっしょに回転させなければならないのが難関でした。隠面消去とかもあるので 2D 座標では駄目なんですよね。
結局のところ、どんなにマップを回転させても、キャラクターのテクスチャは視点(スクリーン)に対して並行に描かなければならないんですよね。
手順としては、
1. マップの中心を軸にマップを回転させる
2. マップを描く
3. キャラクターを中心にマップの回転と反対方向に同じ量回転させる
4. キャラクターを描く
3D マップの回転は必要なので、2D キャラクターを描く前に逆回転させて、傾きを元に戻してしまえということです。
上のスクリーンショットだと、キャラクターの他にコマンドメニューなんかも視点と並行に描いてます。
※ コマンドメニューの位置はウィンドウ上で常に固定なので、3D マップの回転に影響されないように glPushMatrix() の外側に追い出してます。
ついでに座標系が 2D だったので 3D で扱うようにしました。敵に駆け寄ったりするアクションは次元が 1 つ増えるのでなかなかの作業でした。
マルチサンプリングのバッファ数をプログラム側で指定する
隠面消去の回で扱ったマルチサンプリング機能ですが、使用するバッファ数もプログラム側で指定するようにしました。この LWJGL 講座を書いた当時はハードウェア側でバッファ数を決め打ちにするように書いちゃってました。
がしかし、そもそもビデオカードの初期値はアプリケーション毎に設定するみたいなのになってるし、16 とかに上げてみたらゲームを起動してないのにマシンがすごい唸り始める(全プログラムに 16 個バッファを割り当ててたっぽい)しで、絶対成功法じゃないなーと思っていたのです。
とは言っても具体的にどうすればプログラム側でバッファ数を指定できるのかがわからなかったのですが、今日いろいろ調べてたら Display 作成時に PixelFormat の引数として指定できることがわかりました。
なるほどなー。
あ、具体的なコードは隠面消去の回を更新しておいたのでそちらを見てください。
ええと、最近はこんな調子です。
なんやかんやしばらくは土台整備が続くんだろうなーと思ってます。
ゲーム製作 コメント (0) 2012/06/08 19:59:25