본문 바로가기
IT 기술/Direct3D

Direct3D 벡터의 점, 라이브러리_3일차

by 썬's 2023. 1. 15.

안녕하세요 이번 시간에는 저번 시간에 배운 벡터의 내적과 외적에 이어

벡터의 위치를 나타내는 벡터의 점과 Direct3D에서 벡터와 관련해 사용하는 라이브러리 함수에 대해 알아보겠습니다.

※제 수업은 이전주차에서 배운 개념을 재차 설명하지 않습니다※


1. 벡터의 점

Direct3D에서 벡터는 크기와 방향을 가지는 선분과 같은 기하학적인 모양을 띈다고 했습니다.

이러한 벡터들은 2차원과 3차원 상에서 위치를 나타내야 하는 상황이 생길 수 있습니다.

하단 그림에 벡터 u와 v가 있습니다. 이 두 벡터는 크기와 방향을 가지지 않습니다.

단순히 특정 좌표계 기준으로 하나의 점 형태로 나타나 있습니다.

이 점이 벡터의 위치를 나타냅니다. 그리고 이와 같은 점을 위치벡터(점)라 부릅니다.

벡터의 위치벡터(점)

Direct3D에서 벡터의 점에 대한 연산이 가능합니다.

예를 들어 하단 그림에 벡터 u, v 그리고 a, b가 2차원 상에 위치벡터 형태로 그리고 벡터 c가 있다고 가정해 보겠습니다.

이 두 벡터의 덧셈은 아무의미가 없습니다. 하지만 두 벡터의 차로 벡터를 정의할 수 있습니다.

이를 그림으로 보면 다음과 같습니다.

  • 위치벡터 u에서 v를 빼면 이는 v에서 u로 향하는 벡터라고 볼 수 있습니다.
  • 위치벡터 b에서 벡터 c를 더하면 b가 c만큼 이동했을 때 도달하는 점이 a라고 볼 수 있습니다.

위치벡터(점) 연산


2. 벡터 XNA 라이브러리 기능

Direct3D에서는 3차원 벡터(x, y, z)를 나타내려면 XNA Math 라이브러리를 사용합니다.

XNA Math 라이브러리는 Direct3D에서 지원하는 수학 라이브러리 입니다.

이 라이브러리로 벡터 계산을 할 수 있습니다. XNA Math 라이브러리를 사용하려면 헤더 파일에 xnamath.h를 포함해야 합니다. 즉 Direct3D에서 #include <snamath.h>를 추가해 벡터 연산을 합니다.

 

Direct3D에서 제공하는 XNA Math 라이브러리에는 무수히 많은 벡터 형식이 있습니다.

저희가 이 형식을 모두 알면 좋지만, 저 역시 너무 많아 알지 못하고 현업에서는 이를 굳이 다 알아두어야 할 필요는 없습니다. 이 모든 것들을 공부하려면...저희가 갈 길이 너무 멉니다 ㅎㅎ 그러니 핵심적인 부분만 설명하겠습니다.

 

Direct3D에서 벡터는 XMVECTOR(128비트 형식)로 처리하며,

이 형식은 네 개의 32비트 부동 소수점 값들로 이루어져 있습니다.

하지만 실제 벡터를 계산할 때는 XMFLOAT2(2차원)이나 XMFLOAT3(3차원)을 사용하는 것이 좋습니다.

이러한 XMFLOAT 형식은 다음과 같습니다.

typedef struct_XMFLOAT2
{
  FLOATX;
  FLOATY;
}XMFLOAT2;

typedef struct_XMFLOAT3
{
  FLOATX;
  FLOATY;
  FLOATZ;
}XMFLOAT3;

하지만 벡터 연산을 하려면 XMFLOAT 형식을 직접 사용하는 대신 이를 XMVECTOR 형식으로 변환해야 합니다.

이를 위해 XNA MAth에는 여러 적재 함수를 제공합니다. 반대로 XMVECTOR 내 담긴 자료를 XMFLOAT 형식으로 변환하는 저장 함수도 제공합니다.

즉, 그냥 쉽게 말해 벡터의 계산은 XMVECTOR 인스턴스로 하지만, 그 전에 XMFLOAT을 XMVECTOR로 변환하는 과정을 선행해야 합니다.


