最終更新: boxer_programmer 2019年06月10日(月) 19:01:10履歴
やあ (´・ω・`) ようこそ、Effekseerの世界へ、このテキストはサービスなのでまずは落ち着いて読んでほしい。
注意点は、このテキストはVisualStudio2017向けに作っているということだ。
注意点は、このテキストはVisualStudio2017向けに作っているということだ。
EffekseerのライセンスはMITライセンスですね。まぁ、MITライセンスについては各自調べてほしいんですけど、
http://ja.wikipedia.org/wiki/MIT_License
基本的にフリーで、改変も自由。商用で使ってもOKだし、ソースコードを公開する必要もない。
ただし、これを使用しているソフトウェアは、ソフトウェアの重要な部分に明記しなければならない。つまり、これでゲームを作ったならば、タイトル画面だか、スタッフロール画面あたりに
Effekseer Copyright (c) 2011 S.Sawada
とか書いておく必要があるということですね。
http://ja.wikipedia.org/wiki/MIT_License
基本的にフリーで、改変も自由。商用で使ってもOKだし、ソースコードを公開する必要もない。
ただし、これを使用しているソフトウェアは、ソフトウェアの重要な部分に明記しなければならない。つまり、これでゲームを作ったならば、タイトル画面だか、スタッフロール画面あたりに
Effekseer Copyright (c) 2011 S.Sawada
とか書いておく必要があるということですね。
どうやらDxLibに組み込めないとか、組み込んでもうまくいかないっていう人の殆どがDxLibとの組み合わせでうまくいってないっぽい。
現在のEffekseerはDxLib対応ライブラリが用意されてるので、つべこべ言わずにそれを落としてきましょう。
https://effekseer.github.io/jp/download.html
のページの下部にある「Effekseer For DXライブラリ」をダウンロードしよう。
そして解凍する。解凍したら中にSampleというフォルダがあると思うので、Sample_VS2017.slnをダブルクリックして起動しましょう。
んで、そのままビルドしても通らないこともあるかもしれないが。「Effekseerを使おう」という気概のある君なら、この程度の環境設定くらいは目をつぶっていてもできると思うんだ……。
ここまでやってもまだビルドが通らない場合、DxLibそのものが見える位置に来ていないことがある。ここは自分で調べて対処してくれ。これすら対応できないならEffekseerを使うのは諦めたほうがいいだろう。
サンプルを起動するとまずコマンドプロンプトが立ち上がると思いますので、そこは2を入力してエンターを押そう。そうすれば…
画面にこのようにエフェクトが表示されるはず。こうなっていなければ環境設定のどこかが間違っていると思います。うまくいかない人はコメント欄にでも状況を書いてください。分かる場合は返答します。
現在のEffekseerはDxLib対応ライブラリが用意されてるので、つべこべ言わずにそれを落としてきましょう。
https://effekseer.github.io/jp/download.html
のページの下部にある「Effekseer For DXライブラリ」をダウンロードしよう。
そして解凍する。解凍したら中にSampleというフォルダがあると思うので、Sample_VS2017.slnをダブルクリックして起動しましょう。
んで、そのままビルドしても通らないこともあるかもしれないが。「Effekseerを使おう」という気概のある君なら、この程度の環境設定くらいは目をつぶっていてもできると思うんだ……。
ここまでやってもまだビルドが通らない場合、DxLibそのものが見える位置に来ていないことがある。ここは自分で調べて対処してくれ。これすら対応できないならEffekseerを使うのは諦めたほうがいいだろう。
サンプルを起動するとまずコマンドプロンプトが立ち上がると思いますので、そこは2を入力してエンターを押そう。そうすれば…
画面にこのようにエフェクトが表示されるはず。こうなっていなければ環境設定のどこかが間違っていると思います。うまくいかない人はコメント欄にでも状況を書いてください。分かる場合は返答します。
…たまに、僕の周りに、表示されないからといってEffekseerやDxLibのバグだとかいう人もいるが、んなこたーない。普通に組み込めば普通に作ることができる。
- efkファイルの読み込みに失敗
- テクスチャの読み込みに失敗
- たしかにこれはわかりづらい…ので解説しておくと、Effekseerから出力されたバイナリデータ(efk)をバイナリエディタで開いてもらうと分かると思うけど、パスが書いてあると思います。これがefkprojからの相対パスになっており、これは実行ファイルからの相対パスにもなっている。つまり、Effekseerで作業するときに、それを意識できていないと、このバグに陥りやすい。
- 対処法:efkprojで作業する際に、efkprojと同じ階層にTextureフォルダでも作って、その中にテクスチャを放り込んでおく。その上で、efkファイルを出力したフォルダにTextureフォルダをコピーしておく。そうすれば実行時にはefkのパスとTextureを合成してテクスチャファイルを見に行く事ができる。
上の対処をきっちりやっているはずなのに見えないって場合は、ちょっと数学を勉強した方がいい。特に行列について、もっと言うとカメラ行列(ビュー行列)とか射影行列とかについて勉強しよう。
さすがにこの辺りは3Dプログラミングをする上で避けて通れないからね。とはいえ、全然勉強したことがない人は時間かかるはずだからポイントだけ書いておく
いい機会だから「サンプルはサンプルで君の状況に対応する答えではない」っていうことを覚えておこう。
ローカル座標→ワールド座標→カメラ座標系→スクリーン座標系
てな感じになっている。今回のミソは、このワールド→カメラの変換だ。要はカメラを中心とした座標系へと変換するんだけど、それはカメラの位置および向いている方向によって変わる。これはわかるよね?
で、こいつが、3Dプログラミングでは行列(MATRIX)で表されているわけ。
つまるところこの行列が食い違っているために見えるはずのものが見えなかったり、変な位置に表示されるという状態になるわけだ。
また、デフォルトではEffekseerの座標系は右手系で、DxLibの座標系が左手系なので、この「系の違い」によって、表示に違いが出てしまっているはず。
DxLibのはMATRIXって型
中身がちゃいますので、愚直にコピーします。memcpyでもいいんだろうけど、行列コピってるって意味合いを強調するためにダブルループでやっちゃいます。
こんなかんじの関数を、DxLib側のカメラが動くたびにやっちゃやいいんだね。
さすがにこの辺りは3Dプログラミングをする上で避けて通れないからね。とはいえ、全然勉強したことがない人は時間かかるはずだからポイントだけ書いておく
- 原因:DxLibのカメラとEffekseerのカメラが別んとこ向いてる&座標系が逆向いてる(右手系と左手系)
いい機会だから「サンプルはサンプルで君の状況に対応する答えではない」っていうことを覚えておこう。
- カメラってのは行列で表現される
ローカル座標→ワールド座標→カメラ座標系→スクリーン座標系
てな感じになっている。今回のミソは、このワールド→カメラの変換だ。要はカメラを中心とした座標系へと変換するんだけど、それはカメラの位置および向いている方向によって変わる。これはわかるよね?
で、こいつが、3Dプログラミングでは行列(MATRIX)で表されているわけ。
つまるところこの行列が食い違っているために見えるはずのものが見えなかったり、変な位置に表示されるという状態になるわけだ。
- ついでに言うと射影行列と座標系もですよね〜
また、デフォルトではEffekseerの座標系は右手系で、DxLibの座標系が左手系なので、この「系の違い」によって、表示に違いが出てしまっているはず。
- 対処:Effekseer側のビュー行列、射影行列、系をDxLibに合わせてやる。
- まず手っ取り早いのは系ね
マネージャ->SetCoordinateSystem(Effekseer::COORDINATE_SYSTEM_LH);//左手系にしちゃる。これで終わり
- 次に、ビュー行列と射影行列をいっぺんにやっちゃう。
- DxLibからビュー行列と射影行列を取ってくる
MATRIX viewMat = DxLib::GetCameraViewMatrix();//ビュー行列取ってくる MATRIX projMat = DxLib::GetCameraProjectionMatrix();//射影行列取ってくるこれで取ってこれる。こいつをコピーするんだが
- Effekseerに行列をセットする
レンダラ->SetProjectionMatrix(射影行列); レンダラ->SetCameraMatrix(ビュー行列);で、それぞれの行列をセットできるんだが、残念ながら型が違うんやね
- DxLibの行列をEffekseerの行列にコピー
DxLibのはMATRIXって型
中身がちゃいますので、愚直にコピーします。memcpyでもいいんだろうけど、行列コピってるって意味合いを強調するためにダブルループでやっちゃいます。
void EffekseerSyncronizeDxLib(){ MATRIX viewMat = DxLib::GetCameraViewMatrix();//ビュー行列取ってくる MATRIX projMat = DxLib::GetCameraProjectionMatrix();//射影行列取ってくる Effekseer::Matrix44 efViewMat; Effekseer::Matrix44 efProjMat; for(int j=0;j<4;++j){ for(int i=0;i<4;++i){ efViewMat[j][i]=viewMat[j][i]; efProjMat[j][i]=projMat[j][i]; } } レンダラ->SetProjectionMatrix(efProjMat); レンダラ->SetCameraMatrix(efViewMat); }こんな感じかな。
こんなかんじの関数を、DxLib側のカメラが動くたびにやっちゃやいいんだね。
タグ
このページへのコメント
ごめんね
最後 efViewMat と efProjMat 逆ぅ
コピらせてもらった結果小一時間悩んだ