본문 바로가기
개발/Unity

유니티 - 쿼터니언 AngleAxis로 벡터 회전하기 (Rotate Vector with Quaternion AngleAxis)

by 피로물든딸기 2023. 7. 10.
반응형

Unity 전체 링크

 

참고

- 퍼블릭 변수 변경시 이벤트 발생

 

큐브점 A, Sphere점 B라고 하자.

이때 쿼터니언의 AngleAxis 메서드벡터 AB를 회전시켜보자.

 

빈 오브젝트를 만들고 AngleAxisText.cs를 추가한다.

 

기준이 되는 두 점과 변경할 각도를 선언한다.

    public Transform dotA, dotB;
    public float angle;

 

각도가 변경되면 즉시 반영되기 위해 OnValidate를 이용하였다.

아래 코드는 angle이 변할 때, 벡터 AB를 축을 기준으로 회전한다.

여기서 축은 XZ 평면이므로 XZ 평면의 노멀 벡터new Vector3(0, 1, 0)가 된다.

회전된 벡터 rot은 점 A의 원래 좌표 (startA)에 더해주면 된다.

    void OnValidate()
    {
        if(angle > 0)
        {
            Vector3 AB = startB - startA;
            Vector3 rot = Quaternion.AngleAxis(angle, new Vector3(0, 1, 0)) * AB;

            dotB.position = startA + rot;
        }
    }

 

게임을 실행해서 angle을 변경하면 벡터가 정상적으로 회전하는 것을 알 수 있다.

 

전체 코드는 다음과 같다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AngleAxisTest : MonoBehaviour
{
    public Transform dotA, dotB;
    public float angle;

    Vector3 startA, startB;

    void OnValidate()
    {
        if(angle > 0)
        {
            Vector3 AB = startB - startA;
            Vector3 rot = Quaternion.AngleAxis(angle, new Vector3(0, 1, 0)) * AB;

            dotB.position = startA + rot;
        }
    }

    void Start()
    {
        startA = dotA.position;
        startB = dotB.position;
    }
}

 

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

AngleAxisTest.unitypackage
0.03MB

 

반응형

댓글