■Unity開発メモ用のWiki◎現在扱っていること・Unity全般・MMDからUnityへの変換してインポート・MMDの仕様把握・BlenderでMMDモデルのカスタム

目次



一時メモ

Tilt Shift
Tilt Shiftを使うとカメラの描画画面の中心に垂直方向と放射状に焦点を合わせ周りをぼかす事が出来ます。


Unity SteamVR トラッカー 取得
SteamVR Plugin トラッカー
Unity VR アクションマニフェスト
SteamVR Unity Plugin
STEAMVR 再起動 エラー

KKS_HCtrlのVR対応に挑戦(VRのGUIの知識不足で断念)

HCtrl→ Init()→本来ここで「HStateCtrl」が作られるはずが作られていない

フックの箇所の問題?
HSceneProc

HFlag→VRHFlag
HSceneProc→VRHScene?

VRの場合:HFlagから「VRHScene」を取得しする

「VRHScene」の違い?
public static HSceneProc hsceneProc { get; private set; }
 ↓
public static VRHScene hsceneProc { get; private set; }
HCtrl.hsceneProc = UnityEngine.Object.FindObjectOfType<HSceneProc>();
 ↓
HCtrl.hsceneProc = UnityEngine.Object.FindObjectOfType<VRHScene>();

「AibuAuto()」「ForcePlayAibu(HCtrl.PlayState state, HActionBase proc)」を一時的に削除

KKS_HCtrl_VR→KK_HStrl.Hctrl→guiがヌル
  • GUIMgrがヌル?

コイカツのVR-SDKメモ

  • KKS-公式VR
VRTK+SteamVRプラグインか?
[CameraRig][SteamVR]を確認

  • KK版本編VR
→VRTKを使っていない?VRGINテンプレートを使っている?
  • スタジオVR化MOD
→VRTKを使っていない?VRGINテンプレートを使っている?
  • 公式スタジオVRシアター
→エラーが多く難しい?

VR空間上に鏡をつくる

参考:Vive Stereo Rendering Toolkitを使って(Steam)VRで鏡を実装【Unity】【Steam】【VR】【アセット】:https://kan-kikuchi.hatenablog.com/entry/Vive_Ster...

スタジオのミラーアイテムをVRフリーHの空間にドロップ出来ないか?
Barque Mirror Table

GOLのサブカメラ
Ctrl+P→リセット

SubCameraToggleKey=Ctrl+P
SubCameraAddKey=Ctrl + A
SubCameraTargetLook=P
SubCameraResetKey=Ctrl + Shift + P
TrackHeadPosToggleKey=ALT+P
TargetCharaSwitchKey=Ctrl + S
SubCameraDepth=0
ForcePanelMode=0
OnVRmodGUI=0
SubCameraTargetNames=p_cf_head_bone
SubCameraCopyEffects=
SubCameraFOV=40
SubCameraDistance=0.6
SubCameraPosSide=-0.3
SubCameraPosUp=0.2
LookAtHeadPosUp=0.1
TrackHeadPos=0
PanelDistance=1
PanelAspectRatio=0.6
PanelSize=1
PanelShader=
PanelShaderPalameter=
SubWindowRect=Rect(0, 0, 0.3, 0.35)
DepthOnlyKey=Ctrl+D
CullingMask = -1";

FinalIKをスクリプトで操作する

  • セットアップ
    • FinalIKをインストールする
 
  • SkyrimのVRMODではVRIKが使われているが、リグ?の入れ替えはハードルが高くないか?

SteamVRの基本的な操作

 
VRPlugin.cs (プラグインの初期設定?)
KKAPIの依存関係を定義
 

VRGINテンプレート関連

参考:Windows版のビルド、および実行手順
参考:理想のメイド。にVR化MODを導入してVRでプレイ!
参考:VR を Unity ゲームにハッキングする
GitHub:https://github.com/Eusth/VRGIN.Template/
 
内容:Unity5.X系(2016〜2017年頃)でビルドされたゲームをムリヤリVR化する
 
導入:zip「VRGIN.Template」をVR化する対象のexeがあるフォルダに展開する
  • VR化するexeファイルをIPA.exeへドロップする
  • 新しく出来たショートカットの起動オプションに「--vr」を追加する
 
