게임수학
-
기저(Basis)와 선형결합(Linear Combination)
GameMath 시리즈 #2 | 참고 도서: 이득우, 『게임 수학』 3장 1. 들어가며 데미지 텍스트는 적 머리 위에 뜹니다. 하지만 여러 개가 한 번에 뜨면 겹치니까 랜덤 오프셋을 줘서 분산시킵니다. 이 오프셋을 월드 좌표 기준(X, Y)으로 주면 카메라가 회전할 때 텍스트 배치가 어색합니다. 해결책은? 오프셋을 카메라 기준(Right, Up)으로 주는 것입니다. 그러면 카메라가 어떻게 회전하든 항상 화면 기준으로 예쁘게 분산됩니다. 2. 기저(Basis)란? 기저는 공간을 표현하는 선형 독립인 벡터의 집합입니다. 2D 평면의 표준 기저 ..
-
역원과 상대 좌표
시리즈 1/3 | 참고 도서: 이득우, 『게임 수학』 2장 1. 들어가며 TargetLocation - SourceLocation 같은 벡터 뺄셈은 매일 쓰는 코드입니다. 하지만 이 간단한 연산 뒤에 숨은 수학적 의미를 이해하면, 넉백(Knockback)과 풀(Pull) 같은 메커니즘을 실수 없이 구현할 수 있습니다. 2. 역원(Inverse)이란? 수학에서 어떤 수 a에 대해, a + b = 0이 되는 b를 a의 덧셈 역원이라고 합니다. 5의 역원은 -5 -3의 역원은 3 그래서 뺄셈 A - B는 사실 A + (-B)로 정의됩니다...
-
내적과 외적의 활용
게임 개발에서 벡터 연산은 필수입니다.특히 내적과 외적은 캐릭터 시야 판정, 조명 계산, 물리 시뮬레이션 등 거의 모든 곳에 사용됩니다. 내적 (Dot Product)두 벡터 간 각도 계산투영(Projection) 계산조명 계산 (Lambert Shading)외적 (Cross Product)수직 벡터 생성면의 법선 벡터 계산회전 방향 결정 (좌우 판정) 1. 내적(Dot Product)수학적 정의두 벡터 A, B의 내적은 스칼라 값을 반환합니다.A · B = |A| × |B| × cos(θ)좌표계에서는:A · B = (Ax × Bx) + (Ay × By) + (Az × Bz)핵심 특성결과는 스칼라: 벡터가 아닌 숫자 하나가 나옵니다각도 관계를 알려줌:내적 > 0: 예각 (같은 방향)내적 = 0: 직각 (..
-
회전변환행렬
정의 :선형 변환에서 회전변환행렬(Rotation matrix)은 임의의 행렬을 원점을 중심으로 회전시킨다.회전변환행렬(Rotation matrix)은 선형 변환의 성질중 하나이며,동시에 여러 회전변환행렬중 일부는 대칭변환행렬 즉 반사행렬(Reflection matrix)과 관련이 있다. 회전각도( Θ 값 )가 커지거나 작아짐에 따라 x' , y'의 좌표가 바뀐다. 컴퓨터 그래픽에서의 사용: 1) 폰트 그래픽의 회전 2) 레이캐스팅 광선의 방향: 플레이어위치벡터(pos) + 방향벡터(dir) + 화면에 렌더되는 카메라 평면벡터(plane) ( 방향벡터 ) + ( 카메라평면 x 배수 ) 이다. 방향벡터와 카메라 평면벡터를 회전하는 각도(a)에 따라 회전행렬을 곱해주면 광선의 방향..
언리얼 엔진
-
[UE5/GAS] NetSerialize 오버라이딩과 구조 개선을 통한 네트워크 패킷 경량화
언리얼 GAS기반의 멀티플레이어 전투를 구현하며 겪은 네트워크 대역폭 이슈를 분석하고, NetSerialize 오버라이딩(Bit-Packing, Quantization)과 Server Authority 구조를 통해 패킷 크기를 70% 이상 경량화한 과정을 정리합니다. 1. 문제 상황: "기능은 작동하는데, 패킷이 너무 무겁다"프로젝트에서 GAS를 활용해 화려한 스킬과 넉백(Knockback), 상태이상 시스템을 구현했습니다. 초기에는 기능 구현에 집중하다 보니, 스킬 적중 시 발생하는 데이터(FGameplayEffectContext)에 모든 정보를 담아서 RPC로 전송하고 있었습니다.🛑 병목지점 분석네트워크 프로파일링을 해보니, 단순한 평타/스킬 적중 시에도 순간적으로 대역폭이 튀는 현상이 발생했습니다..
-
언리얼 엔진 리플렉션 시스템의 기본 개념
리플렉션(Reflection) 시스템은 언리얼 엔진의 핵심 기술 중 하나로, 간단히 말해 프로그램이 실행 중에 자기 자신의 구조와 데이터를 조사하고 조작할 수 있게 해주는 메커니즘입니다. C++에는 기본적으로 리플렉션 기능이 없기 때문에, 언리얼 엔진은 자체적인 리플렉션 시스템(프로퍼티 시스템)을 구현했습니다.핵심 개념런타임 타입 정보프로그램이 실행 중에 클래스, 구조체, 함수, 변수 등의 타입 정보에 접근할 수 있습니다.이를 통해 코드가 자신의 구조를 "인식"하고 그에 따라 작동할 수 있습니다.메타데이터 시스템클래스나 프로퍼티에 추가 정보(메타데이터)를 붙일 수 있습니다.이 메타데이터는 에디터에서의 표시 방법, 네트워크 동작, 직렬화 방법 등을 지정합니다.자동 생성 코드개발자가 특수 매크로(UCLASS..
-
애니메이션 몽타주(Animation Montage)란?
하나 이상의 애니메이션 시퀀스들을 조합하고, 여기에 추가적인 제어 기능을 더한 애셋입니다.일반 애니메이션 시퀀스가 단순히 하나의 움직임을 재생한다면,몽타주는 이런 움직임들을 엮어서 더 복잡하고 긴 동작을 만들거나, 특정 상황에 맞는 애니메이션을 좀 더 세밀하게 제어하고 싶을 때 사용해요.주요 특징 및 기능:여러 애니메이션 조합: 여러 개의 애니메이션 시퀀스를 순차적으로 또는 선택적으로 재생할 수 있습니다. 예를 들어, 공격 콤보를 만들 때 첫 번째 공격 애니메이션, 두 번째 공격 애니메이션을 몽타주 하나에 담을 수 있어요.섹션 (Sections): 몽타주 내에 여러 개의 "섹션"을 만들고 이름을 붙일 수 있습니다. 코드나 블루프린트에서 특정 섹션부터 재생하거나, 섹션끼리 점프하거나, 특정 섹션만 반복하는..
-
Union과 FVector
GameMath 시리즈 #3 | 참고 도서: 이득우, 『게임 수학』 실습 코드 1. 들어가며 언리얼의 FVector는 MyVector.X로도, MyVector[0]으로도 접근 가능합니다. 이 "마법" 뒤에는 C++의 union이라는 메모리 기법이 숨어있습니다. 2. 문제: 가독성 vs 확장성 일반적인 구조체 struct Vector2 { float X; float Y;};Vector2 v;v.X = 1.0f; // ✅ 읽기 쉬움 하지만 반복문에 불편합니다: // ❌ 각 성분에 같은 연산v.X *= 2.0f;v.Y *= 2.0f;v.Z *= 2.0f; // 3..
C++
-
복사생성자, 상속, 다형성
복사생성자복사생성자는 선언하지 않아도 컴파일러가 기본으로 생성해준다.복사생성자가 쓰이는 경우1. 같은 종류의 객체로 초기화할때2. 객체를 함수에 전달할때3. 함수에서 객체를 반환할때 복사는 얕은복사, 깊은복사가 있는데얕은복사 -> 주소 값을 복사한다. 같은 메모리 공간을 공유하고있음. 깊은복사 -> 새로운 메모리 공간에 할당하여 복사해줌.복사생성자에서 동적생성을 한다면 메모리를 공유하는 객체가 소멸되면 같은 주소를 가지는 다른 객체의 메모리도 날아가는 상황이 발생할수있음. 이럴때 직접 복사생성자를 선언해야함(깊은 복사) 상속클래스의 중복을 최소화하고 재사용을 위해 사용한다. (is-a)관계자식클래스가 private을 제외한 부모클래스의 모든 멤버함수, 변수를 상속받음. public, protected ..
-
SOLID 원칙
SOLID 원칙은 유지보수성과 확장성이 뛰어난 소프트웨어를 설계하는 데 도움을 주는 객체 지향 설계 원칙이다.SOLID는 다음 5가지 원칙의 앞글자를 따서 만든 약어다.대부분의 디자인패턴은 solid원칙을 기반으로 파생되었다.Single Responsibility Principle (SRP) - 단일 책임 원칙Open/Closed Principle (OCP) - 개방-폐쇄 원칙Liskov Substitution Principle (LSP) - 리스코프 치환 원칙Interface Segregation Principle (ISP) - 인터페이스 분리 원칙Dependency Inversion Principle (DIP) - 의존 역전 원칙1. 단일 책임 원칙 (Single Responsibility Princ..
-
RAII 패턴과 스마트 포인터의 동작 원리
[RAII 패턴]지난 글에서 스마트 포인터의 종류와 사용법을 살펴봤습니다. 이번에는 스마트 포인터가 어떻게 자동으로 메모리를 관리하는지, 그 핵심 원리인 RAII 패턴에 대해 알아보겠습니다.RAII란 무엇인가?RAII(Resource Acquisition Is Initialization)는 "자원 획득은 초기화다"라는 의미로, C++의 가장 중요한 프로그래밍 기법 중 하나입니다. 핵심 개념은 간단합니다.객체 생성 시(생성자): 자원을 획득합니다.객체 소멸 시(소멸자): 자원을 자동으로 해제합니다.C++에서는 스택에 생성된 객체가 스코프를 벗어나면 자동으로 소멸자가 호출됩니다. RAII는 이 특성을 활용하여 자원 관리를 자동화합니다. void Function(){ std::unique_ptr ptr..
-
포인터, 메모리 영역
C++ 포인터와 동적 메모리 관리 📌 변수의 4가지 속성 1) 이름: 변수를 식별하는 이름 2) 값: 변수에 저장된 데이터 3) 메모리 크기 (타입): int, float 등의 데이터 타입 4) 메모리 주소 (&): 메모리 상의 위치 포인터란? 메모리 주소를 값으로 가지는 변수(데이터 타입)입니다. 💡 역참조 (Dereference): 포인터가 가리키고 있는 (담고있는) 메모리 주소의 값에 접근하는 것 메모리 주소를 값으로 가져야 하는 이유? 스코프 외부 접근: 변수..
자료구조 / 알고리즘
-
[자료구조] 해시 테이블(Hash Table)
[해시 테이블(Hash Table)] 1. 정의해시 테이블: Key-Value 쌍으로 데이터를 관리하는 자료구조.핵심: Key를 통해 Value에 평균 O(1) 시간 복잡도로 접근(탐색, 삽입, 삭제) 가능.2. 기본 구성 요소해시 함수 (Hash Function): Key를 입력받아 배열의 인덱스(해시 값)를 반환하는 함수.버킷 (Bucket): 데이터가 실제로 저장되는 배열의 각 슬롯.3. 해시 충돌 (Hash Collision)정의: 서로 다른 Key가 해시 함수를 통해 같은 인덱스를 반환하는 현상.필요성: 충돌은 필연적으로 발생하므로, 이를 해결하는 매커니즘이 필수적.4. 충돌 해결 방안가. 체이닝 (Chaining)방식: 동일한 버킷의 데이터에 대해 자료구조를 활용해 추가 메모리를 사용하여 다음..
-
스택/큐/우선순위큐
자료구조 큐의 특징을 활용한 실습 문제를 풀었다. 벡터를 스택처럼 사용해서 진행했다. 문제 1) N명의 마을사람이 있다. 마을에는 사람과 외계인이 섞여있다.사람은 진실만을 말하지만 외계인은 거짓말을 할수 도 있다. 마을 사람들은 각자 자기가 사람이라고 생각하는 사람들을 지목한다. 첫번째 줄에 마을사람의 수를 입력받고 , 둘째 줄 부터는 I번째 사람이 M명을 지목하고 지목당한 사람들을 말한다. //마을 1301 2 14 132 8 1 7 19 15 4 5 10 123 2 1 24 6 30 27 20 9 8 75 10 11 12 13 14 15 16 17 18 19 206 5 5 4 3 2 17 7 1 13 14 20 29 8 118 5 11 29 17 14 209 5 19 16 17 13 1410 4..
-
이진탐색트리
코드:#include using namespace std;// 이진 탐색 트리의 노드 구조체struct TreeNode { int key;// 노드의 값 TreeNode* left; // 왼쪽 자식을 가리키는 포인터 TreeNode* right; // 오른쪽 자식을 가리키는 포인터 TreeNode(int val) : key(val), left(nullptr), right(nullptr) {}};// BST 클래스 정의class BST {public: TreeNode* root; BST() { root = nullptr; } // 노드 삽입 함수 TreeNode* insert(TreeNode* node, int key) { if (node..
-
연결리스트 구현, 버블정렬, 병합정렬
리스트 개념: 연결리스트 별거없다 배열과 다르게 인덱스가 아니라 포인터로 이어져있는 자료구조다.노드의 주소를 이용해서 동적으로 데이터를 저장하는 구조이다.노드에는 다음노드를 가리키는 주소와 노드에 저장된 값이 들어있다. 이중연결리스트는 이전노드를 가리키는 주소값만 추가하면된다.노드구조체에는 이전값을 가리키는 prev, 다음값을 가리키는 next, 노드가 가지는 값 value 가 들어간다.처음노드는 보통 Head라고 하고 맨뒤 노드는 Tail이라고한다. Head는 시작노드를 가리키고 맨뒤노드는 Tail을 가리킨다. 리스트의 장점: 리스트는 삽입삭제가 뛰어난 자료구조이다.배열과 다르게 메모리상에 연속된 자료구조는 아니지만 인덱스로 접근하기 때문에 삽입삭제가 쉽다. 구현한 리스트의 기능: 배열에서도 가..
그래픽스
-
이미지 압축
우리가 쓰는 이미지 파일들, 어떻게 압축되는 걸까?우리는 JPG, PNG, GIF, SVG, RAW 등 정말 다양한 형식의 이미지 파일을 쓰고 있습니다.그런데 이 파일들은 어떤 원리로 만들어지고 압축되는 걸까요?그 과정을 차근차근 알아보겠습니다.먼저 RAW파일이 뭔지부터 알아야한다. 이미지 압축을 이해하려면 먼저 RAW 파일이 무엇인지 알아야 합니다. 이름처럼 '날것' 그대로인 데이터죠.RAW 파일은 디지털카메라나 스캐너의 이미지 센서가 빛을 감지한 최소한으로 처리된 원본 데이터를 담고 있습니다.아직 화이트밸런스, 색 공간 같은 것들이 정해지지 않은, 순수하게 빛의 세기 정보만 가진 상태입니다.그래서 바로 편집하거나 인쇄하기에는 적합하지 않죠.우리가 흔히 보는 JPG, PNG 같은 파일들은 모두 이 R..
-
레이캐스팅으로 2.5d 맵 만들기
https://github.com/365kim/raycasting_tutorial/blob/master/2_basics.md raycasting_tutorial/2_basics.md at master · 365kim/raycasting_tutorial(한글) 레이캐스팅 튜토리얼 번역. Contribute to 365kim/raycasting_tutorial development by creating an account on GitHub.github.com레이캐스팅 튜토리얼을 보며 학습했습니다. 레이캐스팅은 2차원맵에서 3차원의 원근감을 보여주는 2.5d 기법입니다.울펜슈타인3d, 둠같은 예전 게임들은 컴퓨터 성능이 좋지않아서 3d엔진을 실시간으로 실행할 수 없었습니다. 그래서 3d인척하는 레이캐스팅 기법..
게임 서버
-
게임 동기화 방식) 최종 일관성 , 서버 되감기 기법
CAP 정리를 통한 게임 동기화 NDC 발표자료 학습 내용 정리 및 언리얼 엔진 적용 🔹 CAP Theorem 기본 개념 분산 시스템에서는 다음 3가지 속성 중 최대 2가지만 동시에 만족할 수 있습니다. 일관성 (Consistency): 모든 노드가 같은 시점에 같은 데이터를 보는 것 가용성 (Availability): 시스템이 항상 응답 가능한 상태를 유지하는 것 분할용인 (Partition Tolerance): 네트워크 분할 상황에서도 시스템이 동작하는 것 💡 핵심: 멀티플레이..
-
데드 레커닝, 엔티티 보간
온라인 멀티플레이어 게임을 개발할 때 가장 중요한 기술 중 하나가 캐릭터 이동의 동기화입니다.오늘은 흔히 사용되는 두 가지 기법인 데드 레커닝(Dead Reckoning)과 엔티티 보간(Entity Interpolation)을 중심으로,언리얼 엔진에서 이를 어떻게 처리하는지 살펴보겠습니다. 클라이언트-서버 아키텍처에서의 이동 동기화멀티플레이어 게임은 일반적으로 신뢰할 수 있는 서버(Authoritative Server) 구조를 사용합니다. 서버가 모든 게임 상태에 대한 최종 권한을 가지며, 클라이언트는 입력만 서버로 전송합니다.예를 들어, 사용자가 W 키를 눌러 앞으로 가는 입력을 하면:클라이언트는 "앞으로 가고 싶다"고 서버에 요청합니다.서버는 이를 확인하고, 실제 위치를 업데이트한 뒤 다시 클라이..
호기심뱅크
-
3d 멀미는 왜 나는걸까
3D 멀미란?3D 멀미는 화면 속 가상 움직임과 실제 몸의 움직임 사이에 감각 불일치가 생길 때 발생하는 두통, 어지러움, 구역감 등의 증상. 주로 1인칭 게임, VR, 저프레임 3D 게임에서 흔히 나타남 신작공포게임 데모를 플레이했는데 10분정도 플레이했는데 멀미가 나서 당황했다. 몬헌, 엘든링, 툼레이더를 몇십시간을 했을때도 멀미가 안났는데 갑자기 3d멀미? 당황해서 원인을 찾았다. 🧠 왜 멀미가 생길까? 인간의 뇌는 눈으로 보이는 움직임과 몸의 실제 움직임이 불일치할 때 멀미를 느껴요.공포 인디 게임은 긴장감을 위해 이질적인 시각 효과나 특수 카메라 연출을 일부러 많이 씁니다.이게 현실 움직임과 괴리감을 줘서 뇌가 "몸에 문제가 생겼다" 판단 → 멀미 유발🎯 멀미가 심해진 이유: 대작 게..
-
니케 - 길찾기
얼마전 A* 알고리즘을 배웠다. 니케에서도 길찾기 알고리즘이 적용되고 있다 휴리스틱 함수는 알수 없지만대각선이동이 가능한걸 보면 유클리드 거리를 사용했을 것 같다.또한 타일맵에서 맵경계, 장애물의 활성화 유무를 체크하고 이동경로를 체크할 것 같다.
-
파이썬 문자열 파싱을 이용해서 이미 푼 백준문제 깃허브연동하기
백준허브가 private으로 설정해놔서 3주간 깃허브에 푼문제가 올라가지 않았다.. 자동으로 링크를 넘겨주는 익스텐션인데 이걸 사용하면 1분만에 이미 푼문제들을 올릴 수있다. 첨부할 링크는 해당 맞은문제의 채점화면이다. https://www.acmicpc.net/status?from_mine=1&problem_id={문제번호}&user_id={본인의 아이디} 채점화면의 링크는 이런식으로 구성되어있다. 이제 문제번호만 긁어오면 끝이다. 하지만 채점현황을 보면 문제번호뿐만아니라 여러가지 정보들이 포함되어있다. 그래서 파이썬 코드로 문자열 파싱을 통해 문제번호만 가져와서 채점화면링크에서 문제번호만 바뀐 링크들을 가져오려고한다. 입력 파일: 코드:# 파일에서 데이터를 읽어오기 (인코딩 명시)with op..
-
게임업계 2025 키워드 : 'IP', 'AI' , 'MCP'..?
2025년 게임업계의 키워드는 'IP' 와 '신기술'인 것 같다.출처기사: https://www.thegames.co.kr/news/articleView.html?idxno=338929크래프톤대규모 투자 계획: 김창한 대표는 주주총회에서 향후 5년간 매년 최대 3,000억원씩 총 1조 5,000억원을 자체 개발 신작에 투입하겠다고 발표성장 목표: 5년 내 매출 7조원 달성 목표 제시실적 현황: 지난해 영업이익 1조 1,800억원으로 최대 실적 달성핵심 IP 전략: '인조이'(인디언)와 '눈물을 마시는 새'를 대표 프랜차이즈로 육성 계획주주 환원: 배당 확대, 내년 주총에서 새로운 3개년 주주환원 정책 발표 예정시장 위상: 국내 게임사 중 매출·영업이익 최대 규모, 넥슨의 영업이익을 뛰어넘는 성과해외 실..