MRが楽しい

MRやVRについて学習したことを書き残す

公式チュートリアル「HOLOGRAMS 210 5章」を試してみる

久方ぶりのチュートリアルお試し枠です。
今回はHolograms 210 5章 ビルボードを試します。
azure-recipe.kc-cloud.jp

3章,4章同様、同じページにまとめられていますが、一つ一つ確認します。
チュートリアルの通りに実装を進め、アプリをビルドしました。
f:id:bluebirdofoz:20170620014710j:plain
動かしてみると、宇宙飛行士がどんなに回り込もうとこちらを見るようになります。

さて、コードを確認してみましょう。宇宙飛行士にアタッチしたコードは以下です。
Billboard.cs

/// <summary>
/// The billboard logic is performed in FixedUpdate to update the object
/// with the player independent of the frame rate.  This allows the object to 
/// remain correctly rotated even if the frame rate drops.
/// </summary>
private void FixedUpdate()
{
    // Get a Vector that points from the Camera to the Target.
    Vector3 directionToTarget = Camera.main.transform.position - gameObject.transform.position;

    // Adjust for the pivot axis.
    switch (PivotAxis)
    {
        case PivotAxis.X:
            directionToTarget.x = gameObject.transform.position.x;
            break;

        case PivotAxis.Y:
            directionToTarget.y = gameObject.transform.position.y;
            break;

        case PivotAxis.Free:
        default:
            // No changes needed.
            break;
    }

    // Calculate and apply the rotation required to reorient the object and apply the default rotation to the result.
    gameObject.transform.rotation = Quaternion.LookRotation(-directionToTarget) * DefaultRotation;
}

以前、以下の記事でカメラに対して正面を向かせ続けるコードを確認しました。
bluebirdofoz.hatenablog.com

これは更にX軸方向もフォローした他、Inspectorからの変更も可能にした改良版といったところですね。

ヒューマノイドアバターのボーン構造を取得でき……なかった

おいかけっこアプリの修正兼、技術調査枠です。

モデルとコンポーネントの切り分けによってモデルの差し替えが容易になったおいかけっこアプリですが。
まだ一点、モデルの取り込み後、視線追従コンポーネントに以下の設定を行う作業があります。
f:id:bluebirdofoz:20170619003119j:plain

これも自動化できないかと思い、調査してみました。
ヒューマノイドアバターにはHumanDescriptionという設定が行われており、ここでオブジェクトと共通化された関節名とのマッピングが行われています。
japan.unity3d.com
docs.unity3d.com

つまり、このマッピングを動的に取得できれば、モデルの首や頭がどのゲームオブジェクトであるか分かるという事です。
意気揚々と色々調べてみましたが。。

既に生成されたアバターからhumanDescriptionを取り出す方法が見つかりませんでした。
docs.unity3d.com

そもそも動的にアバターを変更することが推奨されていないので、あえて隠蔽されているのかもしれません。
docs.unity3d.com

すると動的にモデルを差し替えるには、アバターは変えずにメッシュやボーンの方を差し替えるべきということでしょうか。
MMDモデルに限定すれば、これは実現可能ですが、流石にユニティちゃんとMMDモデルの差し替えでこれをやるのはかなりの労力が必要です。

ただ今回はアバターに変更を加えたい訳ではなく、首と頭のオブジェクト参照が欲しいだけなので強引に取得プログラムを組んでみました。
・BoneCollector.cs

  /// <summary>
  /// ヘッドボーンオブジェクトの取得
  /// </summary>
  /// <returns>ヘッドボーンオブジェクト</returns>
  private GameObject GetHeadBoneName()
  {
      GameObject boneObject = null;

      // モデル配下のトランスフォームを再帰的に取得
      Transform[] transformArray = p_ModelObject.GetComponentsInChildren<Transform>();

      Transform boneTransform = null;
      // ユニティちゃんモデルの場合
      if (boneTransform == null)
      {
        foreach(Transform child in transformArray)
        {
          if (child.name == "Character1_Head")
          {
            boneTransform = child;
          }
        }
      }
      // MMDモデルの場合
      if (boneTransform == null)
      {
        foreach (Transform child in transformArray)
        {
          if (child.name == "頭")
          {
            boneTransform = child;
          }
        }
      }

      // ゲームオブジェクトを取得
      if (boneTransform != null)
      {
        boneObject = boneTransform.gameObject;
      }

      return boneObject;
  }

名前を決め打ちでオブジェクトを取得します。
アバターからマッピングが取れれば、決め打ちする必要はないのですが……今後の課題です。

これにより、モデルの差し替えが非常に楽になりました。
f:id:bluebirdofoz:20170619003233j:plain
unitychanオブジェクトと同じ階層に、MMDモデルの変換オブジェクトを投入します。
f:id:bluebirdofoz:20170619003252j:plain
モデルマネージャのターゲットオブジェクトを差し替えるだけで……。
f:id:bluebirdofoz:20170619003346j:plain
見事、MMDモデルがゲームの操作キャラクタになりました。
うむ、簡単。これなら前回調査したAssetBundleと組み合わせての読み込み実行も難しくないかも。

ボーンの自動取得も正常に動作し、ちゃんと視線追従もしてくれています。
f:id:bluebirdofoz:20170619003424j:plain
ボイスコントローラも切り分けたので、MMDモデル用の音声コントローラオブジェクトを用意すれば、同じ要領で声の差し替えも可能です。

Unityに設計おけるクラス設計を考える その12(モーションとボイス)

今週末はおいかけっこアプリの修正を実施していました。
Presenterを改修して、ゲームUIからの通知をより簡潔にした他、以前言っていたモーションとボイスの切り分けを実施しました。
bluebirdofoz.hatenablog.com

