見出し画像

マウスホイールの回転でカメラ座標を変更: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;
// カメラ座標までの距離
float CameraLength;

// ==============================
// *** 初期化処理 ***
// ==============================
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( 180.0f ), 0.0f );

	// カメラ座標と注視点の初期設定
	CameraTarget = VGet( 0.0f, 1.0f, 0.0f );
	CameraPos = VGet( 0.0f, 10.0f, -25.0f );
	CameraLength = 10.0f;
}
// ==============================
// *** 更新処理 ***
// ==============================
void Game_Update()
{
	// マウスホイール回転量を距離に加える
	CameraLength += GetMouseWheelRotVol();
	// 基準のベクトル
	VECTOR Direction = VGet( 0.0f, 1.0f, -2.0f );
	// 正規化して
	Direction = VNorm( Direction );
	// その長さのベクトルにする
	Direction = VScale( Direction, CameraLength );
	// カメラ座標は注視点から変換した座標を足したところ
	CameraPos = VAdd( CameraTarget, Direction );
}
// ==============================
// *** 描画処理 ***
// ==============================
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ライブラリを使わない開発でも処理としては同じような実装で動作すると思います。

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