操作方法:キーボード「Ctrl+C」を2回押すことでVRコントローラーモードに切り替わる

まず「IVRManagerContext」を継承したマイクラスを作る?
  • 次にVR設定に関するXMLを読み込んでいる

VRIK・VRTKテスト

[VRTK解説まとめ] Examplesまとめ(VRTK公式によるサンプル集)[Unity][VRTK3.0][Vive]:http://negi-lab.blog.jp/archives/vrtk_examples.htm...
VRTK解説まとめ:http://negi-lab.blog.jp/tag/VRTK%E8%A7%A3%E8%AA%AC...

↓やりたいこと
VRIK(FinalIK)をunityちゃんに設定する手法(Oculus) VR(Oculus)でキャラクタに憑依して操るアプリの作り方

→次の記事がシンプルにテストできる:Unity+Vive+MMD+VRIKで、キズナアイちゃんになりきりVR:https://qiita.com/halne369/items/daadf0e00330a1019...

VRTKのセットアップ〜ポインター表示

環境
  • HTC Vive
  • Unity 2019.4.9f1→Unity 2017.4.2f2に変更
  • SteamVR plugin for Unity v1.2.3
  • VRTK v3.3.3→VRTK 3.2.1
サンプルが少ないのでv3.0.1にダウングレードする?
→エラー対策:保護されたメンバーにアクセスできませんUnityEngine.Texture.Texture()」:https://github.com/ExtendRealityLtd/VRTK/issues/17...
renderer.material.SetTexture("_MainTex", new Texture2D(0,0));
  • Final IK
  • UnityChan_1_2_1

VRTKのセットアップ→[VRTK] VRTK 3.2.1 のセットアップ方法 [Vive]:http://negi-lab.blog.jp/VRTK_3_2_1_Setup

VRTK3.XはSteamVR プラグインV2には対応していない!
解決策:CS0246 SteamVR_PlayArea could not be found:https://github.com/ExtendRealityLtd/VRTK/issues/19...
→VRTK で動作する古いバージョンの SteamVR プラグインをダウンロードする

最初にデフォルトのカメラを削除

ポインターが表示されない
  • VRTK_Pointer
  • VRTK_StraightPointerRenderer
  • VRTK_ControllerEvents
→VRTK v3.3.3→VRTK 3.2.1にすることで無理やり解決

VRIK(基本編)

  • VRIKのアバター制御
サンプルシーン「VRIK (Animated Locomotion)」にある「VR Controller」をプレハブかして使う?
アバターに「VRIKCalibrationBasic」を取り付ける?

VRM(VRoid)モデルを使う
UniVRM v0.99.0 Unity-2019.4 の最終版です。
→VRMモデルならデフォルトでも良い感じVRIKが動く
ニア→0.13ぐらい?

ランタイムでVRIKにアタッチする

参考:VRMをランタイムで読み込んでVRIKをアタッチさせる:https://www.noshimemo.com/entry/2018/08/03/181149

VRIK(3点トラッカー追加)

腰と両足

参考:ViveTracker3つ追加で全身トラッキング:https://hinzka.hatenablog.com/entry/2017/05/08/013...

VMTメモ

初期セットアップ:公式ドキュメント:https://gpsnmeajp.github.io/VirtualMotionTrackerDo...
公式サンプル:https://gpsnmeajp.github.io/VirtualMotionTrackerDo...


OSC(Open Sound Control)メモ

