見出し画像

マウスドラッグでプレイヤーの周りを回転するカメラ:3Dサンプルプログラム

実装イメージ

・マウスドラッグでカメラの回転をしています。
・マウスの移動量を計算するために更新処理の最後でマウスの座標を保存しています。

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

// 度をラジアンに変換する
#define D2R(deg) ((deg)*DX_PI_F/180.0f)

// ステージモデルハンドル
int StageHandle;

// プレイヤーモデルハンドル
int PlayerHandle;
// プレイヤーの座標
VECTOR PlayerPos;
// プレイヤーの向き
VECTOR PlayerAngle;

// カメラ座標
VECTOR CameraPos;
// 注視点座標
VECTOR CameraTarget;
// カメラをどの方向に置くかの向き
VECTOR CameraAngle;

// 1フレーム前のマウス座標
int MouseOldX;
int MouseOldY;

// ==============================
// *** 初期化処理 ***
// ==============================
void Game_Init()
{
	// 3Dモデルの読み込み
	StageHandle = MV1LoadModel( "stage.mqo" );
	PlayerHandle = MV1LoadModel( "player.mqo" );

	// プレイヤー座標は原点から
	PlayerPos = VGet( 0.0f, 0.0f, 0.0f );
	// 回転なしの状態から開始
	PlayerAngle = VGet( 0.0f, D2R( 0.0f ), 0.0f );

	// カメラ座標と注視点の初期設定
	CameraTarget = VGet( 0.0f, 0.0f, -5.0f );
	CameraPos = VGet( 0.0f, 10.0f, -25.0f );
	CameraAngle = VGet( D2R( -20.0f ), 0.0f, 0.0f );
}
// ==============================
// *** 更新処理 ***
// ==============================
void Game_Update()
{
	int MouseX, MouseY;
	// マウス座標を取得
	GetMousePoint( &MouseX, &MouseY );
	// マウス左ボタンを押しているとき
	if( GetMouseInput() & MOUSE_INPUT_LEFT ){
		// 1フレーム前から今のマウス座標までの移動量を計算
		int MoveX = MouseX - MouseOldX;
		int MoveY = MouseY - MouseOldY;
		// 移動量を角度として使う
		CameraAngle.y += D2R( MoveX );
		CameraAngle.x -= D2R( MoveY );
	}

	// 注視点の座標はプレイヤー座標
	CameraTarget = PlayerPos;

	// 基準のベクトル
	VECTOR Direction = VGet( 0.0f, 0.0f, 10.0f );

	// X軸回転行列
	MATRIX MatrixX = MGetRotX( CameraAngle.x );
	// Y軸回転行列
	MATRIX MatrixY = MGetRotY( CameraAngle.y );
	// 行列の合成
	MATRIX Matrix = MMult( MatrixX, MatrixY );
	// 基準ベクトルを行列で変換
	Direction = VTransform( Direction, Matrix );

	// カメラ座標はプレイヤー座標から変換した座標を足したところ
	CameraPos = VAdd( PlayerPos, Direction );

	// 次のフレームのためにマウス座標を保存
	MouseOldX = MouseX;
	MouseOldY = MouseY;
}
// ==============================
// *** 描画処理 ***
// ==============================
void Game_Draw()
{
	// カメラの位置と注視点をセット
	SetCameraPositionAndTarget_UpVecY( CameraPos, CameraTarget );

	// ステージモデルの描画
	MV1DrawModel( StageHandle );
		
	// プレイヤーモデルの座標をセットする
	MV1SetPosition( PlayerHandle, PlayerPos );
	// プレイヤーモデルの回転値をセットする
	MV1SetRotationXYZ( PlayerHandle, PlayerAngle );
	// プレイヤーモデルを描画する
	MV1DrawModel( PlayerHandle );
}
// ==============================
// *** 終了処理 ***
// ==============================
void Game_End()
{
	MV1DeleteModel( StageHandle );
	MV1DeleteModel( PlayerHandle );
}

サンプルプログラムで記述している描画や操作関係はDXライブラリを使っていますが、DXライブラリを使わない開発でも処理としては同じような実装で動作すると思います。

いいなと思ったら応援しよう!