這個發現倒是挺讓人開心的,因為要在Unity中要把動畫中的模型關節獨立出來運作,這是專業版限定而且能控制的關節不多,既然插件的作者Nora連Script都幫大家寫好了,那就不客氣地拿來玩,首先成品在這裡,讓模型可以一直盯著攝影機看就是這次要做出來的結果。
首先在攝影機控制上使用Character Controller Package內的Mouse Look.cs再加以修改,如何修改另外一篇再談,下一段只大略的提一下攝影機的部分。
先在模型頭部位置新增CameraTarget空物件,將Main Camera加入拍攝目標物CameraTarget之下,再將Mouse Look.cs也加入CameraTarget下,最後針對旋轉做角度上的限制,這樣就可以做出Main Camera保持在前方而且拍攝模型頭部的效果。
接著進入模型骨架角度的控制,在CameraTarget下新增腳本(CameraLookAt.cs),以及新增兩個變數:
1. GameObject head是要控制的關節,在這裡是模型下59.joint_Head。
2. Camera mainCamera就是已經加入CameraTarget下的攝影機,這裡就直接用一開始場景預設的Main Camera。
剩下的變數是做表情控制的,在這裡一樣先保留之後再談。
using UnityEngine; using System.Collections; using UnityEngine.UI; public class CameraLookAt : MonoBehaviour { public GameObject head; private Vector3 originVector; private Vector3 newVector; private Vector3 angle; public Camera mainCamera =new Camera(); void Start () { originVector = mainCamera.transform.position - head.transform.position;////(1) } void Update () { newVector = mainCamera.transform.position - head.transform.position;////(2) float angleX = Vector3.Angle(originVector, new Vector3(0,newVector.y,newVector.z));////(3) if (newVector.y > 0){ angleX *= -1; } float angleY = Vector3.Angle(originVector, new Vector3(newVector.x,0,newVector.z)); if (newVector.x < 0){ angleY *= -1; } head.GetComponent<MMD4MecanimBone> ().userEulerAngles = new Vector3 (angleX, angleY, 0);////(4) } }
(1)在做初始化Start時會儲存從head到camera的初始向量。
(2)在Update時會隨時跟新head到camera的向量。
(3)分別求出X軸和Y軸的角度,另外還要透過向量方向修正旋轉角度。
(4)將求出的角度帶到MMD4MecanimBone下的userEulerAngles。
以上就是旋轉角度的控制,但正負判斷會讓模型旋轉時有一個奇怪的頓點,這個問題需要再修正,至於表情的控制就留在下一次。
素材:
結月ゆかりVer3.5 by お宮 - https://bowlroll.net/file/6518
Keyboard Keys Icons by Chromatix - http://www.iconarchive.com/show/keyboard-keys-icons-by-chromatix.html
沒有留言:
張貼留言