FPSの様なカメラ操作

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
りゅう

FPSの様なカメラ操作

#1

投稿記事 by りゅう » 12年前

件名のように、FPSの様なカメラ操作を実現したいです。

そこで、この様なプログラムを書きましたが、

void Camera_FPS_Process(void){

//SetMouseDispFlag(FALSE);

float h,v;

MATRIX z;
MATRIX y;

float Camera_model_Length ;

Camera_model_Length =50.0f;//CAMERA_PLAYER_LENGTH;


// マウスの位置を取得
GetMousePoint( &set.MouseX , &set.MouseY ) ;
set.MouseX-=320;
set.MouseY-=240;

if(set.MouseX>=310)set.MouseX=310;
if(set.MouseX<=-310)set.MouseX=-310;
if(set.MouseY>=70)set.MouseY=70;
if(set.MouseY<=-60)set.MouseY=-60;

h=(set.MouseX/80.0f);
v=(set.MouseY/80.0f);

y=MGetRotY(h);
z=MGetRotZ(v);
cam.pos=VAdd(mod.pos,VGet(0,PLAYER_HIT_HEIGHT,0));
cam.target_pos = VAdd( VTransform( VTransform( VGet( -Camera_model_Length, 0.0f, 0.0f ), z ), y ), cam.pos) ;

// カメラの情報をライブラリのカメラに反映させる
SetCameraPositionAndTarget_UpVecY( cam.pos,cam.target_pos ) ;

//DrawLine3D(VAdd(cam.target_pos,VGet()), VECTOR Pos2, int Color ) ;
DrawLine( 310, 240 ,330,240,GetColor(255,255,255)) ;


}

いまいち、思っているような感じではありません。

改良点を教えていただきたいです。

nil
記事: 428
登録日時: 12年前

Re: FPSの様なカメラ操作

#2

投稿記事 by nil » 12年前

コードタグをお使いください。

いまいち思っているような感じでない、ということですが、質問の内容が曖昧すぎます。
具体的にお願いします。

大抵の場合は数値を弄ればそれらしくは動きます

りゅう

Re: FPSの様なカメラ操作

#3

投稿記事 by りゅう » 12年前

「code=C]
void Camera_FPS_Process(void){

//SetMouseDispFlag(FALSE);

float h,v;

MATRIX z;
MATRIX y;

float Camera_model_Length ;

Camera_model_Length =50.0f;//CAMERA_PLAYER_LENGTH;


// マウスの位置を取得
GetMousePoint( &set.MouseX , &set.MouseY ) ;
set.MouseX-=320;
set.MouseY-=240;

if(set.MouseX>=310)set.MouseX=310;
if(set.MouseX<=-310)set.MouseX=-310;
if(set.MouseY>=70)set.MouseY=70;
if(set.MouseY<=-60)set.MouseY=-60;

h=(set.MouseX/80.0f);
v=(set.MouseY/80.0f);

y=MGetRotY(h);
z=MGetRotZ(v);
cam.pos=VAdd(mod.pos,VGet(0,PLAYER_HIT_HEIGHT,0));
cam.target_pos = VAdd( VTransform( VTransform( VGet( -Camera_model_Length, 0.0f, 0.0f ), z ), y ), cam.pos) ;

// カメラの情報をライブラリのカメラに反映させる
SetCameraPositionAndTarget_UpVecY( cam.pos,cam.target_pos ) ;

//DrawLine3D(VAdd(cam.target_pos,VGet()), VECTOR Pos2, int Color ) ;
DrawLine( 310, 240 ,330,240,GetColor(255,255,255)) ;

}
[/code]

違和感としては画面端にマウスポインタが行くとそれ以上
回転させることができない

この他にもおかしい点はあると思いますが、
一番の問題点はここです。

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

Re: FPSの様なカメラ操作

#4

投稿記事 by h2so5 » 12年前

りゅう さんが書きました: 違和感としては画面端にマウスポインタが行くとそれ以上
回転させることができない
毎フレームマウスの移動量を計算して、
そのあとに強制的にマウスの座標を画面中央に戻すというのがよくある手法です。

りゅう

Re: FPSの様なカメラ操作

#5

投稿記事 by りゅう » 12年前

コード:

