Unity
クォータニオン
回転
座標値

Unityで座標値からその方向を向く回転を取得する

bbb.gif

これは、緑のキューブが赤い球体を向くような回転を取得し、それを青いシリンダーに適用するプログラムです。
つまり、赤い球体の座標値を向くような角度を求める方法が書かれています。

これをすべての関節に対して行った結果が
https://qiita.com/romaroma/items/ffbdae4ecfc4c8ff31cd
の記事に示すようになります。

このプログラムを動かすには、下のプログラムを空のゲームオブジェクトにアタッチして
インスペクタに適当な3Dオブジェクトをアタッチしてください。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SimplePos2Rot : MonoBehaviour
{
    // 緑のキューブが赤い球体を向くような回転を取得し、それを青いシリンダーに適用するプログラム。
    public Transform red_sphere;
    public Transform green_cube;
    public Transform blue_cylinder;

    Quaternion init_rot; // 緑のキューブが赤い球体を向くような初期状態での回転。
    // 単位クォータニオン(x,y,z,w)=(0,0,0,1)になるのは、緑のキューブからみて、z軸性の方向に赤い球体がある場合のみ。この場合のみ、init_rotを保存しておいて、逆クオータニオンを計算する必要はない。

    // Use this for initialization
    void Start () {
        // Quaternion.LookRotation(方向ベクトル)で、その方向ベクトルに向けるための回転を取得する。
        init_rot = Quaternion.LookRotation(red_sphere.position - green_cube.position);
        print("初期のクオータニオン " + init_rot);
        print("初期のオイラー角度[度] " + init_rot.eulerAngles);
    }

    // Update is called once per frame
    void Update ()
    {
        Quaternion q = Quaternion.LookRotation(red_sphere.position - green_cube.position);
        print("q: " + q);

        // クオータニオン同士の掛け算は、回転を加えることを意味する。ここでは、初期クオータニオンのインバース(逆)をかけることによって、
        // 初期回転状態からの差分の回転を取得している。
        Quaternion qq = q * Quaternion.Inverse(init_rot);
        print("qq: " + qq);
        print("qq[オイラー角度]: " + qq.eulerAngles); // 初期状態からどのぐらい回転したかをオイラー角度でprintする。

        blue_cylinder.rotation = qq; // 青いシリンダーに回転を適用させる。
    }
}