[Graphics] SimpleMath

2025. 4. 21. 16:56·게임개발/Graphics

프로젝트 세팅

SimpleMath.inl
0.11MB
SimpleMath.cpp
0.01MB
SimpleMath.h
0.05MB

위 파일들을 그래픽스 파일 경로로 가져온다.

 

// 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_za⋅b=ax​bx​+ay​by​+az​bz​
  • 의미: 두 벡터의 방향 유사도 계산
    → 값이 클수록 같은 방향
  • 게임 예시:
    • 조명 계산 (빛 방향과 노멀 벡터)
    • 시야 안에 있는지 판단 (시야각 계산)

Cross() 

  • 수학:a⃗×b⃗=n⃗(n⃗은수직벡터)\vec{a} \times \vec{b} = \vec{n} \quad (\vec{n}은 수직 벡터)a×b=n(n은수직벡터)
  • 의미: 두 벡터에 수직인 벡터 반환
  • 게임 예시:
    • 카메라의 Right, Up, Forward 방향 계산
    • 평면의 노멀 구하기

Normalize()

  • 기능: 벡터의 방향만 유지하고 길이를 1로 정규화
  • 수학:v^=v⃗∣v⃗∣\hat{v} = \frac{\vec{v}}{|\vec{v}|}v^=∣v∣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)θ=cos−1(∣a∣∣b∣a⋅b​)
  • 게임 예시:
    • 시야 판정 (적이 플레이어를 바라보는가?)
    • 조준 보조 시스템

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)NR=V−2(V⋅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(1−t)⋅a+t⋅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
'게임개발/Graphics' 카테고리의 다른 글
  • [Graphics] GameObject, Transform, Component
  • [Graphics] SimpleMath 실습
  • [Graphics] 행렬
  • [Graphics] RasterizerState, SampleState, BlendState
Mingurii
Mingurii
minkyeong's devlog
  • Mingurii
    Mingurii
    Mingurii
  • 전체
    오늘
    어제
    • 분류 전체보기 (53)
      • 알고리즘 - 기초 (8)
        • 재귀 (0)
        • 누적합 (8)
        • 최소신장트리 (0)
      • 알고리즘 (32)
        • 구현 (0)
        • DP (30)
        • DFS, BFS (0)
        • 백트래킹 (0)
        • 투포인터 (2)
        • 이진탐색 (0)
        • 그리디 (0)
        • 다익스트라 (0)
        • 크루스칼, 프림 (0)
        • 위상정렬 (0)
        • 플로이드-워셜 (0)
        • 유니온 파인드 (0)
        • 세그먼트 트리 (0)
      • 게임개발 (11)
        • Gameplay Ability System (0)
        • Graphics (11)
        • Lyra 분석 (0)
        • 다크 앤 다커 클론 코딩 (0)
        • After the Farmer Sleeps (0)
      • 서버 (2)
        • 공부 (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    2167
    행렬
    2293
    그래픽스
    코딩테스트
    투포인터
    게임수학
    DP
    20438
    누적합
    9655
    DirectX11
    DX11
    코테
    백준
    서버
    2294
    1749
    c++
    알고리즘
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
Mingurii
[Graphics] SimpleMath
상단으로

티스토리툴바