0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

21日目:マスコットキャラクターで学ぶ動的なオブジェクトの向き調整

Last updated at Posted at 2020-12-27

この記事はアドベントカレンダー「【VCI】テーマパーク を作ろう 」の記事です。

今回の内容

テーマパークと言えばマスコットキャラが不可欠かと思います。そのため今回マスコットキャラ「ハンバーグマ」を作成しました。

ただ、現在のままではマスコットキャラクターなのにゲスト側を向いてくれていない愛想の悪い状態になってます。
そのため、今回はこちらのキャラクターを常に自分の方向を向くようにしていきたいと思います。

今回は学ぶ技術は以下となります。
 ・オブジェクトを自分の方向を向かせる方法

Unity概要

Unityは特に複雑な設定はありません。
ただし、Room内のユーザーそれぞれの方向を向くようにしたいため、同期するSubItemでなく同期しない子オブジェクトとして作成します。
image.png

コードの作成

オブジェクトの回転はQuaternionを使用して設定します。Quaternionの使い方については以下のページを御覧ください。
 ・Quaternion
今回はLookRotationという関数を使います。

LookRotationはオブジェクトを指定の方向に向かせる関数であり、第1引数にオブジェクトの正面となるのベクトル、第2引数に上となるベクトルを指定します。
以下のようなイメージです。

今回はY軸の回転のみ考えればよいため、上となるベクトルはY方向に真上のベクトルで作成します。
正面のベクトルですが、こちらはキャラクターとアバターの位置(Y座標は無視)から計算する必要があります。
以下のようなイメージ(上からの俯瞰図)です。おそらくみなさん昔やったベクトルの引き算です。

コードは以下のようになります。

function updateAll()

  --キャラクター・アバター情報の取得
  local chara = vci.assets.GetTransform("SD_hamburgmer")
  local avatar =  vci.studio.GetLocalAvatar()
  
  -- 最初の読み込み時はGetPosition()が取れないのでチェックして弾いている
  if avatar and avatar.GetPosition() then
    local direction = avatar.GetPosition() - chara.GetPosition()

    --キャラクターの向く向きを計算
    local up = Vector3.__new(direction.x,0,direction.z)
    local forward = Vector3.up
    local lookAt = Quaternion.LookRotation(up,forward)

    --キャラクターの向きを設定
    chara.SetRotation(lookAt)
  end
end

実際に動かすと以下のようになります。

終わりに

いかがでしたでしょうか?
今回はZ軸方向は無視しましたが、アバターの身長に合わせて首の角度も変えることも出来ると思います。
また、待機用のアニメーションなどを設定するとより自然な状態に見えるのではないかと思います。、
次回の内容は未定です。

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?