Computer Science18 게임 수학 | 2부 콘텐츠 제작 기초 | 06장 아핀 공간 06장 아핀 공간: 움직이는 가상 세계의 구축 6.1 아핀 공간 벡터 공간에서 이동 변환을 행렬 곱으로 표현하기 위해서 마지막 차원 값을 1로 한정한 부분 공간을 아핀 공간(affine space)라고 한다. 원래 행렬 곱으로는 이동 변환을 표현할 수 없다. 하지만 차원 값이 항상 1인 새로운 차원을 도입하면 가능하다. 이동 변환 행렬(translate transformation matrix) 이동 변환 행렬은 선형 변환의 일종인 전단 변환을 응용한 것이다. 1차원에서 y = 1이라는 조건에서 a만큼 미는 전단 변환은 x + a로 나타난다. 2차원에서 z = 1이라는 조건에서 (a, b)만큼 미는 전단 변환은 (x + a, y + b)로 나타난다. n차원에서 n + 1차원으로 차원을 높여 설계한 선형 변.. 2023. 2. 17. 3D 게임 프로그래밍 | Part 01 기초 필수 수학 | Chapter 01 벡터 대수 1.1 벡터 벡터(vector)는 크기와 방향을 가진 수량(quantity)을 가리키는 말이다. 벡터는 힘이나 변위, 그리고 속도를 나타내는 데 쓰인다. 벡터를 기하학적으로 방향이 있는 선분, 지향 선분(directed line segment)으로 표시한다. 선분의 길이는 벡터의 크기를, 선분 끝의 화살표는 벡터의 방향을 나타낸다. 길이가 같고 같은 방향을 가리키는 벡터는 서로 같은 벡터이다. 1.1.1 벡터와 좌표계 벡터를 그 꼬리가 3차원 좌표계의 원점과 일치하도록 이동하면 벡터 v를 (x, y, z)로 표기할 수 있다. 이렇게 3차원 벡터를 컴퓨터 프로그램 안에서 세 부동소수점(float, double)으로 표현할 수 있다. 참고 기준계(frame of reference), 공간(space) 그리고.. 2023. 1. 22. 게임 프로그래밍 패턴 | Chapter 04 관찰자 패턴 4. 관찰자 패턴 4.1 예제: 업적 달성 업적(achievement) 시스템을 게임에 추가한다고 해보자. 업적 종류가 광범위하고 달성할 수 있는 방법도 다양하다 보니 업적 시스템 코드를 담당하는 코드는 한데 모아두는 게 좋다. 그런데 업적은 여러 게임 플레이 상황에서 발생시킬 수 있어야 한다. 이런 코드 전부와 커플링되지 않고 업적 코드를 동작하게 하려면 관찰자 패턴(observer pattern)을 쓰면 된다. 4.2 작동 원리 ■ 4.2.1 관찰자 Observer 클래스는 다음과 같은 인터페이스로 정의된다. 어떤 클래스든 Observer 인터페이스를 구현하기만 하면 관찰자가 될 수 있다. class Observer { public: virtual ~Observer() = default; virtua.. 2022. 8. 8. 게임 프로그래밍 패턴 | Chapter 03 경량 패턴 3. 경량 패턴 3.1 예제: 숲에 들어갈 나무들 우리가 실시간 게임에서 볼 수 있는 수천 그루가 넘는 나무들로 가득 찬 빽빽한 숲은 각각 수천 폴리곤의 형태로 표현되어 있다. 이런 숲을 그리기 위해서 나무마다 필요한 데이터를 코드로 표현하면 다음과 같다. class Tree { private: // 줄기, 가지, 잎의 형태를 나타내는 폴리곤 메시 Mesh mesh; // 나무 껍질과 잎사귀 텍스처 Texture bark; Texture leaves; // 숲에서의 위치와 방향 Vector position; double height; double thickness; // 나무가 서로 다르게 보이도록 음영을 조절 Color barkTint; Color barkTint; }; 그런데 사실 숲에 나무가 수천 .. 2022. 8. 5. 게임 프로그래밍 패턴 | Chapter 02 명령 패턴 2. 명령 패턴 명령 패턴(command pattern)은 메서드 호출을 실체화(reify)한 것이다. 실체화 혹은 일급(first-class)은 어떤 개념을 변수에 저장하거나 함수에 전달할 수 있도록 데이터, 즉 객체로 바꿀 수 있다는 것을 의미한다. 여기에서 명령 패턴은 메서드 호출을 객체로 만들었다는 의미이다. 2.1 예제: 입력 키 변경 모든 게임에서는 버튼이나 키보드, 마우스를 누르는 등의 사용자 입력을 읽는 코드가 있다. 이런 코드는 입력을 받아서 게임에서 의미 있는 행동으로 전환된다. 입력 단축키를 변경할 수 없게 하려면 다음과 같이 간단하게 구현하면 된다. void InputHandler::handleInput() { if (isPressed(BUTTON_X) jump(); else if .. 2022. 8. 4. 게임 프로그래밍 패턴 | Chapter 01 구조, 성능, 그리고 게임 1. 구조, 성능, 그리고 게임 1.1 소프트웨어 구조 ■ 1.1.1 좋은 소프트웨어 구조 좋은 소프트웨어 구조란, 무언가를 고쳐야 할 때 그럴 줄 알았다는 듯이 코드가 준비되어 있는 것을 의미한다. 즉, 코드를 거의 건드리지 않고도 적당한 함수를 호출하면 원하는 작업을 할 수 있어야 한다. 먼저 구조는 변경과 관련이 있다. 얼마나 코드를 쉽게 변경할 수 있느냐가 코드 설계를 평가하는 척도가 된다. ■ 1.1.2 코드를 고치는 방법 무슨 이유에서든지 코드를 고쳐야 한다면 먼저 기존 코드를 이해해야 한다. 머릿속에 코드에 대한 큰 그림을 그리고 나면 해결책을 금방 찾을 수 있다. 컴파일이 성공하고 원하는 대로 코드가 돌아가면 코드 리뷰를 요청하기 전에 코드를 정리해야 한다. 추가한 코드를 나머지 코드와 깔.. 2022. 7. 30. 이전 1 2 다음