3Dのアクションゲームを作っていて、
FPSのような、カメラ移動を実装したいのですが、
どの様にすればできるでしょうか?
ちなみに、DXライブラリを使用しています
FPSのようなカメラ移動
Re:FPSのようなカメラ移動
DXライブラリ 3.xでのカメラは以下の関数を使います。
・ SetCameraPositionAndTargetAndUpVec
・ SetCameraPositionAndTarget_UpVecY
・ SetCameraPositionAndAngle
・ SetCameraViewMatrix
よく使うのは多分 1番目か2番目でしょうか。
2.x系だと
・ CreateLookAtMatrix / CreateLookAtMatrix2 / CreateLookAtMatrixRHなど + SetTransformToView
しかないようです。
使い方はリファレンスに載っていますが、どれもカメラの姿勢をベクトルないしは行列で指定するタイプの
ものです。
実装としては基本カメラは座標 [0, 0, 0]に固定(振動などオフセット的な移動は別)、して
マップやキャラクタの方を動かすのがいいでしょう。
例えば前進するときは、マップ・キャラクタなどプレイヤー以外の全てのオブジェクトを
前から後ろに移動させます。
そうすると見た目上前進しているように見ます。
後退するときは反対に後ろから前に動かします。
少し面倒ですがこうしないと、DXライブラリの内部計算は floatなので
広大なマップを移動して座標の値が大きくなりすぎた時細かい座標の表現に問題がでるからです。
カメラが常に [0, 0, 0]付近であればまずその心配をしなくて済みます。
(勿論これは可視範囲内は問題が出ないだけで、見えない遠くの方ではおかしなことになっているでしょう)
とはいえそんな広大なマップは使わないから floatの問題はおきない、ということであれば
カメラの方を動かしても構いません。
その方が管理は楽ですから。
こちらはカメラの方を動かしている公式サンプルです。
DXライブラリ置き場 迷路を3Dで表示
http://homepage2.nifty.com/natupaji/DxL ... meiro.html
・ SetCameraPositionAndTargetAndUpVec
・ SetCameraPositionAndTarget_UpVecY
・ SetCameraPositionAndAngle
・ SetCameraViewMatrix
よく使うのは多分 1番目か2番目でしょうか。
2.x系だと
・ CreateLookAtMatrix / CreateLookAtMatrix2 / CreateLookAtMatrixRHなど + SetTransformToView
しかないようです。
使い方はリファレンスに載っていますが、どれもカメラの姿勢をベクトルないしは行列で指定するタイプの
ものです。
実装としては基本カメラは座標 [0, 0, 0]に固定(振動などオフセット的な移動は別)、して
マップやキャラクタの方を動かすのがいいでしょう。
例えば前進するときは、マップ・キャラクタなどプレイヤー以外の全てのオブジェクトを
前から後ろに移動させます。
そうすると見た目上前進しているように見ます。
後退するときは反対に後ろから前に動かします。
少し面倒ですがこうしないと、DXライブラリの内部計算は floatなので
広大なマップを移動して座標の値が大きくなりすぎた時細かい座標の表現に問題がでるからです。
カメラが常に [0, 0, 0]付近であればまずその心配をしなくて済みます。
(勿論これは可視範囲内は問題が出ないだけで、見えない遠くの方ではおかしなことになっているでしょう)
とはいえそんな広大なマップは使わないから floatの問題はおきない、ということであれば
カメラの方を動かしても構いません。
その方が管理は楽ですから。
こちらはカメラの方を動かしている公式サンプルです。
DXライブラリ置き場 迷路を3Dで表示
http://homepage2.nifty.com/natupaji/DxL ... meiro.html
Re:FPSのようなカメラ移動
>どの程度FPSゲームが出来ているのか教えて下さい。
WSADで移動ができて、左クリックで弾が撃てるぐらいです。
5作品ほどゲームは作ったことがあります。
WSADで移動ができて、左クリックで弾が撃てるぐらいです。
5作品ほどゲームは作ったことがあります。
Re:FPSのようなカメラ移動
>FPSのようにカメラを動かす
回転の方、ということですか?
あんまりFPSで遊ばないんで、どういう動きがベストなのかは知らないですけど、
大体こんなかんじってところでよければ。
とりあえず、マウスの相対移動をもって回転させる、ということで。
現在の画面上のマウスの位置 Mを、前のフレームでのマウスの位置を 0としたときに
画面幅・高さ分移動した場合が 1になるよう正規化します(NM)。
(この際 y軸の符号をどっちにするかはお好みで)
例えば、前のフレームのマウスの位置が画面中央で、今が画面上部中央なら
NM[x, y] = [0, -0.5 (0.5)]といった感じです。
その正規化された座標 NMと最大角速度 Rを掛けたらその値 (NMR)がそのフレームでの
カメラの回転量になりますので、今のカメラの XYZ軸の回転値に NMR[x]の方を、
カメラのY軸に、NMR[y]の方を X軸の方に足して、終わりです。
カメラの管理が回転値でなく、ベクトルやら行列で管理されているなら、MMRを行列化して掛けて下さい。
回転の方、ということですか?
あんまりFPSで遊ばないんで、どういう動きがベストなのかは知らないですけど、
大体こんなかんじってところでよければ。
とりあえず、マウスの相対移動をもって回転させる、ということで。
現在の画面上のマウスの位置 Mを、前のフレームでのマウスの位置を 0としたときに
画面幅・高さ分移動した場合が 1になるよう正規化します(NM)。
(この際 y軸の符号をどっちにするかはお好みで)
例えば、前のフレームのマウスの位置が画面中央で、今が画面上部中央なら
NM[x, y] = [0, -0.5 (0.5)]といった感じです。
その正規化された座標 NMと最大角速度 Rを掛けたらその値 (NMR)がそのフレームでの
カメラの回転量になりますので、今のカメラの XYZ軸の回転値に NMR[x]の方を、
カメラのY軸に、NMR[y]の方を X軸の方に足して、終わりです。
カメラの管理が回転値でなく、ベクトルやら行列で管理されているなら、MMRを行列化して掛けて下さい。