思った座標にEffekseerのエフェクトを3D描画できるようになるまで1
先日書いたように、
ずっとハマっていたEffekseerのエフェクトを3D再生ですが
ようやく、できるようになりました。
超、長かった・・・
3D描画のカメラやら各種座標など、
理解しないといけないことやらがありまして手こずりました。
画面右側のブレイクオブジェクトのヒットエフェクトが
2Dエフェクトで、竜巻風なのが3の3Dエフェクトです。
3Dエフェクトは2D表示もできるのですが、
あまりに見栄えが悪かったのです。
同じエフェクトを描画しているのに
3Dの時と較べて、パーティクルというかドットで描画されてて
全然、見栄えが良くなかったのです。
実は、上の竜巻風のエフェクトは、
Effekseerのサンプルとして
付属していたもののパラメータを少し修正したものです。
Effekseerでこのサンプルを見た時に
かげさんは、これをエアリアルステップのエフェクトとして使いたい
と思いました。
元々DXライブラリは3D描画の機能を使って2D描画をしているらしいので
2Dと3Dの同時描画は問題なくできるだろうとは思っていました。
エフェクトとしてはどうかが分からず試したのが最初の図です。
試した段階では、3Dカメラや3Dエフェクト描画は
Effekseer For DXライブラリのサンプルのままで
思った座標にエフェクトが表示できませんでした。
2Dゲームの座標とかを考慮して3Dゲームを作る
というのは、この動画を見てた関係でできると思っていたので、
座標だけ合わせることもできるはず、
ということで調べ始めたわけです。
初音ミク冒険記は2Dゲームとして作っています。
でも、3Dゲームとして作っているわけじゃないのですが、
実は、かなり初期の段階から初音ミク冒険記では
キャラの座標は3次元で管理しています。
2Dゲームの基本であるx座標とy座標だけじゃなく
こっそりz座標を持っています。
POINT構造体ではなくVECTOR構造体で管理しているわけです。
じゃあ、そもそも何で2Dゲームを3次元座標で管理しているんだ?
って話なんですが、実は、これ、PSP版の頃まで遡ります。
このブログでも何度か書きましたが、
初音ミク冒険記は、下記の本で
DXライブラリを使って作っている「まものの里」という
アクションゲームをベースに少しずつ機能を追加して作っています。
14歳からはじめるC言語わくわくゲームプログラミング教室Visual Studio 2008編―Windows XP/Vista対応
この本に従うのであれば、2次元ベクトルを使うのでz座標は不要です。
なのに、なぜz座標を管理しているのかというと
DXライブラリのPSP版であるDXライブラリPortableで
3次元ベクトルの計算を
内部的にアセンブラで組んであったためです。
今時、アセンブラを使う人は少ないと思いますが
アセンブラ言語は、よりコンピュータ側に近い低水準言語で
高水準言語であるコンパイル言語よりも高速です。
ここで低水準というのはコンピュータが理解しやすいという意味で
高水準というのは人間が理解しやすいという意味です。
コンピュータにとって理解しやすい方がより高速というわけです。
PSPの頃だと性能を考えた時には、少しでも高速な方が良いわけです。
実は、上記の本に載っていた計算関係の関数に相当することは
DXライブラリPortableのベクトル計算の関数とほとんど中身が同じでした。
このため、z座標を使わないだけで(常に0として扱う)
計算は3次元ベクトル計算の関数を使うことにしました。
実際にはそれらの関数も、本家のDXライブラリにあったので
Windows版に移行する時も、そのまま移行できたというわけです。
<参考>
移行に際して変更したのは、以下の項目だったはず
・文字コード(ツールKanjiTranslatorで一括対応)
・暗黙のキャスト問題(オーバーロードで逃げた)
・CRTセキュリティ強化対応
・Luaのextern "C"
・色の問題
・フォント問題
・セーブデータシステム
・キー操作対応
ちょっと脱線してしまいました。
さて、3次元座標を持っているならエフェクトの3D描画も簡単では?
と思うかもしれません。
が、2Dと3Dだといろいろと違うんです。
x座標は、右に行くと値が大きくなり、左に行くと値が小さくなる。
ここまでは2Dと3Dで変わりません。
y座標は、2Dでは上に行くと値が小さくなり、下に行くと値が大きくなるのに対して
3Dでは上に行くと値が大きくなり、下に行くと値が小さくなる
ということで、y座標は変換作業が必要になります。
上記の図で考えると例えば2Dでy座標が100だとすると
初音ミク冒険記の縦のゲーム表示領域はPSPの頃の名残で272
ということで、同じ座標で表示したいなら
「画面縦幅」-「2Dでのy座標」なので
272-100で172という計算になります。
ただし、これは3Dの単位が1ピクセルならの話です。
さらに3Dの場合はカメラ視点によっても話が変わってきます。
例えば、3Dの原点座標が2Dの原点座標の位置になるように
3Dカメラの描画位置を合わせた場合、
y座標は、単純に符号を変えれば良いだけになります。
このようにカメラの位置も問題になってきます。
DXライブラリだと、どうやら3Dカメラの初期位置は
画面のウィンドウサイズによって変わるみたいですが
x座標とy座標だけ見ると、
ウィンドウサイズのちょうど半分の位置になります。
DXライブラリでは何も指定しなければ
ウィンドウサイズの初期値は640x480です。
このため、x座標=320、y座標=240となります。
そしてz座標はウィンドウサイズから自動計算されるようです。
カメラの姿勢は、
視点、注視点、カメラの上方向の3つの要素で決まります。
いいかえるとカメラの姿勢を決めるだけでも3つの座標が必要です。
加えて、カメラ内にものを描画するためには、
カメラの視界内に描画する必要があります。
ということで、実は画面内に何かを描画するだけで4つの座標が
うまく咬み合わないとダメなんです・・・
カメラとか3Dのことが分からんとダメだな
と思ったのは、この段階です。
実は、上で紹介した動画の作者と書籍の作者は同じ人だったりします。
この人は
【DXライブラリ3D入門】とりあえずモデルを表示してみよう という記事も書いていて、この人のサイトで勉強したり、
この人が書いてDXライブラリの作者が監修した
この本を読んだりして勉強してました。
超本格! サンプルで覚えるC言語 3Dゲームプログラミング教室
記事の内容、書籍の内容、それぞれで理解は深まりました。
Effekseer For DXライブラリも含めて
サンプル通りになら動かしてうまくいく。
が、それでも、今の初音ミク冒険記に
どう組み込めば良いのかが分からなかったのです・・・
座標を動かせるようにして試したものの
ちょっと座標を変更すると見え方が変わったりしてしまい
トライアル&エラーで調整しようとしても結構、途方にくれてました。
長くなってきたので、次の記事に続きます。
| 【固定リンク】 | 【コメント (0)】 | 【トラックバック (0)】
このエントリーへのリンク
トラックバック
この記事へのトラックバックの一覧です: 思った座標にEffekseerのエフェクトを3D描画できるようになるまで1:
コメント
このブログの新着コメントをRSSリーダに登録する為のxml