ゲーム開発では、敵キャラクターがプレイヤーの方向を向いて動く、
いわゆる「ターゲット追尾」の動きをよく作るかと思います。
本記事では、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 を使うことで、複雑な回転計算をシンプルに処理できるのがポイントです。
このコードを使ってモデルを描画したりするときには、これ以外にもいろいろ手順を踏む必要がありますが
ここではプレイヤーと敵の座標から角度を求めて、クォータニオンで回転させるための下準備に当たる部分を紹介しました!