参考:OSCを使ったデバイス間連携:https://note.com/toyoshimorioka/n/n9cd34e07f960
  • OSCとはローカルのソケット通信でよく使われるプロトコルである
    • ソケット通信は、インターネットを経由しない環境下での通信をさす
    • OSCはUDP通信(パケットが届いたかどうかの確認はしない)のみで利用される
  • OSCを行う場合、送り先のIPアドレスとポート番号を指定する必要がある
  • localhost(自分のIPアドレスに通信するとき、「127.0.0.1」
 

OSCデータ送信アプリ

参考:ZIG SIM × Processing|スマホをゲームコントローラにしよう!:https://zenn.dev/zawaworks/articles/2101be9cd7ba30
Androidの無料のOSC送信アプリ:OSC Controller

 

OSCデータ受信モニター

GitHub:VMCProtocolMonitor:https://github.com/gpsnmeajp/VMCProtocolMonitor
設定
  • VMCProtocolMonitor.exeを起動すると待受状態になります。
  • setting.jsonにて、待受ポートを設定します。
    • ListModeをtrueにするとListモードになります。ブラウザ(既定で http://127.0.0.1:8888/ )に一覧で表示します。
    • ListModeをfalseにするとStreamモードです。コンソールに受信したそのまま表示します。(この場合HTTPサーバーは起動しません)

 

UnityでOSCデータを受信する

参考:Unity + OSC:https://www.ei.tohoku.ac.jp/xkozima/lab/uniTutoria...
  • 通信データは,アドレスパターン(たとえば /kozPhone/uniVRtutorial2/message)とそれに続く引数の列(たとえば 320 150 "Game Over")からなる
    • 引数としては,整数(int32)・実数(float)・文字列などが使える
  • 「サーバ」と「クライアント」
    • データを受信するUnity が「サーバ」となり,センサなどデータを送信するのが「クライアント」となる
 
GitHub:UnityOSC v1.2.:https://github.com/jorgegarcia/UnityOSC
  • 現在、更新が行われていない(Unity Ver2020.3LTSで動作確認 2021.3LTSでは動かず
  • GitHubからダウンロードした圧縮ファイルの中から src フォルダを取り出し、Unity プロジェクトの Assets フォルダに入れる
 
OSCHandler.cs
public void Init()
{
    CreateServer("uniVRtutorial2", 8001);
}
 

Unityで受信したOSCデータによって、GameObjectを動かす(OscJack)

参考:OSCって何?UnityビジュアルスクリプティングでOSC通信してみよう!
  • Unity ビジュアルスクリプディング(VS)を使っている(旧Bolt)
    • プロジェクト設定で一度初期化する必要がある?
 
GitHub:OscJack:https://github.com/keijiro/OscJack
 

VMCプロトコル・EVMC4U

参考:VMC Protocol プロトコル仕様概要:https://protocol.vmc.info/specification.html
  • OSCでは受信側がサーバー、送信側がクライアントと呼ぶが、VMC Protocolでは以下の用に定義している
 
Marionette - モーションを受信し、描画などを行います。(必須)
最終的に画面や映像・通信に成果を出すための存在です。
(例: EVMC4U, VMC4UE, その他モーション受信対応アプリケーション)
 
Performer - 主にモーションを処理し、全身ボーン情報(IK)と補助情報をMarionetteに送信します。(必須)
(例: バーチャルモーションキャプチャー, Waidayo, VSeeFace, MocapForAll, TDPTなど)
 
Assistant - 主にモーションの処理はせず、補助的な情報をPerformerに送信します。(オプション)
補助情報のみを送信する担当です。(一部ボーン、トラッカー姿勢、表情など)
(例: face2vmcモードのWaidayo, Sknuckle, Simple Motion Tracker, Uni-studioなど)
 
注意: Assistant(39540)→Marionette(39539) の直結は、大抵望み通りの結果を得られません。(送信される情報が不足していることが多いです)
必ずAssistant(39540)→(39540)Performer(39539)→Marionette(39539)と経由してください。



 

 

Unityでの設定


 

 

VRMプロトコルでUnityと通信

1.VMCを起動する
  • SteamVRが立ち上がったことを確認する

2.SlimeVR (Server)を起動する

3.スマホ側のowoTrackVRを起動する
  • SlimeVRと接続を確認する

4.VRコントローラーを2つとも電源を入れる
5.VMCの詳細設定でOSC送信とポートを設定する

6.VMCでキャリブレーションを行う
7.Unityを実行する

DLL化とBepinEXでのテスト(腰トラ・EVMC4U)

  • スクリプトで以下の処理を行う
    • 必要なGameObjectを作成する
    • 作成GameObjectに対応するコンポーネントをアタッチする
    • GameObjectの親子関係を設定する
  • 上記のスクリプトと、GameObjectに取り付けたコンポーネント(スクリプト)をDLL化する

名前空間
using EVMC4U; 
 
必要なGameObject一覧
  • ExternalReceiver(OSCの総合管理?)
    • CameraReceiver (VMC側のカメラ関係?)
    • CommunicationValidator(構文エラーチェック関係?)
    • DeviceReceiver(VRデバイス関連?)
    • DirectionalLightReceiver(VMC側のライト設定?)
    • InputReceiver(VMC側の入力関連?)
  • WaistTracker(腰トラ用)
 
コンポーネント
uOscServer
  • ExternalReceiver
  • using uOSC;
DeviceAttacher
  • WaistTracker
 
課題
  • ハードコーディングした箇所の修正
    • uOscServer→port番号
    • DeviceAttacher→ public string DeviceSerial = "human://WAIST";
  • 要らない機能の削除
  • DLL時の簡略化の為に、VRM機能の削除

    public class DeviceAttacher: MonoBehaviour {
    public DeviceReceiver deviceReceiver;
    public string DeviceSerial = "human://WAIST";

    void Start()
    {
        GameObject hoge = GameObject.Find("DeviceReceiver");
        deviceReceiver = hoge.GetComponent<DeviceReceiver>();
    }
 
DLL化テスト

EVMC4U解析

  • ExternalReceiver
    • uOscServer(必須・そのまま)
    • ExternalReceiver(必須?・VRM、UniGLTF要素を削除)
    • CameraReceiver(要らない?)
    • CommunicationValidator(必須・VRM削除)
    • DeviceReceiver(必須・VRM削除)
    • DirectionalLightReceiver(要らない?)
    • InputReceiver(必須・VRM削除)
  • WaistTracker
    • DeviceAttacher(必須・そのまま)
 
デイジーチェーンを設定する

コイカツ環境でのOSC受信テスト

  • DLL作成時は「.NET3.5フレームワーク」を使う?
  • 5.6.2f1のUnityEngine.DLLを使う?
  • OnSceceLoadedでスクリプトを使うシーンを指定する必要がある
 
  • バニラでテストする 

using UnityEngine;
using BepInEx;
using UnityEngine.SceneManagement;

namespace DLL_test_01
{
    [BepInPlugin("org.bepinex.plugins.HOGE001", "HOGE001", "0.0.1")]
    public class Class1 : BaseUnityPlugin
    {
        void Start()
        {
            SceneManager.sceneLoaded += OnSceceLoaded;


        }
        void OnSceceLoaded(Scene scene, LoadSceneMode mode)
        {
            GameObject Dlight = GameObject.Find("Directional Light");
            Light CharaLight = Dlight.GetComponent<Light>();
            CharaLight.color = Color.blue;

            Debug.Log("TEST_DLL!");
            GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
            cube.transform.position = new Vector3(2, 0, 0);
        }
    }

}

FinalIKとの連携




Harmonyを使ったOSC送信テストプラグイン

using UnityEngine;
using HarmonyLib;
using uOSC;

namespace OSC_Send
{
    [HarmonyPatch(typeof(HSceneProc))]
    [HarmonyPatch("MapSameObjectDisable")] // 
    static class Patch_HScene_MapSameObjectDisable
    {
        // 元のMapSameObjectDisableが呼ばれる前に呼ばれるメソッド、戻り値がtrueだと元のメソッドが呼ばれ、falseだと呼ばれない
        static bool Prefix(HSceneProc __instance)
        {
            GameObject OSC_SEND = new GameObject();
            OSC_SEND.name = "OSC_SEND";
            OSC_SEND.AddComponent<uOscClient>();
            return true;
        }
    }

    [HarmonyPatch(typeof(HSceneProc))]
    [HarmonyPatch("Update")]
    static class OSC_Send_Update
    {
        static void Prefix(HSceneProc __instance)
        {
            GameObject hoge01;
            uOscClient osc_s_01;

            hoge01 = GameObject.Find("OSC_SEND");
            osc_s_01 = hoge01.GetComponent<uOscClient>();
            osc_s_01.Send("/uOSC/sample", "hoge", 123.456f, 1);
        }
    }
}

Unity内にトラッカーを追加する

参考:ViveTracker3つ追加で全身トラッキング:https://hinzka.hatenablog.com/entry/2017/05/08/013...
参考:Unity+Steam VR開発メモ(HTC Vive、Valve Index対応):https://framesynthesis.jp/tech/unity/htcvive/
 
構成
  • SteamVR Plugin
  • Final IK
  • Vive Stereo Rendering Toolkit
 
ルームスケールと着席モードの切り替え
  • デフォルトではルームスケールになっていて、変更するには Project ウィンドウで SteamVR_Resources/Resources/SteamVR_Settings を選択して、Tracking Space Origin を変更
    • ルームスケールのモードでは、ルームセットアップで設定したプレイエリアの中央の地面に、[CameraRig] を配置する
    • 着席モードでは、VR空間のプレイヤーの頭の位置に、[CameraRig] を配置する
  
  • 新規プロジェクトを「3D」テンプレート(レガシーレンダーパイプライン)で作成する事
  • 既存のプロジェクト・シーンを SteamVR 対応にするには、Main Camera を削除または無効化して、Project ビューの SteamVR/Prefabs/[CameraRig] プレハブをシーンの床の中央となる位置に配置する
  • Unity でシーンを再生する際には Game ビューの「Maximize on Play」をオンにするとフレームレートが向上する場合がある

検証メモ

  • Unityに自作トラッカーを認識させるのはかなり難しい?
    • SteamVR pluginは古い情報しか出てこない、今はメジャーでないのか?(2017〜2018年頃の情報が多い)
    • teamVR PluginはV1とV2では設定の仕方が結構違う
  • Virtual Motion Tracker(VMT)を使う?
  • EVMC4U - EasyVirtualMotionCaptureForUnity を使う?
  • SteamVR Input Live Viewの使い方
  • VRデバイスの設定は「SteamVR_Behaviour_Pose」だと思うが…
    • 「Stem VR_Tracked Object」コンポーネントをアタッチすると何故か分からないが反応数する(しかしベースステーションも動いてしまう)

VRデバイスの入力について(純正VIVEトラッカー用?)

  • トラッカーの割当をしておく

 
  • メニューバー「ウィンドウ」→「StemVR Input」
 
 
  • 「StemVR Input」ウィンドウ→「Open binding UI」

 
  • 実行中のUnityを選ぶプロジェクトを選択する

 
  • VRデバイスのキーバインド設定画面(上手くトラッカーが認識されていればここで表示されるはずだが…)


  • 「CameraRIG」のコントローラーを複製→
  • 「SteamVR_Behaviour_Pose」→「入力ソース」に先程設定したパーツを指定する

位置リセット(未検証)

位置合わせをするには、ヘッドセットをかぶってコントローラーのメニューボタンでダッシュボードを表示し、で右下の「Reset Standing Position」をポイントしてトリガーを引きます。
また、InputTracking.Recenter メソッドでもリセットできますので、これをキーやボタン等で実行できるようにしておくと便利です。サンプルスクリプトです。
using UnityEngine;
using UnityEngine.XR;

public class Recenterer : MonoBehaviour
{
    void Update()
    {
        // Rキーで位置トラッキングをリセットする(Stationaryでしか動作しない)
        if (Input.GetKeyDown(KeyCode.R))
        {
            InputTracking.Recenter();
        }
    }
}

OSC(OpenSound Control:オープンソースコントロール)

OSCとは、電子楽器(特にシンセサイザー)やコンピュータなどの機器において音楽演奏データをネットワーク経由でリアルタイムに共有するための通信プロトコルである。
 
OSCの使用例

 
OSCプロトコル
方向ポート番号
App → Driver39570
Manager → Driver39570
Manager ← Driver39571
注意: 39571が使用されているとManagerは動作しません

参考:SteamVRへの連携:https://akiya-research-institute.github.io/MocapFo...
参考:VMTとARCoreでAndroidスマホをトラッカーにした話:https://nanasai.hatenablog.jp/entry/2020/07/12/224...
GitHub:uOSC:https://github.com/hecomi/uOSC

VMC:バーチャルモーションキャプチャー(EVMC4U)

参考:EVMC4UでUnityとバーチャルモーションキャプチャーをつなぐ方法:https://styly.cc/ja/tips/evmc4u_rapturn_virtualmot...
参考:【VRChat】VMC&EVMC4Uを使ってモーションエモートを作ってみた!!:https://keiki002.com/vr/vmc-emote/
  • Viveトラッカーは定期的に位置・回転を送信してきますが、それをそのままアバターに当てはめてしまうとトラッキングのロストやブレが出たときにアバターにノイズのような動きが現れてしまう
  • 体型やトラッカーの補正もしてくれる
  • バーチャルモーションキャプチャーのトラッキングデータはOSCで送信することができ、それをUnityで受け取ることが出来る
  • トラッキングデータを受信するツール「EVMC4U」
  • VRM形式の3Dモデルを使った方が簡単?
    • VMCで動かすVRMモデルと、Unityで動かすモデルはボーン情報が同じである必要がある
    • Unity用のボーン構造なら大体いけるのではないか?
  • OSCの送信機能は有料のみ(2022/12現在)
 
入手先
最新版(GitHub) https://github.com/gpsnmeajp/EasyVirtualMotionCapt...
安定版(booth) https://booth.pm/ja/items/1801535
PIXIV FANBOX:https://akira.fanbox.cc/
    • Ver0.51
 
「EVMC4U」の出来る事
・SteamVRとのやり取り
・ボタン入力
・MIDI入力
・VRMの諸々の処理
・トラッカーの扱いや補正
・10点トラッキングを含めた処理
・カメラ移動
・ボーンのあれこれ
 
導入
  • GitHubから「ExternalReceiverPack」をダウンロードし、Unityへインストールする
    • VRMインポーターも一緒に入っている?

UnityとVMCとのOSC通信設定

  • VRMモデルをシーンに配置する
  • Assets→EVMC4Uにあるプレハブ「ExternalReceiver」をシーンヒエラルキーにドロップする
  • 「ExternalReceiver」のインスペクター「モデル」にVRMモデルを指定する

 
  • 「ExternalReceiver」→「U Osc Sever」のインスペクター「Port」は「3959」で良い?
    • StatusでUnityよVMCとの通信が正常かみる

 
  • VMCのコントロールパネル→詳細設定→モーション受信「OSCでモーション受信を有効にする」にチェックを入れる
    • ポート番号は「39540」?

VNTとVMCとUnityをOSCでコントロールする

GitHub:uOSC:https://github.com/hecomi/uOSC

VMC→uOSCをDLL化したやつ→受信テキストを解析→位置と回転データをオブジェクトの反映させる?
  • EVMC4UをDLL化する?VRMモデルは透明モデルを使う?
VMC Protocol
参考:Marionette(モーション受信側アプリケーション)受信仕様:https://protocol.vmc.info/marionette-spec
 
VMCProtocolMonitor:https://github.com/gpsnmeajp/VMCProtocolMonitor
VMCProtocolの受信内容を表示するソフトウェア。 ごく単純に受信内容をコンソールに流すモードと、VMCProtocolに基づいてブラウザに一覧表示するモードがあります。

電動アダルトグッズとの連携「Buttplug」

参考;大人のおもちゃの制御を標準化するためのオープンソースプロジェクト「Buttplug」:https://gigazine.net/news/20200507-buttplug/
公式:https://buttplug.io/
サポートしているグッズ一覧(海外製):https://iostindex.com/?filter0Availability=Availab...
デスクトップGUI版:Intiface Central:https://intiface.com/central/
→GitHub:https://github.com/intiface/intiface-central
Android版:Intiface Central:https://play.google.com/store/apps/details?id=com....
バットプラグ プロジェクトのリスト(GitHub):https://github.com/buttplugio/awesome-buttplug

BepInEx ラブマシーン

DIYをする場合

Buttplug と Intiface に関するよくある質問:DIY ハードウェア:https://how.do.i.get.buttplug.in/buttplug/diy-hard...
バットプラグ・ユニティ(GitHub):https://github.com/buttplugio/buttplug-unity
バットプラグ OSC(GitHub):https://github.com/AlexanderPavlenko/buttplug-osc
バットプラグ開発ガイド:https://stpihkal.docs.buttplug.io/
バットプラグ API(GitHub):https://github.com/buttplugio/buttplug
→TCode(Toy Control Protocol)

VAMXと電動グッズとの連携

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu

【メニュー編集】

スカイリム関連

スカイリム関連


Menu

【メニュー編集】

スクリプト関連

フリーエリア

管理人/副管理人のみ編集できます