一人称視点でのマウスでの注視点移動が、がくがく

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

一人称視点でのマウスでの注視点移動が、がくがく

#1

投稿記事 by cururu » 14年前

現在、3DのFPSを作成中です。

マウスを動かすと注視点?が動くようにしたんですが
動くときにすごくがくがくするというか、コマ送りみたいな感じになってしまいます。
なめらかに動くようにしたいのですが、どうしたらいいでしょうか?

-- main.cpp --

コード:

#include "DxLib.h"
#include "move.h"
#include "camera.h"

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow )
{
	ChangeWindowMode( TRUE );
	SetDrawScreen( DX_SCREEN_BACK );

	if( DxLib_Init() == -1 ) 
	{
		return -1;
	} 

	//3Dモデルのハンドルを入手
	int RedBoxHandle = MV1LoadModel( "box-red.mqo" );
	int YellowBoxHandle = MV1LoadModel( "box-yellow.mqo" );

	//3Dモデルの座標を設定
	VECTOR RedBoxPosition = VGet( 320.0f , -300.0f , 600.0f );
	VECTOR YellowBoxPosition = VGet( 450.0f , -300.0f , 600.0f );

	//主人公の視点の初期位置を設定
	VECTOR PlayerPosition = VGet( 0.0f , 0.0f , 0.0f );

	//主人公の注視点の初期位置を設定
	CAMERA PlayerCamera = { 0.0f , 0.0f , 0.0f };

	while( CheckHitKey(KEY_INPUT_ESCAPE) == 0 )
	{
		if( ProcessMessage() == -1 ) break;

		//画面をクリア
		ClearDrawScreen();

		//移動制御関数の呼び出し
		Move( &PlayerPosition );

		//カメラ制御関数の呼び出し
		int Count = 0;
		while( Count != 40 )
		{
			Camera( &PlayerCamera );
			Count ++ ;
		}

		//カメラをセット
		SetCamera( &PlayerPosition , &PlayerCamera );	
		
		//ポリゴンモデルの位置を設定
		MV1SetPosition( RedBoxHandle , RedBoxPosition );
		MV1SetPosition( YellowBoxHandle , YellowBoxPosition );

		//ポリゴンモデルを描画
		MV1DrawModel( RedBoxHandle );
		MV1DrawModel( YellowBoxHandle );

		//裏画面を表画面へ
		ScreenFlip();

		//マウスを常に中央へ
		SetMousePoint( 320 , 240 );
		
	}
	
	DxLib_End();

	return(0) ;
}
-- camera.h --

コード:

#include "DxLib.h"
#include <stdlib.h>
#include <math.h>

#define DEF_CAMERA_ADD 60.0f

//カメラ情報構造体
typedef struct CAMERA
{
	float VRotate;	//上下方向の回転角度
	float HRotate;	//左右方向の回転角度
	float TRotate;	//捻りの回転角度(未使用)
}CAMERA;

//プロトタイプ宣言
void Camera( CAMERA* Camera);					//カメラの総合制御関数
void MoveCamera_Right( CAMERA* Camera );		//注視点を右へ
void MoveCamera_Left( CAMERA* Camera );			//注視点を左へ
void MoveCamera_Up( CAMERA* Camera );			//注視点を上へ
void MoveCamera_Down( CAMERA* Camera );			//注視点を下へ
void SetCamera( VECTOR* Position , CAMERA* Camera );	//カメラを設置

//関数群
void Camera( CAMERA* Camera )
{
	int MousePosition_x;
	int MousePosition_y;
	int x;
	int y;

	SetMouseDispFlag( FALSE );
	
	GetMousePoint( &MousePosition_x , &MousePosition_y );

	x = MousePosition_x - 320;
	y = MousePosition_y - 240;

	if( x > 0 )
	{
		MoveCamera_Right( Camera );
	}
	if( x < 0 )
	{
		MoveCamera_Left( Camera );
	}
	if( y > 0 )
	{
		MoveCamera_Down( Camera );
	}
	if( y < 0 )
	{
		MoveCamera_Up( Camera );
	}

	return ;
}

void MoveCamera_Right( CAMERA* Camera )
{
	Camera->HRotate += PHI_F / DEF_CAMERA_ADD;

	return ;
}

void MoveCamera_Left( CAMERA* Camera )
{
	Camera->HRotate -= PHI_F / DEF_CAMERA_ADD;

	return ;
}

