2013年3月6日水曜日

AI開発&クォータニオン入門~5.回転を組み合わせる


関連記事

では例のごとく、Unity Gemsからの翻訳をどうぞ!

----------------

回転を組み合わせる


ここまでの例で Zzzzzz の表示は退屈だったかもしれないが、ここでは一歩進んでクォータニオンの組み合わせをどうするか見て行くことにする。Zzzzzz 記号が上方向に流れながら徐々に回転する様子を見て行く。ここで意味していることは、カメラの方向は向いているけど、画面上をゆっくりとスピンする動作とする。

チュートリアル シーン7

この回転を得るために新しく SpinAroundForward スクリプトを作成する。
using UnityEngine;
using System.Collections;

public class SpinAroundForward : MonoBehaviour {

    Transform _transform;
    float _rotatingFactor;

    void Start()
    {
        _transform = transform;
        _rotatingFactor = 0.2f + (Random.value * 0.8f);
    }

    // Update is called once per frame
    void Update () {
        _transform.rotation = _transform.rotation * Quaternion.AngleAxis(Time.deltaTime * 20 * _rotatingFactor, Vector3.forward);
    }
}
このスクリプトは、Startの際に新規の回転の係数をランダム作成して、Updateの際にそれを適用する。

オブジェクトの現状の回転を Vector3.forward の周りの回転とどう組み合わせていくかの様子を見ることが出来る。* 演算子を用いて Zzzzzz の現在の回転と組み合わせることが出来る。

もしチュートリアル シーンでこのスクリプトを実行する場合、テキストは回転するけどカメラの方向を向いてないことが分かる。これには理由がある: ReverseCameraDirection スクリプトがオフになるからだ。もし Sleeping Text 3をクリックして ReverseCameraDirection を有効化すると今度は Zzzzzz ごカメラを向くが回転しないことが分かる。これは Transform ベクトルを直接に値変更するときにハマりやすいことだ。回転の組み合わせがグチャグチャになる。目的どおりにやりたい場合は別のアプローチが必要だ。

チュートリアル シーン8

シーン8 では ReverseCameraDirection にてクォータニオンを使用するように書き換えた AdjustForwardToPointToCamera と置き換える。
using UnityEngine;
using System.Collections;

public class AdjustForwardToPointToCamera : MonoBehaviour {

    Transform _transform;
    Transform _cameraTransform;

    // Use this for initialization
    void Start () {
        _transform = transform;
        _cameraTransform = Camera.main.transform;
    }

    // Update is called once per frame
    void Update () {
        _transform.rotation = Quaternion.FromToRotation(_transform.forward, _cameraTransform.forward) * _transform.rotation;
    }
}
Quaternion.FromToRotationは調整が必要なベクトルがある場合に強力だ。これを使ってオブジェクトが配置されている物体の表面に合わせて回転させて、例えばそれが表面の法線と並ばせることが出来る。このケースでは Zzzzzz の transform.forward の回転を調整させてカメラのtransform.forwardと一致させることが出来る。

繰り返しになるが、メッシュは逆向きに反転していることを学習すべきだ。通常のオブジェクトの場合、オブジェクトの transform.forward を - transform.forward としないとカメラ方向を向かない。

作成したクォータニオンを前方向に回転させていたものに加えて、正しい角度と現在の回転 (SpinAroundForward スクリプトによりさらに変更されているもの) を組み合わせて完成だ。カメラが正しい方向を向いて、回転して Zzzzzz がついている (ようやくここまで来た!)。
-----
次に続くぜ!


関連記事

0 件のコメント:

コメントを投稿

ブックマークに追加

このエントリーをはてなブックマークに追加

自己紹介

自分の写真
Unity3D公式マニュアル翻訳やってる人がスマホ(iPhone, Android)のゲーム開発しています。気軽に面白く初心者が遊べる内容がモットー。Blogでは開発情報をひたすら、Twitterではゲーム作成の過程で参考にしている情報を中心につぶやきます

ページビューの合計

過去7日間の人気投稿