件名のように、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)) ;
}
いまいち、思っているような感じではありません。
改良点を教えていただきたいです。
FPSの様なカメラ操作
Re: FPSの様なカメラ操作
コードタグをお使いください。
いまいち思っているような感じでない、ということですが、質問の内容が曖昧すぎます。
具体的にお願いします。
大抵の場合は数値を弄ればそれらしくは動きます
いまいち思っているような感じでない、ということですが、質問の内容が曖昧すぎます。
具体的にお願いします。
大抵の場合は数値を弄ればそれらしくは動きます
Re: FPSの様なカメラ操作
「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]
違和感としては画面端にマウスポインタが行くとそれ以上
回転させることができない
この他にもおかしい点はあると思いますが、
一番の問題点はここです。
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]
違和感としては画面端にマウスポインタが行くとそれ以上
回転させることができない
この他にもおかしい点はあると思いますが、
一番の問題点はここです。
Re: FPSの様なカメラ操作
毎フレームマウスの移動量を計算して、りゅう さんが書きました: 違和感としては画面端にマウスポインタが行くとそれ以上
回転させることができない
そのあとに強制的にマウスの座標を画面中央に戻すというのがよくある手法です。
Re: 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 ) ;
SetMousePoint(320,240);
}
Re: FPSの様なカメラ操作
カメラの位置をマウスの座標に合わせて毎回リセットしてしまっているからです。
マウスの移動量をカメラの角度に加算していく必要があります。
マウスの移動量をカメラの角度に加算していく必要があります。
Re: FPSの様なカメラ操作
[/quote]
毎フレームマウスの移動量を計算して、
そのあとに強制的にマウスの座標を画面中央に戻すというのがよくある手法です。[/quote]
この強制的にもどすのは、1フレームごとに戻すのですか?
これでは視点は固定のままです。
毎フレームマウスの移動量を計算して、
そのあとに強制的にマウスの座標を画面中央に戻すというのがよくある手法です。[/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 ) ;
}
Re: FPSの様なカメラ操作
実装としてはこうなるとおもいます。
set.MouseX と set.MouseY が 0 で初期化されている必要があります。
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);
}