void MoveCamera_Up( CAMERA* Camera )
{
	
	Camera->VRotate -= PHI_F / DEF_CAMERA_ADD;

	return ;
}

void MoveCamera_Down( CAMERA* Camera )
{
	Camera->VRotate += PHI_F / DEF_CAMERA_ADD;

	return ;
}

void SetCamera( VECTOR* Position , CAMERA* Camera )
{
	SetCameraPositionAndAngle( *Position, Camera->VRotate, Camera->HRotate, Camera->TRotate ) ;

	return ;
}
-- move.h --

コード:

#include "DxLib.h"
#include <math.h>

void Move_w(VECTOR* Tmp);
void Move_s(VECTOR* Tmp);
void Move_a(VECTOR* Tmp);
void Move_d(VECTOR* Tmp);
void Move( VECTOR* Position );

void Move_w(VECTOR* Tmp)
{
	Tmp->z += 60.0f;

	return ;
}

void Move_s(VECTOR* Tmp)
{
	Tmp->z -= 60.0f;

	return ;
}

void Move_a(VECTOR* Tmp)
{
	Tmp->x -= 60.0f;

	return ;
}

void Move_d(VECTOR* Tmp)
{
	Tmp->x += 60.0f;

	return ;
}

void Move( VECTOR* Position )
{
	if( CheckHitKey(KEY_INPUT_W) == 1 )
	{
		Move_w(Position);
	}
	if( CheckHitKey(KEY_INPUT_S) == 1 )
	{
		Move_s(Position);
	}
	if( CheckHitKey(KEY_INPUT_A) == 1 )
	{
		Move_a(Position);
	}
	if( CheckHitKey(KEY_INPUT_D) == 1 ) 
	{
		Move_d(Position);
	}
	return ;
}
ゲーム作りはこれが初めてなので、あまり専門用語とか使わないでいただけるとありがたいです><;

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

Re: 一人称視点でのマウスでの注視点移動が、がくがく

#2

投稿記事 by h2so5 » 14年前

直接の原因かどうかは分かりませんが、
このコードだとマウスが1フレームにどれだけ動いてもカメラの移動量が一定になってしまいますね。

cururu

Re: 一人称視点でのマウスでの注視点移動が、がくがく

#3

投稿記事 by cururu » 14年前

そういわれてみればそうですね・・・。

マウスがどのくらい動いたかの距離を計算して
それをもとにどのくらい動かすかを計算する

みたいな感じに書き直してみます!

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 一人称視点でのマウスでの注視点移動が、がくがく

#4

投稿記事 by softya(ソフト屋) » 14年前

はじめまして。
どこまでが初心者向きの用語かわかりませんので、わからない用語を使っていたら聞いてください。
ソースコードを拝見しまたが、

コード:

        //カメラ制御関数の呼び出し
        int Count = 0;
        while( Count != 40 )
        {
            Camera( &PlayerCamera );
            Count ++ ;
        }
これだと毎フレーム40回、回転角を変更しています。
なので、PHI_F / DEF_CAMERA_ADD * 40で毎フレーム高速回転している事になります。
これは、何をしたかったのでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

cururu

Re: 一人称視点でのマウスでの注視点移動が、がくがく

#5

投稿記事 by cururu » 14年前

あ、直すの忘れたままコード貼り付けてました;;

一度に大きく角度を動かすからかくつくのかなと思って
一度に動かす角度を小さくして、それを高速で動かすとなめらかになるかな

と、思ってやった悪あがきです

cururu

Re: 一人称視点でのマウスでの注視点移動が、がくがく

#6

投稿記事 by cururu » 14年前

h2so5 さんの意見を反映して
camera.hを書き換えたらかなり改善されました!
ありがとうございます。

ですが、まだ、少しがくがく感が消えないんですが、これはもうしょうがないんでしょうか
たぶん、長時間やってるとめまいがしてくるような気がするんですが・・・。

改善したコード↓
--camera.h--

コード:

#include "DxLib.h"
#include <stdlib.h>
#include <math.h>

#define DEF_CAMERA_ADD (PHI_F / 360.0f)

//カメラ情報構造体
typedef struct CAMERA
{
	float VRotate;	//上下方向の回転角度
	float HRotate;	//左右方向の回転角度
	float TRotate;	//捻りの回転角度(未使用)
}CAMERA;

