LoginSignup
5
6

More than 5 years have passed since last update.

オブジェクトを進行方向に前傾させる

Last updated at Posted at 2015-08-06

オブジェクトを向いている方向に傾けたい

まず一般的(?)なドローンを想像して欲しい。4つの羽で飛ぶあれだ。
あれはホバリングするだけならば地面に対して水平方向を向いているが、移動する場合は移動する方向に傾く。
また、移動速度によって傾きも変わる。
今回はそんな感じの物を実装したいと思います。

何をするか

今回必要な情報は"移動方向のベクトル"、その中でも必要なのは"X方向"と"Z方向"のみになります。
それで得られた情報にほんの少し手を加えるだけで、良い感じの傾きを得る事が出来ます。

書いてみた

ForwardTilt.cs
using UnityEngine;
using System.Collections;

public class TestRotater : MonoBehaviour {
    // X方向のベクトル
    [SerializeField, Range(-5f, 5f)]
    float vectorX = 0f;

    // Z方向のベクトル
    [SerializeField, Range(-5f, 5f)]
    float vectorZ = 0f;

    // 傾きベクトルの調整値
    [SerializeField, Range(1f, 10f)]
    float devideNum = 5f;

    // Update is called once per frame
    void Update () {
        // 向きベクトルから縦の傾きを得る
        float y = Mathf.Pow ((vectorX*vectorX)+(vectorZ*vectorZ), 0.5f) / devideNum;
        Vector3 tiltVector = new Vector3(vectorX, -y, vectorZ);

        // 回転をかける
        transform.rotation = Quaternion.Slerp (transform.rotation,
                                               Quaternion.LookRotation(tiltVector - transform.position),
                                               0.1f);
    }
}

解説

手続きを簡単に説明しますと、以下の様になります。

  1. vectorXvectorZからベクトルの大きさ(仮にvectorLengthと置きます)を取得。
  2. vectorLengthdevideNumで割り、傾きのベクトルとなるtiltVectorのYを作成。
  3. tiltVectortransform.positionで引くと向いて欲しい座標を取得できるので、これをクォータニオンに変換。
  4. Sleap()でゆっくり回転させる。

vectorLengthdevideNumで割っているのは傾きベクトルのYがとてつもなく大きい数字になるのを防ぐためです。
devideNumの値が大きければ傾きは小さくなり、小さければ大きくなります。

5
6
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
5
6