2015年3月2日 星期一

【Unity】MMD4Mecanim-人物骨架關節控制篇

這次的內容是MMD4Mecanim的人物關節角度控制,算是自己嘗試出來的功能,起因是看到MMD4Mecanim插件轉換出來的模型關節有下圖中的數值。
MMD4Mecanim 模型關節控制

這個發現倒是挺讓人開心的,因為要在Unity中要把動畫中的模型關節獨立出來運作,這是專業版限定而且能控制的關節不多,既然插件的作者Nora連Script都幫大家寫好了,那就不客氣地拿來玩,首先成品在這裡,讓模型可以一直盯著攝影機看就是這次要做出來的結果。

首先在攝影機控制上使用Character Controller Package內的Mouse Look.cs再加以修改,如何修改另外一篇再談,下一段只大略的提一下攝影機的部分。
MMD4Mecanim 模型關節控制

先在模型頭部位置新增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。
剩下的變數是做表情控制的,在這裡一樣先保留之後再談。
MMD4Mecanim 模型關節控制


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


MMD4Mecanim 模型關節控制

沒有留言:

張貼留言

【自製小遊戲】水平思考猜謎(海龜湯)

遊戲連結 海龜湯的玩法是由出題者提出一個難以理解的事件,參與猜題者可以提出任何問題以試圖縮小範圍並找出事件背後真正的原因。但出題者僅能以「是」、「不是」或「沒有關係」來回答問題。 本遊戲蒐集各種論壇、平台的42個題目,提供給想玩海龜湯卻愁找不到題目的你們。 ...