【Unity】オブジェクトをターゲット方向に向かせる方法
投稿日: 2026年3月14日 対象読者: Unityで関節制御・IK・ポーズ反映を実装したいエンジニア
この記事はこんな方向け:
transform.LookAtやQuaternion.LookRotationの使い分けが分からない方- Z軸以外の軸をターゲット方向に向けたい方
- 外積を使って骨格のポーズ反映を実装したい方
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.LookAt や Quaternion.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つのベクトルと直行するベクトルを算出できます。
大腿部と下腿部をそれぞれベクトルとして捉え、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);
こうして算出した thighUp を LookRotation の第2引数に渡すことで、膝の向きが自然な正面方向を保ちながら大腿部を回転させることができます。
この方式を Pose Mirror の全関節に適用することで、写真のポーズを3Dモデルへ自動反映しています。
まとめ
- Z軸をターゲットに向ける:
transform.LookAtまたはQuaternion.LookRotationが最短 - 任意の軸(例:Y軸)をターゲットに向ける:
Quaternion.FromToRotation(Vector3.up, direction)がシンプル - up ベクトルが自明でないケース:外積(
Vector3.Cross)を2回使って up ベクトルを計算する - 骨格制御の実装では「ターゲット方向 + up ベクトル」の2軸を正しく決めることが精度の鍵
ぜひ実際のポーズ反映がどう動くか Pose Mirror で確認してみてください!
関連記事:
- 【Unity WebGL】MediaPipeで3Dポーズを動かす — SendMessage連携と関節制御の全体像
- Pose Mirror開発で詰まった5つの問題と解決策 — 実装中に詰まったポイント集