Пример #1
0
 public void StartRecordingAvatars(Dictionary <RefID, Slot> avatar_roots, string override_filename = null)
 {
     foreach (var item in avatar_roots)
     {
         RefID user_id  = item.Key;
         Slot  rootSlot = item.Value;
         VRIK  comp     = rootSlot.GetComponentInChildren <VRIK>();
         if (comp != null)
         {
             IKSolverVR solver = (IKSolverVR)comp.Solver;
             boness[user_id] = solver.BoneReferences;
             string filename = "";
             if (override_filename != null)
             {
                 filename = saving_folder + "/" + override_filename + "_mocap.bvh";
             }
             else
             {
                 filename = saving_folder + "/" + user_id.ToString() + "_mocap.bvh";
             }
             fileWriters[user_id] = new System.IO.StreamWriter(filename);
             filenames[user_id]   = filename;
             BvhHeaderWrite(fileWriters[user_id], boness[user_id]);
         }
     }
     isRecording = true;
 }
Пример #2
0
 public void ApplyAll(IKSolverVR solver, TrackingStyle style)
 {
     solver.spine.headTarget   = style.UseHMD ? HMD : HeadTracker;
     solver.leftArm.target     = LeftHandTracker;
     solver.rightArm.target    = RightHandTracker;
     solver.spine.pelvisTarget = style.TrackPelvis ? PelvisTracker : null;
     solver.leftLeg.target     = style.TrackFeet ? LeftFootTracker : null;
     solver.rightLeg.target    = style.TrackFeet ? RightFootTracker : null;
 }
        public void Assign(IKSolverVR solver)
        {
            if (!HasTargetObject())
            {
                var obj = new GameObject("Target");
                obj.transform.position = Vector3.zero;
                obj.transform.rotation = Quaternion.identity;
                obj.transform.parent   = transform;
            }

            Assign(solver, TargetObject?.transform ?? transform, 1f);
        }
Пример #4
0
 public VRIKSolverData(IKSolverVR solver)
 {
     IKPositionWeight = solver.IKPositionWeight;
     LOD        = solver.LOD;
     plantFeet  = solver.plantFeet;
     Spine      = new VRIKSolverDataSpine(solver.spine);
     LeftArm    = new VRIKSolverDataArm(solver.leftArm);
     RightArm   = new VRIKSolverDataArm(solver.rightArm);
     LeftLeg    = new VRIKSolverDataLeg(solver.leftLeg);
     RightLeg   = new VRIKSolverDataLeg(solver.rightLeg);
     Locomotion = new VRIKSolverDataLocomotion(solver.locomotion);
 }
Пример #5
0
 public void ApplyTo(IKSolverVR solver)
 {
     solver.IKPositionWeight = IKPositionWeight;
     solver.LOD       = LOD;
     solver.plantFeet = plantFeet;
     Spine.ApplyTo(solver.spine);
     LeftArm.ApplyTo(solver.leftArm);
     RightArm.ApplyTo(solver.rightArm);
     LeftLeg.ApplyTo(solver.leftLeg);
     RightLeg.ApplyTo(solver.rightLeg);
     Locomotion.ApplyTo(solver.locomotion);
 }
Пример #6
0
        public CachedSolver(IKSolverVR solver)
        {
            Solver     = solver;
            Spine      = solver.spine;
            LeftArm    = solver.leftArm;
            LeftLeg    = solver.leftLeg;
            RightArm   = solver.rightArm;
            RightLeg   = solver.rightLeg;
            Locomotion = solver.locomotion;

            LeftLegBones  = LeftLeg.bones;
            RightLegBones = RightLeg.bones;
        }
Пример #7
0
        public override void OnLateUpdate()
        {
            if (isReady)
            {
                l_solver = VRCPlayer.field_Internal_Static_VRCPlayer_0?.field_Private_VRC_AnimationController_0?.field_Private_VRIK_0?.solver;
                if (l_solver != null)
                {
                    if (l_solver.leftArm?.target != null)
                    {
                        l_solver.leftArm.positionWeight  = 1f;
                        l_solver.leftArm.rotationWeight  = 1f;
                        l_solver.leftArm.target.position = m_leftTargetPosition;
                        l_solver.leftArm.target.rotation = m_leftTargetRotation;
                    }


                    if (l_solver.rightArm?.target != null)
                    {
                        l_solver.rightArm.positionWeight  = 1f;
                        l_solver.rightArm.rotationWeight  = 1f;
                        l_solver.rightArm.target.position = m_rightTargetPosition;
                        l_solver.rightArm.target.rotation = m_rightTargetRotation;
                    }
                }

                l_handController = VRCPlayer.field_Internal_Static_VRCPlayer_0?.field_Private_VRC_AnimationController_0?.field_Private_HandGestureController_0;
                if (l_handController != null)
                {
                    l_handController.field_Internal_Boolean_0 = true;
                    l_handController.field_Private_EnumNPublicSealedvaKeMoCoGaViOcViDaWaUnique_0 = VRCInputManager.EnumNPublicSealedvaKeMoCoGaViOcViDaWaUnique.Index;
                    for (int i = 0; i < 2; i++)
                    {
                        for (int j = 0; j < 5; j++)
                        {
                            int l_dataIndex = i * 5 + j;
                            l_handController.field_Private_ArrayOf_Single_1[l_dataIndex] = 1.0f - m_fingersBends[l_dataIndex]; // Squeeze
                            l_handController.field_Private_ArrayOf_Single_3[l_dataIndex] = m_fingersSpreads[l_dataIndex];      // Spread
                        }
                    }
                }
            }
        }
