0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ゲームでキャラクターとかがプレイヤーの方向を向く処理を実装してみた

Posted at

ゲーム開発では、敵キャラクターがプレイヤーの方向を向いて動く、
いわゆる「ターゲット追尾」の動きをよく作るかと思います。

本記事では、DirectXTKを使って、「キャラがプレイヤーの方向を向く処理」を簡単に実装する方法を紹介します。

処理の流れ

今回の実装では、以下の手順でキャラクターの回転を計算します

・プレイヤーとの相対的な角度を計算する
自分(キャラクター)からプレイヤーがどの方向にいるのかを求めます。
→ 目標地点への方向を示す角度を計算します。

・クォータニオンで回転を設定する
計算した角度を元に、回転を表すデータを作りますYaw の回転のみ使用)。

・オブジェクトの回転に適用する
最終的に、回転を自分のキャラクターに設定します。

実装コード

以下は、DirectXTK の SimpleMath を使ったコード例です。
まず、プレイヤーの方向を計算する関数を作ります。

#include <SimpleMath.h>   // DirectXTK の簡易計算用クラス
#include <DirectXMath.h>  // DirectXMath の基本機能
#include <cmath>          // 数学関数(atan2)


// eye から target への角度を計算する関数
inline float CalculateAngle(const DirectX::SimpleMath::Vector3& eye,
	const DirectX::SimpleMath::Vector3& target)
{
	// 目標への方向ベクトルを計算
	DirectX::SimpleMath::Vector3 direction = target - eye;

	// ベクトルを正規化(方向だけを抽出)
	direction.Normalize();

	// X-Z 平面上での角度を計算
	float angle = std::atan2(direction.x, direction.z);

	return angle;
}

この関数を使うと、自分(キャラクター)からプレイヤーの方向への角度を求めることができます。
次に、この関数を利用してキャラクターの回転を設定します。

// プレイヤーを向くための回転設定
m_rotation = DirectX::SimpleMath::Quaternion::CreateFromYawPitchRoll(
	CalculateAngle(m_position, playerPos), // Yaw(ヨー:左右の回転)
	0.0f,                                  // Pitch(ピッチ:上下の回転)
	0.0f                                   // Roll(ロール:傾き)
);

結果と応用例

このコードを適用すると、例えば以下のような動きを実現できるかと思います:

・敵キャラクターがプレイヤーの方向を向く
・銃口がプレイヤーを狙うように回転する
・カメラがプレイヤーを追いかける

まとめ

この方法を使うと、簡単に「ターゲット方向を向く動き」が実現できます!
特に、DirectXTK の SimpleMath::Quaternion を使うことで、複雑な回転計算をシンプルに処理できるのがポイントです。

このコードを使ってモデルを描画したりするときには、これ以外にもいろいろ手順を踏む必要がありますが
ここではプレイヤーと敵の座標から角度を求めて、クォータニオンで回転させるための下準備に当たる部分を紹介しました!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?