延續上次內容
一些基本操作跟OBS的投影設定都已經完成
那就讓我們先回到第一個專案中
因為第一個專案中有臉部辨識相關的語法
那這邊有兩個方向可以嘗試
首先就是先嘗試從手機送訊息給PC端的Unity先測試是否能收到封包訊息
另一個則是先從獲取臉部辨識訊息開始,不過就只是研究方向不同
最後都會使用到
我們就先從臉部辨識的資訊開始
首先新增一個C#腳本,這邊就按照自己喜好跟習慣的腳本位置,放在第一個專案中
那我這邊簡單的命名為FaceMainManager
並且在場景中新增一個空物件,並且改名為Main,接著掛上需要的腳本
裡面先宣告這兩個,一個是看log用的
另一個則是我們要獲取資訊用的ARFaceManager
把這些程式碼放在update中進行刷新,並且讓它顯示在UI上
當然我們也會需要顯示文字用的UI
這邊不管是使用舊版(Legacy)的Text還是新版上面的Text都可以,操作有一點點不同而已
目前舊版Text操作比較少,只是測試用就可以直接選這個
在編輯視窗中把UI拉到自己想要的位置,並且拉到剛剛宣告的public Text上面
之後Build到手機中運行一下
就可以從手機上簡單看到這些數據
當然裡面還不只這些數據
可以稍微研究一下裡面有哪些數值
主要我們獲取的數值就可以從ARFace中查找
當然研究後可能會發現...
雖然是有不少數值,但是能直接用的部分並不多
像是裡面能看到的只有模型的Mesh然後左眼右眼的位置
並沒有像是眨眼或是其他嘴部偵測等等的參數(至少我這邊沒研究出來)
我想這就是安卓的AR Core的限制的一部分了
不過嘛,既然我們有Mesh,裡面還是有不少東西能看的
至於要怎麼用,就是大家各自發揮想像力了
首先我們可以先去找到AR Core的所有臉部辨識結果中的Mesh點位編號
這篇回覆中有看到別人把編號列出來
當然這個自己去實作也是可以的,只是有點麻煩,我一開始也有試過類似的方法
我實作的方案是把Shader渲染方式調整,然後對Mesh中的各個編號進行不同的染色
以此判斷出Mesh的編號
當然我用的方案不怎麼好,畢竟顏色對應編號這本身還是很難精確判斷
那後來就找到有人提供的編號,這邊就直接對照比較快
那這邊使用方法我就舉個例子
如上圖,這邊是右眼周圍的點位,想要拿去判斷是否眨眼是可行的其中一個方案
我這邊就舉幾個簡單的例子,例如眼睛上下的距離,像是159點位跟145點位
分別是眼睛中央的上下兩個點,就可以判斷這兩點的距離達到多少算是眨眼
那我們可以準備一個function來進行判斷
這邊我是把左右眼分開進行傳進來的兩個index就是你要判斷的編號
例如剛剛的159就是對應145其他的就依此類推
可以自己決定多少的數值才算是眨眼(或是要判斷多少個對應的點)
那這邊還需要處理一個問題是臉部角度
因為臉部偵測在不同角度下的準確性會有強烈影響
所以簡單設計可以排除臉在極端角度下的眨眼判斷(因為會判斷不出來)
可以根據先前的log來決定多少數值以上就不判斷眨眼的設計
而嘴部閉合也可以用同樣的邏輯去計算,畢竟有了點位就能做到不少計算了
那相關的判斷我們可以寫在這裡

ARFaceManager的facesChanged可以在臉部Mesh有任何變動的時候call這個callback
所以眨眼等等的判斷就能寫在這裡
接下來我們就可以把從手機處理好的計算數值給傳回PC了
首先我們先準備一個容器裝要傳送的資訊,格式就自己決定
看大家自己想把什麼偵測後的數據傳回去
不過這邊就不推薦把整個臉部辨識傳回去,因為數據量太多了,封包太大可能會有些問題
建議把想要用的資料計算好再把算好的資料傳回去就好(還可以節省PC的效能開銷)
接下來我們就先來寫傳送封包的腳本
那我預想這封包會需要比較即時,所以希望封包傳送速度高延遲小的方案
比起TCP來說,使用UDP封包能更小更快一點點,而且UDP的風險損失一些封包在設計上影響也不大
畢竟臉部辨識的資訊沒有完全同步差異也還好(這邊前提是要先想好設計的方式,根據不同設計可能會有差)
我們先新建一個腳本UDPClient
內容大概這樣就好了,我們準備了一個可以發送封包的function
那這邊有endPoint是IP位置,這邊就需要知道你要傳送的PC端的IP為多少了(區網IP)
例如這樣,最後一個參數是port,可以自己定一個數字
只要不要用到保留的數值,並且跟你想當Server端的數字相同就好
這邊通常會假設在同個區網內,這樣處理起來會比較簡單
而且傳送的速度也會更即時
接下來我們就回到先前的update去添加語法(這邊也可以考慮先前的facesChanged)
首先發送封包要用的class
把資料塞進去,之後轉成json格式發送
最後丟給剛剛寫的UDPClient就能發送了
當然這邊資料想塞什麼就自己決定,我這邊是還處理了一些額外計算
那這樣發送封包的部分就已經完成了
我們回到第三專案的PC端的Unity中
在這邊新增UDPServer的腳本
裡面可以把剛剛的FaceDataUdp同樣內容複製過來
因為解析封包的json會用到(這邊放哪邊可以自己決定)
接下來我們可以在裡面添加Server端的相關內容
主要就是讓程式碼在啟動後會去接收封包(針對port或是不針對也可)
當然也需要準備停止的時候的function

接下來就是我們解析封包的地方
然後我這邊是直接把資料丟給另一個腳本進行處理MainManager
那這邊我們還需檢查一下防火牆是否已經對port開啟
根據先前的研究,Unity應該會預設被防火牆阻擋,這塊要到防火牆中處理一下(或是測試期間暫時先關閉防火牆方便測試)
第一專案也能打包Build到手機上執行測試了
第三專案則是直接在Unity中執行進行接收封包
那結果就如影片這樣,暫時只做了一些設置跟調整
動態上還有不少可發展空間
目前就是根據手機傳過來的封包進行VRM的模型動態
這次的筆記就先到這邊~
下次的話在考慮弄點什麼新東西加入(或是什麼有趣的東西)
或是有什麼細節想問也可以
不過多半就只是一些數值計算的過程而已(類似計算>微調循環出來後的結果)
最後補充一個算是擔憂的東西
隨著研究一段時間
也是看到現在的確有很多現成的Vtuber相關的APP或是軟體能用
不過老實說覺得有不少疑慮,當然並不是說那些東西肯定有問題
只是對Vtuber來說,隱私安全性相對是更重要的吧
不少APP跟軟體都沒有明確的指出資料如何蒐集使用,並且如何處理的,這塊還是有點令人擔憂的
也就簡單提一下疑慮而已,希望大家使用的時候也稍微注意一下了