void Camera_FPS_Process(void){

//SetMouseDispFlag(FALSE);

float h,v;

MATRIX z;
MATRIX y;

float Camera_model_Length ;

Camera_model_Length =50.0f;//CAMERA_PLAYER_LENGTH;


// マウスの位置を取得
GetMousePoint( &set.MouseX , &set.MouseY ) ;
set.MouseX-=320;
set.MouseY-=240;

if(set.MouseX>=310)set.MouseX=310;
if(set.MouseX<=-310)set.MouseX=-310;
if(set.MouseY>=70)set.MouseY=70;
if(set.MouseY<=-60)set.MouseY=-60;

h=(set.MouseX/80.0f);
v=(set.MouseY/80.0f);

y=MGetRotY(h);
z=MGetRotZ(v);
cam.pos=VAdd(mod.pos,VGet(0,PLAYER_HIT_HEIGHT,0));
cam.target_pos = VAdd( VTransform( VTransform( VGet( -Camera_model_Length, 0.0f, 0.0f ), z ), y ), cam.pos) ;

// カメラの情報をライブラリのカメラに反映させる
SetCameraPositionAndTarget_UpVecY( cam.pos,cam.target_pos ) ;

SetMousePoint(320,240);

}
こうすると、毎回位置が真ん中に戻りますが、視点変更ができません。

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

Re: FPSの様なカメラ操作

#6

投稿記事 by h2so5 » 12年前

カメラの位置をマウスの座標に合わせて毎回リセットしてしまっているからです。
マウスの移動量をカメラの角度に加算していく必要があります。

りゅう

Re: FPSの様なカメラ操作

#7

投稿記事 by りゅう » 12年前

[/quote]
毎フレームマウスの移動量を計算して、
そのあとに強制的にマウスの座標を画面中央に戻すというのがよくある手法です。[/quote]

この強制的にもどすのは、1フレームごとに戻すのですか?

コード:

void Camera_FPS_Process(void){

	//SetMouseDispFlag(FALSE);

	float h,v;
	float Camera_model_Length;

	MATRIX z;
	MATRIX y;

	SetMousePoint(0,0);

	Camera_model_Length =50.0f;//CAMERA_PLAYER_LENGTH;

	// マウスの位置を取得
	GetMousePoint( &set.MouseX , &set.MouseY ) ;

	if(set.MouseX!=0&&set.MouseY!=0){
	set.Oldx+=set.MouseX;
	set.Oldy-=set.MouseY;
	}else{
		set.Oldx=0;
		set.Oldy=0;
	}

	h=(/*set.MouseX*/set.Oldx/80.0f);
	v=(/*set.MouseY*/set.Oldy/80.0f);

	y=MGetRotY(h);
	z=MGetRotZ(v);
	cam.pos=VAdd(mod.pos,VGet(0,PLAYER_HIT_HEIGHT,0));
	cam.target_pos  = VAdd( VTransform( VTransform( VGet( -Camera_model_Length, 0.0f, 0.0f ), z ), y ), cam.pos) ;

	// カメラの情報をライブラリのカメラに反映させる
	SetCameraPositionAndTarget_UpVecY( cam.pos,cam.target_pos ) ;

}

これでは視点は固定のままです。

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

Re: FPSの様なカメラ操作

#8

投稿記事 by h2so5 » 12年前

実装としてはこうなるとおもいます。
set.MouseX と set.MouseY が 0 で初期化されている必要があります。

コード:

void Camera_FPS_Process(void){
 
//SetMouseDispFlag(FALSE);
 
float h,v;
 
MATRIX z;
MATRIX y;
 
float Camera_model_Length ;
 
Camera_model_Length =50.0f;//CAMERA_PLAYER_LENGTH;
 
 
// マウスの位置を取得
int mouse_x, mouse_y;
GetMousePoint( &mouse_x , &mouse_y ) ;
set.MouseX += mouse_x - 320;
set.MouseY += mouse_y - 240;
 
if(set.MouseX>=310)set.MouseX=310;
if(set.MouseX<=-310)set.MouseX=-310;
if(set.MouseY>=70)set.MouseY=70;
if(set.MouseY<=-60)set.MouseY=-60;
 
h=(set.MouseX/80.0f);
v=(set.MouseY/80.0f);
 
y=MGetRotY(h);
z=MGetRotZ(v);
cam.pos=VAdd(mod.pos,VGet(0,PLAYER_HIT_HEIGHT,0));
cam.target_pos = VAdd( VTransform( VTransform( VGet( -Camera_model_Length, 0.0f, 0.0f ), z ), y ), cam.pos) ;
 
// カメラの情報をライブラリのカメラに反映させる
SetCameraPositionAndTarget_UpVecY( cam.pos,cam.target_pos ) ;
 
SetMousePoint(320,240);
 
}

りゅう

Re: FPSの様なカメラ操作

#9

投稿記事 by りゅう » 12年前

私のプログラムは余計なif文がありましたね。

ご回答ありがとうございました

閉鎖

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