개발/Unity

유니티 - 런타임에 단진자 운동 설정하기 (Runtime Independent Simple Pendulum)

피로물든딸기 2023. 3. 29. 15:51
반응형

Unity 전체 링크

 

참고

- 드래그로 오브젝트 움직이기

- 쿼터니언으로 구현한 단진자의 운동
- 쿼터니언으로 구현한 단진자의 운동 확장
- 독립된 단진자의 운동
- 런타임에 단진자 운동 설정하기

 

마우스로 단진자를 런타임에 이동시켜서 다시 단진자 운동이 되도록 해보자.

 

편의상 x는 0으로 고정한다. (오브젝트 드래그가 yz 평면만 가능하도록 한다.)

 

Start에서 했던 초기화를 initSettings로 모두 옮긴다.

startRot도 여기서 0으로 초기화한다.

    void initSettings()
    {
        float angle = Vector3.Angle(this.transform.position - pivot.position, Vector3.down);

        startAngle = 0.0f; endAngle = angle * 2;

        Vector3 normal
            = getNormal(pivot.position + Vector3.down, pivot.transform.position, this.transform.position);

        startPlaneNormal = normal;

        setPlane(pivot.position + Vector3.down, pivot.transform.position, this.transform.position);

        startPO = (this.transform.position - pivot.position).normalized;
        distance = Vector3.Distance(this.transform.position, pivot.position);

        startRot = 0.0f;
    }

 

드래그로 오브젝트 움직이기를 참고하여 마우스 이벤트를 아래와 같이 구현한다.

OnMouseUp이 실행되면 모두 초기화되고 새롭게 단진자 운동이 시작된다.

    void OnMouseDown()
    {
        isDragging = true;
    }

    void OnMouseDrag()
    {
        float distance = Camera.main.WorldToScreenPoint(transform.position).z;

        Vector3 mousePos = new Vector3(Input.mousePosition.x, Input.mousePosition.y, distance);
        Vector3 objPos = Camera.main.ScreenToWorldPoint(mousePos);

        objPos.x = 0;
        this.transform.position = objPos;
    }

    void OnMouseUp()
    {
        initSettings();
        isDragging = false;
    }

 

FixedUpdate에서는 Drag 중일 때는 실행되지 않도록 하면 된다.

    void FixedUpdate()
    {
        if (isDragging) return;
        ...

 

여기서는 speed가 일정하지만

줄의 길이와 중력에 따라 speed를 자동으로 변경하면 더 그럴듯한 단진자 운동을 구현할 수 있다.

 

위의 실행결과는 아래의 unitypackage에서 확인 가능하다.

DragSimpleHarmonicOscillator.unitypackage
0.03MB

 

 
반응형