修正により、unitychanモデルの配下にぶら下がるコンポーネントが無くなったため、モデルの差し替えがより簡単に行えます。
f:id:bluebirdofoz:20170618231744j:plain
またモーションとボイスが別になったため、同じモーションでボイスを変えることで新しいアクションを作成できます。
またモデルを差し替えた際、キャラ音声のオブジェクトを差し替えることで声を変えると言ったことができるようになりました。

ただ、モーションは状態を移行できる場合とできない場合があるため、モーションとボイスの関係は完全には切り離せていません。
うーむ。良くはなっているハズですが、まだまだすっきりしません。

Blenderで3Dモデルを作成する(かんたん講座編その9)

3Dモデリングの学習枠です。今回はアニメーションの設定です。
・かんたんBlender講座(アニメーション)
 http://krlab.info.kochi-tech.ac.jp/kurihara/lecture/cg/BlenderWeb_Hayashi/html/animation.html

講座をその通りに作業しているだけなので特筆することはありません。
上手くいかなくて当然と思いつつ作業していても、完成に近づくにつれ、色々荒が目立ちだして辛い。

ともあれ、本日中にアニメーションの設定が完了しました。
f:id:bluebirdofoz:20170616023914j:plain
キャラクタが画面外から歩いてきてお辞儀をします。
f:id:bluebirdofoz:20170616023921j:plain
そして、その場でクルッと一回転します。
f:id:bluebirdofoz:20170616023929j:plain
大変な作業ではありますが、思った以上に大変ではないというか、ツールが至れり尽くせりというか。
教本ありとは言え、ここまでのアニメーション付けが3時間弱でできちゃいます。

ただ一方で、拘りだすと、大変そうな感じはヒシヒシと感じます。

Blenderで3Dモデルを作成する(かんたん講座編その8)

3Dモデリングの学習枠です。今回は背景のモデリングを行います。
・かんたんBlender講座(背景)
 http://krlab.info.kochi-tech.ac.jp/kurihara/lecture/cg/BlenderWeb_Hayashi/html/background.html

記事に素材の取得先がないので、以下から取得しました。
www.photock.jp

途中、バンプマッピングの意味がイマイチ分からず。
f:id:bluebirdofoz:20170615002322j:plain

以下の記事が分かりやすいです。簡単に3Dモデルのクオリティを向上させる小技といったところでしょうか。
marina.sys.wakayama-u.ac.jp

空を作成し、カメラを設定して完了。
レンダーモードにして確認してみると…。
f:id:bluebirdofoz:20170615002342j:plain
完成ですが、キャラが何かコワい。
うーむ、ポリゴンの丸みの作成が下手なのと、UV展開でのテクスチャの歪みを掴み切れていなかったことが原因っぽい。

あくまで3Dモデリングの練習が目的なので修正は行わず、ここで3Dモデリングは完了となります。
次はアニメーションですね。

Blenderで3Dモデルを作成する(かんたん講座編その7)

本日は3Dモデリングの学習枠です。前回、ボーンの設定を行ったところからの続きです。
bluebirdofoz.hatenablog.com

前回ではIK制御ボーンを設定しませんでしたが、やはり知識としては知っておいた方が良いと思い、設定することにしました。
・かんたんBlender講座(ボーン)
 http://krlab.info.kochi-tech.ac.jp/kurihara/lecture/cg/BlenderWeb_Hayashi/html/bone.html

そもそもIK制御ボーンってどういう役割のもの?という疑問には以下ページが図解が多く分かりやすかったです。
・ボーンひとつで足をコントロールするリグを組む
 http://dskjal.com/blender/leg-rig.html


さて講座の説明に従い、IK制御ボーンの設定を行いました。
f:id:bluebirdofoz:20170614022014j:plain

試しに動かしてみると。
f:id:bluebirdofoz:20170614022027j:plain
おお、それっぽい動きをします。成功です。

しかし、私自身は講座の説明に従っただけで各設定がボーンに一体どのような効果を及ぼしているのか理解できていません。
詳細は本を読むか、より詳しく調べるかする必要があります。今はひとまず、このような技術がある程度の認識で留めておきます。


そして裏では再び、おいかけっこアプリの再設計を実施中です。
実際に他の3Dモデルを取り込んでみると、まだまだデータとロジックの切り分けに気になる点が出てきます。
キャラクタをユニティちゃんと同じように動かすには、モデルを取り込み後、まだまだ幾つか手動でコンポーネントを設定する必要がある状況です。
f:id:bluebirdofoz:20170614022045j:plain
特にアニメーションが共通化できることが分かったので、そこをモデルと上手く切り分けたいところ。

Blenderで3Dモデルを作成する(かんたん講座編その6)

本日は3Dモデリングの学習枠です。
日が空いてしまいましたが、前回は3Dモデルのモデリングとテクスチャ作成が完了したところからの続きです。
bluebirdofoz.hatenablog.com

本日の課題はボーンの設定となります。かんたん講座の以下ページを参考に実施します。
・かんたんBlender講座(ボーン)
 http://krlab.info.kochi-tech.ac.jp/kurihara/lecture/cg/BlenderWeb_Hayashi/html/bone.html

講座ページの説明は結構ざっくりなので詳細は下記を参照します。
yugalab.sakura.ne.jp

ボーンの設定を行いました。
f:id:bluebirdofoz:20170613014303j:plain

試しにポーズモードでボーンを動かしてみます。
f:id:bluebirdofoz:20170613014751j:plain
ここだけ見ると何だかホラーチックですが、キャラクタのテクスチャがボーンに追従して動いてくれています。
ボーンの設定はこれで完了です。

それっぽくウェイト付けもしてみましたが、この辺りの解は経験で覚える必要がありそうです。
f:id:bluebirdofoz:20170613015012j:plain

IK制御ボーンについては今回は未設定としています。