3Dゲームのカメラ移動について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
史上最悪のデスペナ

3Dゲームのカメラ移動について

#1

投稿記事 by 史上最悪のデスペナ » 14年前

初めまして。これからお世話になる(予定の)、史上最悪のデスペナ、です。

DXライブラリを使っているのですが、3Dゲームにおけるカメラ移動で分からなかったとこがあるので質問させていただきます。
ちなみに、
WindowsXPと7でVidualStadio2010Expressを使ってプログラムを組んでいます。
プログラムスキルは簡単なクラスが作れ、ポインタがわかる気がする(試行錯誤すれば使える)程度です。

今出来ているのは、
自機が上下左右・Y軸回転しても常に一定の距離を保ったまま真後ろからカメラで自機を見る
カメラをカーソルキーで前後に移動させても上記のことが出来る
という状況です。

お聞きしたいのは、
カメラを、自機を中心とした球面上を移動させる時、自機が移動してもカメラと自機の位置関係を変えないようにするにはどうしたらいいかということです。考え方、というか表現の仕方というかが全く思いつきません。考え方だけでも結構ですのでよろしくお願いします。
ついでに、ソースの悪い点も指摘して下さるとうれしいです
(例:自機の真後ろ(距離500)にいるカメラを真横(仮に右側)の斜め上45°(距離500)の位置に移動させたとき、自機が上下左右・Y軸回転しても常に自機の真横(仮に右側)の斜め上45°(距離500)にカメラを置く)

一応、必要部のみ抜粋してコードを書きます

カメラ.hのソース
code
class C_Camera{

    float y_r;     //カメラのY軸回転量です
    float distance;  //カメラと自機の距離です
    VECTOR Pos;   //カメラの位置座標です

public:

    //カメラ作成(Target=注視点(自機座標))
    void Init( VECTOR Target );
    //自機追尾(Pos=自機移動ベクトル、Target=注視点(自機座標)、PC_y_r=自機Y軸回転量)
    void CameraAutoMove( VECTOR Pos, VECTOR Target, float PC_y_r );
    //カメラ操作(Target=注視点(自機座標)、PC_y_r=自機Y軸回転量、KeyBuf[256]=キー押下取得用配列)
    void CameraManualMove( VECTOR Target, float PC_y_r, char KeyBuf[256] );

};
/code

カメラ.cppのソース
code
void C_Camera::Init( VECTOR Target )
{
Pos = VGet( 300.0f, 500.0f, -800.0f);
SetupCamera_Perspective( 60.0*PHI_F/180.0f ) ;
SetCameraPositionAndTarget_UpVecY( Pos, Target );
}

void C_Camera::CameraAutoMove( VECTOR CharaVec, VECTOR Target, float PC_y_r )
{
Pos = VAdd( Pos, CharaVec );
if (y_r != PC_y_r)
{
//自機とカメラ間の距離を求めて自機を中心として真後ろから角度(ラジアン)PC_y_rだけ回転させてます
distance = sqrt( (Target.x - Pos.x) * (Target.x - Pos.x) + (Target.y - Pos.y) * (Target.y - Pos.y) + (Target.z - Pos.z) * (Target.z - Pos.z) );
Pos.x = Target.x + distance * sin( PC_y_r );
Pos.z = Target.z + distance * cos( PC_y_r );
y_r = PC_y_r;
}

SetCameraPositionAndTarget_UpVecY( Pos, Target );
}

void C_Camera::CameraManualMove( VECTOR Target, float PC_y_r, char KeyBuf[256] )
{
if( KeyBuf[KEY_INPUT_UP] == 1 ) distance -= 5.0f;
if( distance < 0.0f ) distance = 0.0f;
if( KeyBuf[KEY_INPUT_DOWN] == 1 ) distance += 5.0f;
if( distance > 2000.0f ) distance = 2000.0f;

Pos.x = Target.x + distance * sin( PC_y_r );
Pos.z = Target.z + distance * cos( PC_y_r );

SetCameraPositionAndTarget_UpVecY( Pos, Target );
}
/code

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: 3Dゲームのカメラ移動について

#2

投稿記事 by h2so5 » 14年前

まず自機の向いている方向のベクトルを求めて、
そのベクトルを変換行列を使って任意の角度回転させ(自機の真後ろだったら180度y軸回転)、
そのあと、自機とカメラの距離にスケーリングして、自機の座標と加算すればカメラの座標が出せると思います。

史上最悪のデスペナ
記事: 521
登録日時: 14年前

Re: 3Dゲームのカメラ移動について

#3

投稿記事 by 史上最悪のデスペナ » 14年前

ふむ・・・・・・
行列は難しそうなので忌避してたのですが・・・・頑張ってやってみます。ありがとうございました

閉鎖

“C言語何でも質問掲示板” へ戻る