Unity+VuforiaでAR開発-画像マーカーの周りを回転するオブジェクト

jal_ar_rotate_topimage

UnityでAR 検証2回目

今回の目標は
「画像マーカーに2つのオブジェクトを出して、1つは固定もう1つは周りを回転」
です。

画像マーカーを認識して表示させたオブジェクトを個別にコントロールしたいという目的です。

早速検証を始めます。

前回の検証の環境を引き継ぐので、まだ読んでない方は是非よんでみてください。


2つのオブジェクトを表示


今回も画像マーカーは「JAL都道府県シール」を使います。
ただ、検証で使い続けるとボロボロになってしまうので等倍でコピーしました。

都道府県シール大阪


ImageTarget_Osaka に表示したいオブジェクトを2つ配置しました。

imageTarget_osaka

実行します。


とりあえず2つ同時に表示されました。

せっかく大阪の都道府県シールを使っているので、雰囲気を出したくて通天閣を配置しました。

2オブジェクトを表示

localPositionでオブジェクトのポジションを変更

紫のボールのポジションを変更したいと思って、transformのpositionを変更してみます。

紫のボール「ar_testball01」にアタッチしたスクリプトの void Start()に書きました。

void Start()
    {
        
        Vector3 tf_Pos = new Vector3(1.0f, 0.0f, 0.0f);
        this.GetComponent<Transform>().position = tf_Pos;
        
    }

あれ? 表示されない

表示されない

紫のボールのtransformを見てみたら Xが16.8 とか見たこともない数値の所にいってました。

ワールド座標x

そうです

this.GetComponent<Transform>().position

だとワールド座標になってしまいます。

this.GetComponent<Transform>().localPosition

ローカル座標 “localPosition”に修正しました。

void Start()
    {
        Vector3 tf_Pos = new Vector3(1.0f, 0.0f, 0.0f);
        this.GetComponent<Transform>().localPosition = tf_Pos;
    }

きちんと近くに表示されました。

表示された

vuForiaのターゲットマーカーを使ったARの場合はカメラがワールド座標の0地点です。

カメラの位置を変更すると 画像マーカー・imageTarget の空間内での位置は変わりませんがtransformの数値はカメラの位置に合わせて変わります。

あくまでもワールド座標の0地点はカメラの位置なので。

この紫のボールはローカル座標で配置しました。
この場合のローカル0地点は 画像マーカー・ImageTarget_Osaka です。

Vector3 tf_Pos = new Vector3(1.0f, 0.0f, 0.0f);

ImageTarget_OsakaからXが1.0の位置に配置しました。

.Rotate()でオブジェクトを回転


紫のボールを自転させようと思います。

void Update()
{
    Vector3 tf_Rotate = new Vector3(0.0f, 3.0f, 0.0f);
    this.GetComponent<Transform>().Rotate(tf_Rotate);
}

Rotate()は今の角度に数値を加算してくれるので、Update()に書くと回ってくれるはず。

変更された座標で自転しています。

自回転

RotateAround()で画像マーカーの周りを回転

通天閣の周りをクルクル回らせようとおもいます。

public GameObject imageTarget_Osaka;

void Start()
{
    Vector3 tf_Pos = new Vector3(1.0f, 0.0f, 0.0f);
    this.GetComponent<Transform>().localPosition = tf_Pos;
}

void Update()
{
    Vector3 tf_Rotate = new Vector3(0.0f, 3.0f, 0.0f);
    this.GetComponent<Transform>().Rotate(tf_Rotate);
    this.transform.RotateAround(imageTarget_Osaka.transform.position, transform.up, 45 * Time.deltaTime);

}

回転軸を指定して回転させたい時は

RotateAround(回転の中心点,回転軸,角度)

で出来るはずなので

this.transform.RotateAround(imageTarget_Osaka.transform.position, transform.up, 45 * Time.deltaTime);

固定されている通天閣の位置はimageTarget_Osakaのtransformで取得すれば良いので

public GameObject imageTarget_Osaka;

imageTarget_Osaka.transform.position

とimageTarget_OsakaのGameObjectを取得して、transform.positionで回転の中心にしました。

実行します。

自回転しながら通天閣の周りを回っています。

周回転

UnityでAR マーカーに追従しないでその場に留まるオブジェクト[vuforia]

まとめ

実はpositionを変更して表示するところで結構迷いました。

ワールド座標になってる事はすぐに分かったんですが、個人的に納得いかなくてゴチャゴチャやってました。

マーカーを認識して表示したオブジェクトのtransformをコントロールしたい場合は、とりあえずローカル座標ですね。

ローカル座標に表示出来てしまえば、後は通常のUnityの要領で進められそうです。

それでは今回の検証は終わりです。
まだまだ検証は勧めていきます。

関連記事:
UnityでAR 2つのマーカーの距離に応じてスケールが変化するオブジェクト[vuforia]


Unity+VuforiaでAR開発-画像マーカーで複数のオブジェクトを表示させる