티스토리 뷰

반응형

 

 

이 글은 절대 정확한 주석이 아닙니다.

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using RootMotion.FinalIK;
using Valve.VR;

namespace RootMotion.Demos
{
    // scale을 보정하는 클래스
    public class VRIKAvatarScaleCalibrationSteamVR : MonoBehaviour
    {
        public VRIK ik;                 // VRIK 클래스 변수
        public float scaleMlp = 1f;     // 조정해줄 스케일 값

        public SteamVR_Action_Boolean grabPinch;        // 어떤 버튼을 누르는 가를 확인하는 변수
        public SteamVR_Input_Sources inputSource = SteamVR_Input_Sources.Any;       // 어떤 컨트롤러에서 누르는가를 확인하는 변수. Any는, 모든 컨트롤러를 뜻함.

        private bool calibrateFlag;         // 켈리브레이트를 실행할 지 안할 지의 대한 bool값 변수.

        void OnEnable()
        {
            if (grabPinch != null)  // grabPinch가 정의가 되어있다면
            {
                grabPinch.AddOnChangeListener(OnTriggerPressedOrReleased, inputSource);     // 게임오브젝트가 켜지면, grabPinch에 Listener를 교체한다. OnTriggerPressedOrReleased 함수와, inputSource를 함께 넘긴다.
            }
        }

        private void OnDisable()
        {
            if (grabPinch != null)      // grabPinch가 정의가 되어 있다면
            {
                grabPinch.RemoveOnChangeListener(OnTriggerPressedOrReleased, inputSource);      // grabPinch의 리스너를 삭제한다. OnTriggerPressedOrReleased에 대한 이벤트를 삭제한다.
            }
        }

        /// <summary>
        /// grabPinch에 붙일 리스너 함수, Trigger버튼을 눌렀거나 땠을 때의 함수.
        /// </summary>
        /// <param name="fromAction">액션에 관련 된 매개변수. grabPinch와 같은 액션</param>
        /// <param name="fromSource">컨트롤러 관련 변수</param>
        /// <param name="newState">상태관련 변수</param>
        private void OnTriggerPressedOrReleased(SteamVR_Action_Boolean fromAction, SteamVR_Input_Sources fromSource, bool newState)
        {
            // 트리거가 해제되었다면, 반환.
            if (!newState)
            {
                return;
            }

            // SteamVR_Settings 파일에서 "입력 업데이트 모드"를 "OnLateUpdate"로 설정 한 경우에만 여기에서 직접 보정 할 수 있습니다. 라고 번역이 되는데. 그냥 trigger를 누르면, LateUpdate에서, calibrateFlag가 true라면, false로 만들고
            // 해당 카메라의 위치에 따라, scale을 보정한다.
            calibrateFlag = true;
        }

        // -0.143 , 0.158, -0.338

        private void LateUpdate()
        {
            // LateUpdate에서, 보정이 완료되었는 지 확인한다?
            if (!calibrateFlag)
            {
                return;
            }
            calibrateFlag = false;

            // 머리 타겟의 높이와, root의 높이를 비교하고 그 값을 스케일링 한다.
            float sizeF = (ik.solver.spine.headTarget.position.y - ik.references.root.position.y) / (ik.references.head.position.y - ik.references.root.position.y);
            ik.references.root.localScale *= sizeF * scaleMlp;
        }
    }
}

 

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함