//プロトタイプ宣言
void Camera( CAMERA* Camera);					//カメラの総合制御関数
void MoveCamera_Right( CAMERA* Camera , int x );		//注視点を右へ
void MoveCamera_Left( CAMERA* Camera , int x );			//注視点を左へ
void MoveCamera_Up( CAMERA* Camera , int y );			//注視点を上へ
void MoveCamera_Down( CAMERA* Camera , int y );			//注視点を下へ
void SetCamera( VECTOR* Position , CAMERA* Camera );	//カメラを設置

//関数群
void Camera( CAMERA* Camera )
{
	int MousePosition_x;
	int MousePosition_y;
	int x;
	int y;

	SetMouseDispFlag( FALSE );
	
	GetMousePoint( &MousePosition_x , &MousePosition_y );

	x = MousePosition_x - 320;
	y = MousePosition_y - 240;

	if( x > 0 )
	{
		MoveCamera_Right( Camera , x );
	}
	if( x < 0 )
	{
		MoveCamera_Left( Camera , x );
	}
	if( y > 0 )
	{
		MoveCamera_Down( Camera , y );
	}
	if( y < 0 )
	{
		MoveCamera_Up( Camera , y );
	}

	return ;
}

void MoveCamera_Right( CAMERA* Camera , int x )
{
	Camera->HRotate += x * DEF_CAMERA_ADD;

	return ;
}

void MoveCamera_Left( CAMERA* Camera , int x )
{
	x *= -1;

	Camera->HRotate -= x * DEF_CAMERA_ADD;

	return ;
}

void MoveCamera_Up( CAMERA* Camera , int y )
{
	y *= -1;

	Camera->VRotate -= y * DEF_CAMERA_ADD;

	return ;
}

void MoveCamera_Down( CAMERA* Camera , int y )
{
	Camera->VRotate += y * DEF_CAMERA_ADD;

	return ;
}

void SetCamera( VECTOR* Position , CAMERA* Camera )
{
	SetCameraPositionAndAngle( *Position, Camera->VRotate, Camera->HRotate, Camera->TRotate ) ;

	return ;
}
あと、softyaさんから指摘された部分のwhile分はカットしました。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 一人称視点でのマウスでの注視点移動が、がくがく

#7

投稿記事 by softya(ソフト屋) » 14年前

1フレームで移動量を反映してしまっているからでは無いでしょうか?
数フレームかけて移動するようにしてはどうでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

cururu

Re: 一人称視点でのマウスでの注視点移動が、がくがく

#8

投稿記事 by cururu » 14年前

すいません、少し考えてみましたがわかりませんでした。。

フレームをまたがるってどのような感じで実装すればいいんでしょうか・・・

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

Re: 一人称視点でのマウスでの注視点移動が、がくがく

#9

投稿記事 by h2so5 » 14年前

cururu さんが書きました: フレームをまたがるってどのような感じで実装すればいいんでしょうか・・・
目標となるカメラ角度を記憶しておいて、
フレームごとに少しずつカメラ角度を目標値に近づけていきます。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 一人称視点でのマウスでの注視点移動が、がくがく

#10

投稿記事 by softya(ソフト屋) » 14年前

(1)現在のマウス位置から目標移動角を決める。
(2)目標移動角の1/3~1/6程度回転させる。その分目標移動角を減算する。ある程度目標移動角が0度に近くなったら0に補正。
(3)新たなマウス位置で目標移動角度を補正する。実際には(1)の処理の時に行う。
を繰り返すって感じでしょうか。動かして試してませんのでご了承ください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

cururu

Re: 一人称視点でのマウスでの注視点移動が、がくがく

#11

投稿記事 by cururu » 14年前

3フレームに一回Camera関数を呼んで
SetCamera関数への引数を1/3にしたらだいぶ良くなりました。

みなさんありがとうございます!

あと、くだらない質問なんですけど

視点→プレイヤーの目の位置
注視点→プレイヤーの見ている方向

って解釈であってますか?
自信無くて;;;

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 一人称視点でのマウスでの注視点移動が、がくがく

#12

投稿記事 by softya(ソフト屋) » 14年前

cururu さんが書きました:視点→プレイヤーの目の位置
注視点→プレイヤーの見ている方向
そういう理解で良いと思います。
あと三回に一回だと急な動きに追従できないかもしれません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

cururu

Re: 一人称視点でのマウスでの注視点移動が、がくがく

#13

投稿記事 by cururu » 14年前

そこら辺は、これから作って行く段階で
適宜改良していきたいと思います

ありがとうございました!

閉鎖

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