【Unity】オブジェクトをターゲット方向に向かせる方法

投稿日: 2026年3月14日
対象読者: Unityで関節制御・IK・ポーズ反映を実装したいエンジニア

この記事はこんな方向け:

  • オブジェクトが思った方向を向いてくれず、LookAtLookRotation の使い分けで迷っている方
  • Z軸は向くのに、Y軸など別の軸をターゲットへ向ける方法が分からない方
  • 外積を使った骨格のポーズ反映を実装したい方

TL;DR

  • Z軸をターゲット方向に向けるには transform.LookAt または Quaternion.LookRotation が使える
  • 任意の軸(Y軸など)を向かせるには Quaternion.FromToRotation または LookRotation + オフセット回転を組み合わせる
  • 棒人間モデルへのポーズ反映には、外積(Vector3.Cross)で up ベクトルを算出するのがポイント
  • このロジックは Pose Mirror の関節回転制御に実際に使用している

はじめに:関節の向きを制御する際の課題

Unityでキャラクターやデッサン人形の関節を動かそうとすると、「Z軸をターゲット方向に向けるのは簡単だけど、Y軸を向かせるにはどうすれば?」「up ベクトルをどう決めれば意図した姿勢になる?」という壁に当たることがあります。

この記事では、transform.LookAt を起点に、任意の軸をターゲット方向に向かせる応用、さらに外積を使った棒人間のポーズ反映ロジックまで解説します。筆者はこのロジックを Pose Mirror の開発で実際に実装しています。

基礎:オブジェクトのz軸を特定の方向に向かせる

オブジェクトの正面方向(ローカルZ軸)をターゲット方向に向けるには transform.LookAtQuaternion.LookRotation といった関数を使えば簡単にできます。

transform.LookAt

最も簡単にオブジェクトのZ軸をターゲット方向に向けるには LookAt メソッドを使います。

public void LookAt(Transform target);

第1引数 の target には、振り向く対象となるターゲットの Transform を指定します。

Quaternion.LookRotation

LookRotation 関数では、Z軸をターゲット方向に向かせる際に上方向(upwards ベクトル)も指定することができます。

public static Quaternion LookRotation(Vector3 forward, Vector3 upwards = Vector3.up);
  • 第1引数 forward: オブジェクトのZ軸(前方)を向けたい方向ベクトルを指定します。
  • 第2引数 upwards: オブジェクトのY軸(上方向)をどのベクトルに合わせるかを指定します。デフォルトは Vector3.up(世界の真上)であり、オブジェクトは常に地面に対して水平にしか構えられません。

「首をかしげる」ような表現や「飛行機が旋回して斜めになる」ような動きを作りたい場合、世界基準の「上」ではなく、その時々の「自分にとっての上」となるベクトルを第2引数に指定する必要があります。

応用1:オブジェクトの任意の軸を特定の方向に向かせる

Z軸以外の軸をターゲット方向に向けたい場合はどのようにすればいいでしょうか?ここでは Y軸をターゲット方向に向ける 例を解説します。

Quaternion.FromToRotation を使う方法

最もシンプルな方法は Quaternion.FromToRotation です。「ローカルY軸(Vector3.up)がどの方向を向いてほしいか」を指定するだけで求まります。

// ターゲット方向へのベクトルを計算
Vector3 direction = (target.position - transform.position).normalized;

// ローカルY軸(Vector3.up)を direction に向ける回転を求める
Quaternion rotation = Quaternion.FromToRotation(Vector3.up, direction);
transform.rotation = rotation;

LookRotation にオフセットを加える方法

LookRotation でZ軸を向かせてから、さらに90度補正する方法もあります。

Vector3 direction = (target.position - transform.position).normalized;

// まずZ軸をtarget方向に向ける
Quaternion lookRot = Quaternion.LookRotation(direction, Vector3.up);

// Y軸がtarget方向を向くように、X軸まわりに-90度回転
transform.rotation = lookRot * Quaternion.Euler(-90f, 0f, 0f);

どちらの方法でも同じ結果になりますが、FromToRotation の方がシンプルでインテンションが明確です。

応用2:棒人間のポーズをUnityモデルに反映させる

ここまでは、ターゲット方向と上方向の2軸さえ決まればオブジェクトを向かせられる、という話でした。

ところが実際には、その2軸を簡単には定義できないケースもあります。棒人間の大腿部をUnityモデルに反映する場面で考えてみましょう。

外積の図

大腿部のターゲット方向は膝の位置なので簡単に分かります。しかし、大腿部の up ベクトルはどう定義すればいいでしょうか?

人間の直感では「足は前を向いている」とすぐ分かりますが、Unityに「直感で足を前方向に」とは指示できません。この「前方向」を数式で表すのに、外積(Cross Product) を使います。

外積を使えば、2つのベクトルと直行するベクトルを算出できます。

大腿部のUpwardsベクトル算出

大腿部と下腿部をそれぞれベクトルとして捉え、2回の外積計算で up ベクトルを算出します。

// 大腿部のターゲット方向(腰 → 膝)
Vector3 thighDir = (kneePos - hipPos).normalized;

// 下腿部のターゲット方向(膝 → 足首)
Vector3 shinDir  = (anklePos - kneePos).normalized;

// 外積① 大腿と下腿が作る平面の法線(= 膝の側方向)
Vector3 kneeSide = Vector3.Cross(thighDir, shinDir).normalized;

// 外積② 大腿方向と側方向の外積 → 大腿の「前方向」= upベクトル
Vector3 thighUp  = Vector3.Cross(kneeSide, thighDir).normalized;

// 大腿ボーンを向かせる
thighBone.rotation = Quaternion.LookRotation(thighDir, thighUp);

こうして算出した thighUpLookRotation の第2引数に渡すことで、膝の向きが自然な正面方向を保ちながら大腿部を回転させることができます。

この方式を Pose Mirror の全関節に適用することで、写真のポーズを3Dモデルへ自動反映しています。

まとめ

結局のところ、ポイントは「ターゲット方向」と「upベクトル」の2軸をいかに正しく決めるかに尽きます。

Z軸を向けるだけなら LookAtLookRotation で一瞬です。Y軸など別の軸を向けたいときは FromToRotation を使うと、コードの意図がそのまま読めます。そして、足の前後のようにupベクトルが自明でない場面では、外積(Vector3.Cross)を2回かけて「自分にとっての上」を割り出す。この考え方を全関節へ広げたものが、Pose Mirrorのポーズ反映ロジックです。


ぜひ実際のポーズ反映がどう動くか Pose Mirror で確認してみてください!

関連記事:

参考資料

← ポートフォリオ TOP へ戻る