3. XNA 라이브러리 적재 및 저장 함수

Direct3D에 XNA 라이브러리 적재 및 저장 함수는 다음과 같습니다.

그 전에 여러분들께 말씀드릴게 있습니다. 제가 지금 설명 드리는 함수들은 극히 일부이며, 

이 함수들이 현업에서 자주 사용되는 점에서 설명 드리는 겁니다. 이것들만 알아도 Direct3D를 다루는 데는 지장은 없으실 것입니다. 그리고 추가로 외우실 필요는 없습니다. 그냥 자주 보시며 필요할 때마다 가져다 쓰시면 됩니다.

추가로 내가 이러한 개념이 필요하다 싶으시면 향후 제가 설명해 드리겠습니다!!

 

XMFLOAT 자료를 XMVECTOR로 적재하는 함수

  • XMFLOAT2를 XMVECTOR에 적재
  • -> XMVECTOR XMLoadFloat2(value)
  • XMFLOAT3를 XMVECTOR에 적재
  • -> XMVECTOR XMLoadFloat3(value)
  • XMFLOAT4를 XMVECTOR에 적재
  • -> XMVECTOR XMLoadFloat4(value)

XMVECTOR 자료를 XMFLOAT 자료로 저장하는 함수

  • XMVECTOR를 XMFLOAT2으로 저장
  • -> void XMStoreFloat2(value)
  • XMVECTOR를 XMFLOAT3으로 저장
  • -> void XMStoreFloat3(value)
  • XMVECTOR를 XMFLOAT4으로 저장
  • -> void XMStoreFloat4(value)

이 외의 다른 자료 형식을 XMVECTOR로 적재하는 함수

  • 3원소 UINT 배열을 XMVECTOR에 적재
  • -> XMVECTOR XMLoadInt3(value)
  • XMCOLOR를 XMVECTOR에 적재
  • XMVECTOR XMLoadColor(value)

이 외의 XMVECTOR를 다른 자료 형식으로 저장하는 함수

  • XMVECTOR을 3원소 UINT 배열로 저장
  • -> void XMStoreInt3(value)
  • XMVECTOR를 XMCOLOR로 적재
  • -> void XMStoreColor(value);
  • XMVECOTR를 3원소 UINT로 적재
  • -> void XMStoreInt3(value);

XMVECTOR의 인스턴스 하나만 읽거나 변경

// 특정 성분(예. x축만 또는 y나 z축)만 읽는 경우

  • FLOAT XMVectorGetX(벡터 V);
  • FLOAT XMVectorGetY(벡터 V);
  • FLOAT XMVectorGetZ(벡터 V);

// 특정 성분만 변경하는 경우

  • XMVECTOR XMVectorSetX(벡터 V, FLOAT x);
  • XMVECTOR XMVectorSetY(벡터 V, FLOAT y);
  • XMVECTOR XMVectorSetZ(벡터 V, FLOAT z);

XMVECTOR 객체의 내용을 설정하는 용도로 제공되는 함수

  • XMVECTOR XMVectorZero(); // 영벡터를 반환
  • XMVECTOR XMVectorSplatone(); //벡터(1, 1, 1, 1)를 반환, 즉 단위벡터
  • XMVECTOR XMVectorSet(FLOAT x, FLOAT y, FLOAT z, FLAOT w); // 벡터(x, y, z, w)를 반환

이 외에도 중복적재된 함수나, 2차원 벡터나 4차원 벡터를 위한 함수, 라디안이나 단위 각도 등의 함수들이 있는데...

일단 여기까지만 알아두셔도 됩니다. 향후 필요한 개념은 제가 추가로 설명하겠습니다. 급하신 분들은 일단 다른 웹 사이트에서 찾아보시기를 권장합니다.


오늘은 Direct3D에서의 벡터의 위치를 나타내는 위치벡터와 XNA Math 라이브러리 함수를 알아봤습니다.

다음 시간에는 벡터를 마무리하고 요약해 보는 시간을 가지겠습니다.

이번 수업을 들어주시고 긴 글 읽으시느라 고생 많으셨습니다~~

댓글