프로젝트 세팅
위 파일들을 그래픽스 파일 경로로 가져온다.
// Types.h
#pragma once
#include <windows.h>
#include "DirectXMath.h"
#include "SimpleMath.h"
using int8 = __int8;
using int16 = __int16;
using int32 = __int32;
using int64 = __int64;
using uint8 = unsigned __int8;
using uint16 = unsigned __int16;
using uint32 = unsigned __int32;
using uint64 = unsigned __int64;
/* DirectX Math, XMFLOATN = N개의 float로 구성 */
//using Vec2 = DirectX::XMFLOAT2;
//using Vec3 = DirectX::XMFLOAT3;
//using Vec4 = DirectX::XMFLOAT4;
using Vec2 = DirectX::SimpleMath::Vector2;
using Vec3 = DirectX::SimpleMath::Vector3;
using Vec4 = DirectX::SimpleMath::Vector4;
using Matrix = DirectX::SimpleMath::Matrix;
/* DirectX Color */
using Color = DirectX::XMFLOAT4;
SimpleMath를 공부해보자.
1. 기초 벡터 수학
Vector3::Dot()
- 수학:a⃗⋅b⃗=axbx+ayby+azbz\vec{a} \cdot \vec{b} = a_x b_x + a_y b_y + a_z b_z
- 의미: 두 벡터의 방향 유사도 계산
→ 값이 클수록 같은 방향 - 게임 예시:
- 조명 계산 (빛 방향과 노멀 벡터)
- 시야 안에 있는지 판단 (시야각 계산)
Cross()
- 수학:a⃗×b⃗=n⃗(n⃗은수직벡터)\vec{a} \times \vec{b} = \vec{n} \quad (\vec{n}은 수직 벡터)
- 의미: 두 벡터에 수직인 벡터 반환
- 게임 예시:
- 카메라의 Right, Up, Forward 방향 계산
- 평면의 노멀 구하기
Normalize()
- 기능: 벡터의 방향만 유지하고 길이를 1로 정규화
- 수학:v^=v⃗∣v⃗∣\hat{v} = \frac{\vec{v}}{|\vec{v}|}
- 게임 예시:
- 이동 방향 계산
- 물체가 향하는 방향 벡터
Length() / LengthSquared()
- 의미: 벡터의 크기 (거리)
- Length()는 √까지 계산 → 정확
- LengthSquared()는 루트 생략 → 빠름 (비교용)
- 게임 예시:
- 거리 기반 공격 판정
- 두 점 사이 거리 비교 시 LengthSq() 추천
inline float Vector2::LengthSquared() const noexcept
{
using namespace DirectX;
XMVECTOR v1 = XMLoadFloat2(this);
XMVECTOR X = XMVector2LengthSq(v1);
return XMVectorGetX(X);
}
LengthSquared함수 : 벡터 v⃗=(x,y) 에 대해서 LengthSquared=x^2+y^2
제곱을 구하기 위해서는 벡터 자신과의 곱이 필요한데, 이는 곧 내적이다.
XMVector2LengthSq(v1)는 내적 함수이다.
inline XMVECTOR XM_CALLCONV XMVector2LengthSq(FXMVECTOR V) noexcept
{
return XMVector2Dot(V, V);
}
inline XMVECTOR XM_CALLCONV XMVector2Dot
(
FXMVECTOR V1,
FXMVECTOR V2
) noexcept
{
#if defined(_XM_NO_INTRINSICS_)
XMVECTORF32 Result;
Result.f[0] =
Result.f[1] =
Result.f[2] =
Result.f[3] = V1.vector4_f32[0] * V2.vector4_f32[0] + V1.vector4_f32[1] * V2.vector4_f32[1];
return Result.v;
Vector::AngleBetween
- 기능: 두 벡터 사이의 각도 계산
- 수학식:θ=cos−1(a⃗⋅b⃗∣a⃗∣∣b⃗∣)\theta = \cos^{-1} \left( \frac{\vec{a} \cdot \vec{b}}{|\vec{a}||\vec{b}|} \right)
- 게임 예시:
- 시야 판정 (적이 플레이어를 바라보는가?)
- 조준 보조 시스템
Vector::IsZero
- 기능: 벡터가 (0,0,0)인지 판단
- 게임 예시:
- 입력 없음 감지
- 이동 중인지 체크
Vector::ClampLength
- 기능: 벡터의 길이를 최대값 이하로 제한
- 게임 예시:
- 대시/달리기 속도 제한
- 물체 밀기/튕기기 구현 시 거리 제한
2. 공간 변환 : 월드 → 뷰 → 클립 → 화면 공간으로 좌표를 변환하는 과정
Transform() (Matrix * Vector)
- 기능: 행렬을 이용해 벡터를 변환
- 사용 예시:
- 로컬 좌표 → 월드 좌표 변환
- 뼈대 애니메이션에서 본(bone) 위치 계산
Matrix::CreateLookAt()
- 기능: 카메라가 특정 지점을 바라보게 하는 View 행렬 생성
- 파라미터: 카메라 위치, 타겟 위치, Up 벡터
- 게임 예시:
- 카메라 시점 처리
- 추적형 카메라 구현
Project() — 3D → 2D
- 기능: 3D 위치를 화면상의 2D 위치로 투영
- 필요 요소:
- 월드/뷰/프로젝션 행렬
- Viewport 정보
- 게임 예시:
- HP Bar를 머리 위에 위치시키기
- UI가 오브젝트를 따라다니는 시스템
Unproject() — 2D → 3D
- 기능: 화면 좌표를 월드 공간 좌표로 변환
- 게임 예시:
- 마우스 클릭 → 월드 위치 매핑
- RTS 게임 유닛 이동 위치 지정
- UI → 레이캐스트 시작점 결정
Matrix::Determinant
- 기능: 행렬식 계산 → 역행렬 존재 여부 확인
- 게임 예시:
- 계산 안정성 체크
- 스케일/좌표 변환의 안정성 평가
Matrix::Transpose
- 기능: 행과 열을 바꿈 (전치)
- 게임 예시:
- 쉐이더의 행렬 포맷이 다를 때 보정
Matrix::Inverse
- 기능: 역행렬 계산
- 게임 예시:
- 뷰 행렬 역산 → 카메라 위치 복원
- 모델 원위치 복원
Vector::TransformCoord
- 기능: 벡터에 행렬 적용해 위치 변환
- 게임 예시:
- 클립 공간에서 월드 좌표 복원
- 카메라 기준 좌표계에서 실제 위치 계산
3. 렌더링 / 조명 : 빛, 반사, 굴절, 색상 제어 등 화면 연출에 중요한 기능들
Reflect()
- 기능: 벡터를 평면에 대해 반사시킴
- 수학:R=V−2(V⋅N)NR = V - 2(V \cdot N)N
- 게임 예시:
- 총알 튕김
- 빛의 반사
- 거울 구현
Refract()
- 기능: 벡터가 굴절률을 기반으로 방향을 바꿔 통과
- 파라미터: 입사 벡터, 노멀, 굴절률
- 게임 예시:
- 물에 들어갈 때 왜곡되는 시야
- 투명 유리 뒤 사물 위치
Clamp()
- 기능: 값이 특정 범위를 넘지 않도록 제한
- 게임 예시:
- HP 최소/최대 고정
- 마우스 회전 각도 제한
- 밝기, 알파 값 범위 제한
Vector::Saturate
- 기능: 값을 [0, 1] 사이로 Clamp
- 게임 예시:
- 색상 범위 보정
- 알파값 정리
Vector::Pow
- 기능: 지수 연산
- 게임 예시:
- 감마 보정
- 비선형 조명 연산
Vector::Min/Max
- 기능: 여러 벡터 중 최소/최대값 선택
- 게임 예시:
- AABB 충돌 연산
- 범위 안에 위치하는지 확인
4. 회전 & 보간 : 부드러운 애니메이션, 자연스러운 전환, 회전에 필요한 수학
Lerp() — 선형 보간
- 기능: 두 값 사이를 t 비율만큼 선형으로 보간
- 수학:(1−t)⋅a+t⋅b(1 - t) \cdot a + t \cdot b
- 게임 예시:
- 위치/색상/각도 부드럽게 바꾸기
- 카메라 줌, 스무스 이동
Slerp() — 구면 보간
- 기능: 쿼터니언 사이의 회전을 부드럽게 보간
- 게임 예시:
- 캐릭터 회전 방향 자연스럽게 전환
- 시선 회전 애니메이션
Quaternion 관련
- 특징:
- 짐벌락 방지
- 부드러운 회전 누적
- 쿼터니언 → 행렬 변환 가능
- 게임 예시:
- 카메라의 자유로운 회전
- 본 애니메이션 회전 처리
- FPS 시야 컨트롤
Quaternion::LookRotation
- 기능: 특정 방향을 바라보는 회전 쿼터니언 생성
- 게임 예시:
- 캐릭터가 타겟을 향하게
- Unity에서도 동일한 기능 존재
Quaternion::ToAxisAngle
- 기능: 쿼터니언 → 축/각도로 변환
- 게임 예시:
- 회전 디버깅
- 본 회전 시 시각화
Math::SmoothStep
- 기능: Lerp보다 부드러운 보간 (S 곡선)
- 게임 예시:
- 카메라 움직임
- UI 애니메이션 트윈
Math::Bounce
- 기능: 물리적 탄성 움직임 시뮬레이션
- 게임 예시:
- UI 팝업 등장
- 점프 후 착지 반동
'게임개발 > Graphics' 카테고리의 다른 글
[Graphics] GameObject, Transform, Component (0) | 2025.04.30 |
---|---|
[Graphics] SimpleMath 실습 (0) | 2025.04.26 |
[Graphics] 행렬 (0) | 2025.04.21 |
[Graphics] RasterizerState, SampleState, BlendState (0) | 2025.04.10 |
[Graphics] Constant Buffer (0) | 2025.04.07 |