ページ 11

FPSのようなカメラ移動

Posted: 2010年5月17日(月) 19:16
by ヒーはん
3Dのアクションゲームを作っていて、
FPSのような、カメラ移動を実装したいのですが、
どの様にすればできるでしょうか?

ちなみに、DXライブラリを使用しています

Re:FPSのようなカメラ移動

Posted: 2010年5月18日(火) 02:05
by Justy
 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

Re:FPSのようなカメラ移動

Posted: 2010年5月18日(火) 18:45
by ヒーはん
すいません、カメラそのものの動かし方ではなく、
マウスでFPSのようにカメラを動かす方法を教えて欲しいです。

Re:FPSのようなカメラ移動

Posted: 2010年5月18日(火) 20:14
by 通りすがり
とりあえず今どの程度FPSゲームが出来ているのか教えて下さい。
私たちにはヒーはんさんがどの程度のスキルを持っているのかが解りません。

Re:FPSのようなカメラ移動

Posted: 2010年5月18日(火) 21:10
by ヒーはん
>どの程度FPSゲームが出来ているのか教えて下さい。
WSADで移動ができて、左クリックで弾が撃てるぐらいです。

5作品ほどゲームは作ったことがあります。

Re:FPSのようなカメラ移動

Posted: 2010年5月19日(水) 02:08
by Justy
>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を行列化して掛けて下さい。

Re:FPSのようなカメラ移動

Posted: 2010年5月21日(金) 20:43
by ヒーはん
できました!!
みなさんのおかげです。ありがとうございました。