Пример #8
0
            public void AjdustSolverScale(IKSolverVR solver, IKSolverVR solverParameter)
            {
                // 参考: https://qiita.com/chiepomme/items/aef42df2d46aa0f79fbe
                solver.spine.minHeadHeight = solverParameter.spine.minHeadHeight * AvatarScale;

                solver.locomotion.footDistance  = solverParameter.locomotion.footDistance * AvatarScale;
                solver.locomotion.stepThreshold = solverParameter.locomotion.stepThreshold * AvatarScale;
                solver.locomotion.maxVelocity   = solverParameter.locomotion.maxVelocity * AvatarScale;

                for (var i = 0; i < solver.locomotion.stepHeight.keys.Length; i++)
                {
                    var newKey = solverParameter.locomotion.stepHeight.keys[i];
                    newKey.value *= AvatarScale;
                    solver.locomotion.stepHeight.MoveKey(i, newKey);
                }

                for (var i = 0; i < solver.locomotion.heelHeight.keys.Length; i++)
                {
                    var newKey = solverParameter.locomotion.heelHeight.keys[i];
                    newKey.value *= AvatarScale;
                    solver.locomotion.heelHeight.MoveKey(i, newKey);
                }
            }
Пример #9
0
 public Spine(IKSolverVR solver)
 {
     mySolver = solver;
 }
        // ReSharper disable once ParameterHidesMember
        private void Assign(IKSolverVR solver, Transform transform, float weight)
        {
            switch (InputSource)
            {
            case SteamVR_Input_Sources.LeftHand:
                solver.leftArm.target         = transform;
                solver.leftArm.positionWeight = weight;
                solver.leftArm.rotationWeight = weight;
                break;

            case SteamVR_Input_Sources.RightHand:
                solver.rightArm.target         = transform;
                solver.rightArm.positionWeight = weight;
                solver.rightArm.rotationWeight = weight;
                break;

            case SteamVR_Input_Sources.LeftFoot:
                solver.leftLeg.target         = transform;
                solver.leftLeg.positionWeight = weight;
                solver.leftLeg.rotationWeight = weight;
                break;

            case SteamVR_Input_Sources.RightFoot:
                solver.rightLeg.target         = transform;
                solver.rightLeg.positionWeight = weight;
                solver.rightLeg.rotationWeight = weight;
                break;

            case SteamVR_Input_Sources.Waist:
                solver.spine.pelvisTarget         = transform;
                solver.spine.pelvisPositionWeight = weight;
                solver.spine.pelvisRotationWeight = weight;
                solver.plantFeet = false;
                break;

            case SteamVR_Input_Sources.Head:
                solver.spine.headTarget     = transform;
                solver.spine.positionWeight = weight;
                solver.spine.rotationWeight = weight;
                solver.spine.maxRootAngle   = 180f;
                break;

            case SteamVR_Input_Sources.LeftKnee:
                solver.leftLeg.bendGoal       = transform;
                solver.leftLeg.bendGoalWeight = weight;
                break;

            case SteamVR_Input_Sources.RightKnee:
                solver.rightLeg.bendGoal       = transform;
                solver.rightArm.bendGoalWeight = weight;
                break;

            case SteamVR_Input_Sources.LeftElbow:
                solver.leftArm.bendGoal       = transform;
                solver.leftArm.bendGoalWeight = weight;
                break;

            case SteamVR_Input_Sources.RightElbow:
                solver.rightArm.bendGoal       = transform;
                solver.rightArm.bendGoalWeight = weight;
                break;

            case SteamVR_Input_Sources.LeftShoulder:
            case SteamVR_Input_Sources.RightShoulder:
            case SteamVR_Input_Sources.Chest:
            case SteamVR_Input_Sources.Any:
            case SteamVR_Input_Sources.Gamepad:
            case SteamVR_Input_Sources.Camera:
            case SteamVR_Input_Sources.Keyboard:
            case SteamVR_Input_Sources.Treadmill:
                throw new NotSupportedException();

                // default:
                //     throw new ArgumentOutOfRangeException();
            }
        }
 public void UnAssign(IKSolverVR solver)
 {
     Assign(solver, null, 0f);
 }
Пример #12
0
 // Start is called before the first frame update
 void Start()
 {
     animator = GetComponent <Animator>();
     solverVR = (IKSolverVR)vrik.GetIKSolver();
 }