[Unity] 벡터, 회전 정리

윤주원·2025년 6월 5일

유니티

목록 보기
1/5
post-thumbnail

벡터란?

게임 속에서 벡터는 방향과 크기를 가진 화살표

  • 절대좌표: (x, y, z)

  • 정확한 위치 (절대좌표)

    예: transform.position = new Vector3(3, 0, 5);

    • 게임 오브젝트가 위치한 고정된 지점을 나타냄.
  • 상대좌표

    예:Vector3.forward * 5

    • 바라보는 방향으로 5만큼 이동한다는 의미.
    • 상대적인 방향과 크기(길이)
  • A: (-1, 5, 2), (-3, 4), (-6, 8) 모두 방향이 같지만 크기는 다름

    • 각 크기 : 2.5, 5, 10
  • 크기 공식 : magnitude = Mathf.Sqrt(x² + y² + z²);

속력과 크기에 대한 오해

  • 예: (1, -1) 벡터는 크기 ≒ 1.414

    (3, -3) 벡터는 크기 ≒ 4.242

    → 크기만 3배지만, "속도" 자체가 3배는 아님

  • 예: (1, -1) * 10
    → 단순히 x10하면 크기는 1.414 * 10 = 14.14가 됨.
    -> 즉, 속도 10배벡터 * 10은 의미가 다름

즉, A의 방향으로 B의 속력 = 벡터 A * 스칼라 B인 표현은 틀림

→ 방향 벡터 사용.

정확한 표현을 위한 방법: 단위 벡터 (Normalized Vector)

  • 크기가 1인 벡터로 정규화 벡터라고도 함 Vector3 normalized = vector.normalized;
  • 정확한 표현 예시 “A 방향으로 속력 B만큼 이동” → velocity = A.normalized * B;

내적 (Dot Product)

두 벡터 사이의 각도 계산 또는 한 방향으로의 정렬도 측정, 반환 타입은 Scaler

  • 물체를 기울였을 때의 그림자의 길이라고 생각
  • 내적이 클수록 같은 방향, 작을수록 반대 방향
  • 한마디로 코싸인 삼각함수
각도내적 값
01
0~901 ~ 0
900
90~1800 ~ -1
180-1

활용 예:

  • 빛이 어떻게 사물에 비추는지
    (각도에 맞게 그림자나 조명을 조절)
    -> 값이 -1 이라도 빛의 값을 조금 더 줌.(빛이 반사하기 때문에)
  • 시야 안에 플레이어가 있는지 판단
  • 목표 방향과 현재 이동 방향이 얼마나 일치하는지 측정

외적 (Cross Product)

두 벡터에 수직인 방향의 벡터 반환, 반환 타입은 Vector3

→ 3D 회전, 법선 계산, 회전 방향 판단 등에서 사용

  • 벡터 곱 or 교차 곱이라고도 부름 Vector3 right = Vector3.Cross(up, forward);

유니티 Vector3

  • 구조체로 구성

🧱 구조체 vs 클래스

항목구조체 (struct)클래스 (class)
복사 방식값 타입 (값 복사됨)참조 타입 (주소 복사됨)
예시 설명Vector3 b = a; b.z += 1;a는 변하지 않음MyClass b = a; b.z += 1;a도 같이 변함

Unity의 Vector3는 구조체이기 때문에 다른 변수에 대입 후 값을 바꿔도 원본은 영향을 받지 않음.

벡터 예시

  • Vector3 * 스칼라
    • Vector3 a = (2,5,6);
    • a * 10 → (20,50,60)
  • Vector3.normalized : 해당 벡터와 방향이 같지만 크기가 1인 벡터 생성
    • Vector3 a = new Vector3(3,3,3);
    • Vector3 b = a.normalized; (0.6,0.6,0.6);
    • a.magnitude == 크기(거리 or 길이)
    • Vector3.Dot(a,b) == 내적
    • Vector3.Cross(a,b) == 외적

응용

  • currentPos(현재) (1,0,1)와 destPos(목적지) (5,3,5)가 있음
  • 방향 및 거리 : destPos - currentPos;
    • Distance함수 내장
  • 현 위치에서 10만큼 이동한 위치 구현
// dest로 향하는 방향 벡터
Vector3 dir = (destPos - currentPos).normalized; 
Vector3 newPos = dir * 10 + currentPos;

쿼터니언(사원소)

Transform의 회전(Rotation) 값은 vector가 아니라 Quaternion 타입

  • 짐벌락같은 이유로 회전 축이 겹치게 됨.

    →회전은 항상 “원래” 축을 기준으로 순서대로 처리됨.

  • transform.rotation = new Vector3(1,2,1); 은 오류!!

  • Quaternion.Euler(Vector3) 를 대신 대입

쿼터니언 특징

  • Quaternion끼리의 합은 *(곱)로 함.

    → 행렬이기 때문에.

  • (0,30,0)을 회전 후 (60,0,0)을 회전 VS (60,30,0)을 회전하는 것은 다름

    	-> 교환법칙 성립 안됨

곱셈 연산을 미리 해서 연산량을 줄일 수 있음.(곱셈 누적 연산)
→ 게임 최적화에 좋음

profile
안녕하세요

0개의 댓글