見出し画像

斜め後ろから見るカメラ: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;

// ==============================
// *** 初期化処理 ***
// ==============================
void Game_Init()
{
	// カメラ距離設定
	SetCameraNearFar( 1.0f, 100.0f );

	// 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 );

	// カメラ座標と注視点の初期設定
	CameraPos = VGet( 0.0f, 5.0f, 0.0f );
}
// ==============================
// *** 更新処理 ***
// ==============================
void Game_Update()
{
	// 左右キーで向きの変更
	if( CheckHitKey( KEY_INPUT_RIGHT ) ){
		PlayerAngle.y += D2R( 0.5f );
	}
	if( CheckHitKey( KEY_INPUT_LEFT ) ){
		PlayerAngle.y -= D2R( 0.5f );
	}

	// 向きに合わせて座標移動
	if( CheckHitKey( KEY_INPUT_UP ) ){
		PlayerPos.x += sinf( PlayerAngle.y ) * 0.1f;
		PlayerPos.z += cosf( PlayerAngle.y ) * 0.1f;
	}

	// 基準となるカメラ座標
	VECTOR Pos = VGet( 3.0f, 3.0f, -5.0f );
	// プレイヤーのY軸回転行列
	MATRIX Matrix = MGetRotY( PlayerAngle.y );
	// 基準座標を行列で変換
	Pos = VTransform( Pos, Matrix );

	// カメラ座標はプレイヤー座標から変換した座標を足したところ
	CameraPos = VAdd( PlayerPos, Pos );
}
// ==============================
// *** 描画処理 ***
// ==============================
void Game_Draw()
{
	// カメラの位置と向きをセット
	SetCameraPositionAndAngle( CameraPos, PlayerAngle.x, PlayerAngle.y, PlayerAngle.z );

	// ステージモデルの描画
	MV1DrawModel( StageHandle );

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

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

この記事が気に入ったらサポートをしてみませんか?