2014年7月21日月曜日

Unity+diveで視線の角度に合わせて、特定のオブジェクトにカメラを向け続ける

Unity+diveで「踊っている初音ミクさんを好きな角度から見ることができるAndroidアプリ」を開発しました。
https://play.google.com/store/apps/details?id=com.mypaceengine.mmdtest&hl=ja 
このアプリで使用している「特定の座標を中心に視線の角度に合わせて、カメラを移動するアルゴリズム」は以下をご参照ください。ちなみにこの例ですと座標(0,0.9,0)を中心としています。

適用方法は下記です。
①diveをAssetとしてUnityにImport
②「Open Dive Sensor(Script)」を追加する。
③ScriptのOpenDiveSensorを開き、それぞれ下記のように追記する。

 フィールドへ下記を追記
//カメラの回転角の格納
Quaternion rot;

void Start ()に下記を追記
//カメラの回転角を取得
rot=Quaternion.identity;

void Update ()に下記を追記
//カメラの回転角を反映
transform.rotation = rot;
//カメラのデフォルトの高さを0.9、上下の半径は1.2として、カメラの高さ(Y座標)を演算
float yp=(float)(0.9+(UnityEngine.Mathf.Sin(rot.eulerAngles.x* UnityEngine.Mathf.Deg2Rad)*1.2));
//球の平行の半径は1.6とし、カメラの高さに合わせて、球の平面円の半径を演算
float hankei=(float)(UnityEngine.Mathf.Cos(rot.eulerAngles.x* UnityEngine.Mathf.Deg2Rad)*1.6);
//半径とカメラの角度からX座標を演算
float xp=(float)(UnityEngine.Mathf.Sin(-rot.eulerAngles.y* UnityEngine.Mathf.Deg2Rad)*hankei);
//半径とカメラの角度からZ座標を演算
float zp=-(float)(UnityEngine.Mathf.Cos(-rot.eulerAngles.y* UnityEngine.Mathf.Deg2Rad)*hankei);
//カメラにXYZ座標を設定
transform.position=new UnityEngine.Vector3(xp,yp,zp);

移動しているオブジェクトに追従する場合は、追従したいオブジェクトのXYZ座標を(xp,yp,zp)に足しこめば、実現できます。

2 件のコメント:

  1. コメントと質問失礼いたします。
    この手のスクリプトなどは全くの初心者なので頓珍漢な質問だったら申し訳ないのですが、フィールドへの追記で
    //カメラの回転角の格納
    Quaternion rot;
    と追記すると、rotの部分に赤い波線が付き、エラーになってしまい、unityに戻って再生ボタンを押しても動かなくなってしまいました。
    これは追記している場所が間違えているのでしょうか。
    他の二つは追記場所が分かったのですが...
    面倒な質問で大変申し訳ないのですが、教えていただけると幸いです。
    よろしくお願いします。

    返信削除
  2. おそらくUnityの画面上になぜ波線が出ているの理由が表示されていると思います。その理由が難しい場合はGoogle検索してみてください。C#の書き方の勉強になりますよ。

    返信削除