STUDY/Game Graphic

[3D 그래픽의 수학적 기초] 1. 벡터

minari 2022. 2. 14. 22:52

DirectX로 시작하는 3D 게임 프로그래밍(이용희 지음)

해당 영상과 글을 통해 공부하며 정리한 글입니다


3D 그래픽을 공부하려고 보니까 선형대수를 몽땅 잊어먹었다ㅋㄲㄲㅋ 안 웃겨요 . .

그래서 다시 정리하는 벡터와 행렬 !

💠벡터

벡터란 공간상의 한 점 또는 방향과 크기를 표현하는 개념이다.

3차원 벡터는 다음과 같은 자료구조로 표현할 수 있다.

// 3차원 벡터
class CVector
{
public:
    float x;
    float y;
    float z;
};

[1] 벡터의 연산

벡터의 합

CVector AddVector3D(CVector A, CVector B)
{
    CVector C;
    C.x = A.x + B.x;
    C.y = A.y + B.y;
    C.z = A.z + B.z;
    return C;
}

백터의 차

CVector SubtractVector3D(CVector A, CVector B)
{
    CVector C;
    C.x = A.x - B.x;
    C.y = A.y - B.y;
    C.z = A.z - B.z;
    return C;
}

벡터의 차는 교환법칙이 성립하지 않음!

벡터 A = (x, y, z)의 크기 |A|는

CVector VectorMultiply3D(CVector A, float scalar)
{
    CVector C;
    C.x = A.x * scalar;
    C.y = A.y * scalar;
    C.z = A.z * scalar;
    return C;
}

벡터의 정규화(Normalization) 단위벡터로 변환하는 것이다. 단위벡터는 벡터의 크기가 1인 벡터!

벡터 A = (x, y, z)의 정규화는

CVector VectorNormalize3D(CVector A)
{
    float length = VectorLength3D(A);
    A.x = A.x * length;
    A.y = A.y * length;
    A.z = A.z * length;
    return A;
}

[2] 단위 벡터의 응용

벡터의 차를 활용하여 객체 A를 객체 B 방향으로 fDistance만큼의 이동을 나타내는 벡터를 반환하는 함수

CVector MoveObjectFromAToB(CVector vObjA, CVector vObjB, float fDistance)
{
    CVector vDirection;
    vDirection = vObjB - vObjA;
    VectorNormalize3D(vDirection);
    vObjA.x += vDirection.x * fDistance;
    vObjA.y += vDirection.y * fDistance;
    vObjA.z += vDirection.z * fDistance;
    return (vObjA);
}

점 A에서 점 B로 객체를 이동할 때, 이동 방향은 (B - A) 벡터의 단위 벡터이다.

[3] 벡터의 내적

여기까지는 기억나서 정리하기 귀찮긴한데.. 내일 추가하겠습니다 ^^7