private void AutoAdjust()
        {
            if (_vrmRoot == null)
            {
                return;
            }

            var parameters = new AutoAdjustParameters();

            //やること:
            //1. いま読まれてるモデルの体型からいろんなパラメータを決めてparametersに入れていく
            //2. 決定したパラメータが疑似的にメッセージハンドラから飛んできたことにして適用
            //3. 決定したパラメータをコンフィグ側に送る

            try
            {
                var animator = _vrmRoot.GetComponent <Animator>();

                //3つのサブルーチンではanimatorのHumanoidBoneを使うが、部位である程度分けられるので分けておく
                SetHandSizeRelatedParameters(animator, parameters);
                AdjustCameraPosition(animator);
                //デバイスレイアウト調整: これは別途調整が終わるとメッセージが飛ぶ
                _dispatcher.ReceiveCommand(new ReceivedCommand(VmmCommands.ResetDeviceLayout));

                //3. 決定したパラメータをコンフィグ側に送る
                _sender.SendCommand(MessageFactory.Instance.AutoAdjustResults(parameters));
            }
            catch (Exception ex)
            {
                LogOutput.Instance.Write(ex);
            }
        }
        private void AutoAdjust()
        {
            if (_vrmRoot == null)
            {
                return;
            }

            var parameters = new AutoAdjustParameters();

            //やること:
            //1. いま読まれてるモデルの体型からいろんなパラメータを決めてparametersに入れていく
            //2. 決定したパラメータが疑似的にメッセージハンドラから飛んできたことにして適用
            //3. 決定したパラメータをコンフィグ側に送る

            try
            {
                var animator = _vrmRoot.GetComponent <Animator>();

                //3つのサブルーチンではanimatorのHumanoidBoneを使うが、部位である程度分けられるので分けておく
                SetHandSizeRelatedParameters(animator, parameters);
                //眉毛はブレンドシェイプ
                SetEyebrowParameters(parameters);
                AdjustCameraPosition(animator);

                SendParameterRelatedCommands(parameters);

                //3. 決定したパラメータをコンフィグ側に送る
                sender.SendCommand(MessageFactory.Instance.AutoAdjustResults(parameters));
            }
            catch (Exception ex)
            {
                LogOutput.Instance.Write(ex);
            }
        }
        private void SendParameterRelatedCommands(AutoAdjustParameters parameters, bool onlyEyebrow)
        {
            var eyebrowCommands = new ReceivedCommand[]
            {
                new ReceivedCommand(
                    MessageCommandNames.EyebrowLeftUpKey,
                    parameters.EyebrowLeftUpKey
                    ),
                new ReceivedCommand(
                    MessageCommandNames.EyebrowLeftDownKey,
                    parameters.EyebrowLeftDownKey
                    ),
                new ReceivedCommand(
                    MessageCommandNames.UseSeparatedKeyForEyebrow,
                    $"{parameters.UseSeparatedKeyForEyebrow}"
                    ),
                new ReceivedCommand(
                    MessageCommandNames.EyebrowRightUpKey,
                    parameters.EyebrowRightUpKey
                    ),
                new ReceivedCommand(
                    MessageCommandNames.EyebrowRightDownKey,
                    parameters.EyebrowRightDownKey
                    ),
                new ReceivedCommand(
                    MessageCommandNames.EyebrowUpScale,
                    $"{parameters.EyebrowUpScale}"
                    ),
                new ReceivedCommand(
                    MessageCommandNames.EyebrowDownScale,
                    $"{parameters.EyebrowDownScale}"
                    ),
                new ReceivedCommand(
                    MessageCommandNames.LengthFromWristToPalm,
                    $"{parameters.LengthFromWristToPalm}"
                    ),
                new ReceivedCommand(
                    MessageCommandNames.LengthFromWristToTip,
                    $"{parameters.LengthFromWristToTip}"
                    ),
            };

            foreach (var cmd in eyebrowCommands)
            {
                handler.ReceiveCommand(cmd);
            }

            if (onlyEyebrow)
            {
                return;
            }

            //レイアウト調整はコレ一発でおしまいです
            handler.ReceiveCommand(new ReceivedCommand(MessageCommandNames.ResetDeviceLayout));
        }
        private void SetEyebrowParameters(AutoAdjustParameters parameters)
        {
            var blendShapeNames = blendShapeAssignReceiver.TryGetBlendShapeNames();
            var adjuster        = new EyebrowBlendShapeAdjuster(blendShapeNames);
            var settings        = adjuster.CreatePreferredSettings();

            parameters.EyebrowIsValidPreset      = settings.IsValidPreset;
            parameters.EyebrowLeftUpKey          = settings.EyebrowLeftUpKey;
            parameters.EyebrowLeftDownKey        = settings.EyebrowLeftDownKey;
            parameters.UseSeparatedKeyForEyebrow = settings.UseSeparatedKeyForEyebrow;
            parameters.EyebrowRightUpKey         = settings.EyebrowRightUpKey;
            parameters.EyebrowRightDownKey       = settings.EyebrowRightDownKey;
            parameters.EyebrowUpScale            = settings.EyebrowUpScale;
            parameters.EyebrowDownScale          = settings.EyebrowDownScale;
        }
        private void SetHandSizeRelatedParameters(Animator animator, AutoAdjustParameters parameters)
        {
            var tip = animator.GetBoneTransform(HumanBodyBones.RightMiddleDistal);

            if (tip == null)
            {
                return;
            }

            var   wrist    = animator.GetBoneTransform(HumanBodyBones.RightHand);
            float distance = Vector3.Distance(tip.position, wrist.position);

            float factor = distance / ReferenceHandLength;

            parameters.LengthFromWristToTip = (int)(parameters.LengthFromWristToTip * factor);
        }
        private void AutoAdjustOnlyEyebrow()
        {
            if (_vrmRoot == null)
            {
                return;
            }

            var parameters = new AutoAdjustParameters();

            try
            {
                SetEyebrowParameters(parameters);
                SendParameterRelatedCommands(parameters, true);
                sender.SendCommand(MessageFactory.Instance.AutoAdjustEyebrowResults(parameters));
            }
            catch (Exception ex)
            {
                LogOutput.Instance.Write(ex);
            }
        }
 private void SendParameterRelatedCommands(AutoAdjustParameters parameters)
 {
     SendParameterRelatedCommands(parameters, false);
 }
Esempio n. 8
0
 public Message AutoAdjustResults(AutoAdjustParameters parameters)
 => WithArg(JsonUtility.ToJson(parameters));