頭の位置に帽子をのせる
ここでは、Asset Storeから3Dオブジェクトをダウンロードし、カメラで映った自分の頭の位置にその3Dオブジェクトを表示してみます。まず、Window > Asset Storeを洗濯します。
すると、シーンビューの位置にAsset Storeタブが表示されます。まずは、「hat」というキーワードで検索し、PricingのFree Assetsの項目にチェックを入れましょう。
ここでは、 「Free Christmas Assets / Low Poly」を選んでダウンロードし、さらにインポートしてください。
すると、Import Unity Packageという画面が出てきますので、以下のように帽子のパーツだけインポートします。
これでインポートが完了しました。Christmas-Assets-Free > Prefabsに、Santa-Hatがあるので、ヒエラルキーウィンドウにドラッグしてインスタンス化します。さらに空のオブジェクト(Hatに名称変更)を作ってその中に入れます。
Santa-Hatの位置とサイズを変更しましょう。Hatが親オブジェクトで、Santa-Hatが子オブジェクトになります。親オブジェクトの位置やサイズを変えても、プログラムに反映されないので気をつけてください。
ExpressionManagerのスクリプトにHeadというゲームオブジェクト型の変数を追加します。Mouthの下がいいでしょう。
1 2 3 4 5 | [SerializeField] private GameObject Mouth; //口用インスタンス [SerializeField] private GameObject Head; //頭用インスタンス |
FaceAddedメソッド内でHead.SetActive()をtrueにします。
1 2 3 4 5 6 7 8 9 | void FaceAdded(ARFaceAnchor anchorData) { <中略> Head.SetActive(true); <中略> } |
FaceUpdatedメソッド内で以下のコードを追加します。if (Mouth.activeSelf…の後がいいでしょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | void FaceUpdated(ARFaceAnchor anchorData) { <中略> if (Mouth.activeSelf != anchorData.isTracked) { Mouth.SetActive(anchorData.isTracked); } if (Head.activeSelf != anchorData.isTracked) { Head.SetActive(anchorData.isTracked); } <中略> } |
FaceRemovedメソッドにHead.SetActive(false)を追加します。
1 2 3 4 5 6 7 8 | void FaceRemoved(ARFaceAnchor anchorData) { <中略> Head.SetActive(false); <中略> } |
UpdatePositionAndRotationメソッドに以下のコードを追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 | private void UpdatePositionAndRotation(ARFaceAnchor anchorData) { if (anchorData.isTracked) { <中略> //頭の位置と回転//////////////////////////////////////////////////////////////////// Head.transform.localPosition = UnityARMatrixOps.GetPosition(anchorData.transform); Head.transform.localRotation = UnityARMatrixOps.GetRotation(anchorData.transform); <中略> } } |
最後に、ヒエラルキーウィンドウでExpressionManagerを選び、インスペクタのHeadにHatをドラッグ&ドロップします。
プログラムを実行すると、サンタの帽子が追加されていることを確認できます。