관리 메뉴

caLAB

pinch Interaction 시뮬레이션(zoom, rotation) 본문

Unity/유니티 개발

pinch Interaction 시뮬레이션(zoom, rotation)

도이(doi) 2021. 8. 25. 00:05
728x90

휴대폰에 build해서 테스트 하기 귀찮아서 

원래 터치로 하는 pinch 인터렉션 로직 변형해서 PC에서 테스트 하도록 만들었다. 

 

pinch pos는 pointA랑 pointB가 일정한 가까운 거리에 있을 때 두 point 중간값으로 타겟 오브젝트 이동하게 개발.

 

pinch zoom in zoom out은 pointA와 pointB 사이의 거리를 타겟 오브젝트의 사이즈와 연동시킴.

 

pinch rotate는 current point A와 B의 뺄셈을 통해서 방향벡터를 구한 후에 prev point A와 B의 뺄셈 방향벡터 즉, 

prev Vector(A to B)와 current Vector(A to B) 사이의 각도를 구한 후에 타겟 오브젝트의 회전값과 연동시킴.

 

using UnityEngine;

public class touchScript : MonoBehaviour
{
    public float ZoomMax;
    public float ZoomMin;
    public float Sensitivity = 0.0045f;

    public Transform chgObj;
    public Transform touchDummyA;
    public Transform touchDummyB;

    private void Update()
    {
        PinchRotate();
        PinchZoom();
        PinchPos();
    }

    private void PinchPos()
    {
        float dist = Vector3.Distance(touchDummyB.position, touchDummyA.position) * Sensitivity;
        //Debug.Log(dist);
        if (dist < 1.5f)
        {
            var pos = Vector3.Lerp(touchDummyA.position, touchDummyB.position, 0.5f);
            chgObj.position = pos;
        }
    }
    private void PinchZoom()
    {
        float dist = Vector3.Distance(touchDummyB.position, touchDummyA.position);
        dist *= Sensitivity;
        dist = Mathf.Clamp(dist, ZoomMin, ZoomMax);
        //Debug.Log(dist);
        chgObj.localScale = new Vector3(dist, dist, dist);
    }

    private Vector3 currPosA;
    private Vector3 currPosB;
    private Vector3 prevPosA;
    private Vector3 prevPosB;

    private void PinchRotate()
    {
        currPosA = touchDummyA.position;
        currPosB = touchDummyB.position;

        float angle = Vector3.SignedAngle(currPosA - currPosB, 
                                          prevPosA - prevPosB, 
                                          chgObj.transform.forward);
        //Debug.Log(angle);
        chgObj.transform.RotateAround(chgObj.transform.position, -chgObj.transform.forward, angle);

        prevPosA = currPosA;
        prevPosB = currPosB;
    }
}

 

 

728x90
반응형
Comments