목록2024/11 (13)
3냥 집사이면서 게임 개발자입니다.
// 게임 로직과 렌더링 로직이 공유하는 변수Vector2 currentPosition;float currentScale = 10.f;float currentDegree = 0.f;// 게임 로직을 담당하는 함수void SoftRenderer::Update2D(float InDeltaSeconds){ ... // 게임 로직의 로컬 변수 static float moveSpeed = 100.f; static float scaleMin = 5.f; static float scaleMax = 20.f; static float scaleSpeed = 20.f; static float rotateSpeed = 180.f; Vector2 inputVector = Vector2(input.GetAxis(InputAxi..
물체를 이동시키고 크기를 늘리는 동작은 서로 수직인 x축과 y축이 서로 독립적으로 적용된다. 따라서 x축과 y축이 따로따로 계산 후 두 결과를 결합한 것과 같다. 물체를 회전시키는 동작은 x와 y값이 함께 영향을 미친다. 둘을 독립적으로 계산할 수 없다는 얘기다. 회전을 구하기 위해 벡터 공간에서의 기저벡터 개념을 활용하고, 일반적으로 벡터를 회전시켰을 때 어떤 값이 나오는지를 구하는 수식을 증명해보았다.
삼각함수로 하트 그리기 CK 소프트 렌더러는 각도법과 호도법을 사용해 sin함수와 cos함수 값을 얻어올 수 있도록 함수를 제공한다.float sin, cos;Math::GetSinCos(sin, cos, 30); // 30 degreeMath::GetSinCos(sin, cos, Math::TwoPI); // 2pi radian 일명 하트 방정식이라 불리는 식을 이용해 하트를 그려보는 코드를 짜보자. x = 16 sin^3세타y = 13 cos세타 - 5cos 2세타 - 2cos3세타 - cos4세타 // 게임 로직과 렌더링 로직이 공유하는 변수Vector2 currentPosition;float currentScale = 10.f;// 게임 로직을 담당하는 함수void SoftRenderer::Upd..
기존 벡터 공간의 덧셈과 곱셈의 연산을 활용해 벡터의 움직임을 구현했다. 두 가지 연산으로는 직선의 움직임만 표현할 수 있었다.회전은 원의 궤적을 따라 이동하는 움직이기 때문에, 이와 밀접하게 연결되어 있는 삼각함수를 이해하고자 한다. 요약삼각함수 : 직각 삼각형에서 측정할 수 있는 사잇각이 0도보다 크거나 90도 보다 작을 때 데카르트 좌표계 상에 대치하고 사잇각의 범위를 실수 전체로 확장한 대응관계를 삼각함수라고 한다. 삼각비 : 직각 삼각형을 구성하는 세 변에서 두 변을 뽑아 각각의 비례관계를 나타낸 것, 대표적으로 sine, cosine, tangent 가 있다. sin함수와 cos 함수의 개념은 직각 삼각형에서 출발했지만, 원점을 중심으로 반지름이 1인 평면 위의 단위원을 사용해 나타내면 ..
메서드 템플릿은 클래스 템플릿 안에 정의해도 되고 비템플릿 클래스 안에 정의해도 된다.메서드 템플릿은 클래스 템플릿에 복제 생성자와 대입 연산자를 정의할 때 특히 유용하다.* 가상 메서드와 소멸자는 메서드 템플릿으로 만들 수 없다. 간단한 예시 Grid IntGrid;Grid DoubleGrid;이렇게 만든 두 변수는 타입이 서로 다르다.Grid 객체를 받는 함수는 Grid 객체를 인수로 받을 수 없다.int 를 double로 강제 형변환해서 int원소를 double원소로 복제할 수는 있지만, 위 객체끼리는 대입하거나 변환이 불가능하다.따라서 다음과 같이 작성하면 컴파일 오류가 발생한다.DoubleGird = IntGrid;이유는 Grid 템플릿에 대한 복제 생성자와 대입 연산자를 어떻게 정의했는지에서..
기존의 함수를 작성하는 것을 매개변수화한다고 표현한다.템플릿은 매개변수화 개념을 더욱 발전시켜 값 뿐만 아니라 타입에 대해서도 매개변수화 한다.템플릿을 이용하면 주어진 값 뿐만 아니라 그 값의 타입에 대해서도 독립적인 코드를 작성할 수 있다. 예를 들어 int, Car, SpreadsheetCell 과 같은 각각의 타입마다 따로 정의하지 않고, 스택 클래스 하나에 모든 타입에 적용할 수 있게 만들 수 있다. 템플릿이 제공하는 기능이 정말 뛰어나다는 점과 C++의 템플릿 문법이 상당히 복잡해서 템플릿을 집중적으로 학습자고자한다.C++에서 제공하는 템플릿 기능을 주로 표준 라이브러리를 사용하는 관점에서 작성하려한다. 클래스 템플릿멤버 변수 타입, 메서드의 매개 변수 또는 리턴 타입을 매개변수로 받아서 클래스..
요약 선형성 : (간략한 설명) 가산성과 동차성 성질이 항상 성립하는 경우, 선형성이 있다.선형 결합 : 선형 연산을 사용해 n개의 스칼라와 n개의 벡터를 결합해 새로운 벡터를 생성하는 수식선형 종속의 관계 : 모든 a(스칼라)가 0이 아님에도 영벡터를 만들 수 있다면, 선형 결합에 사용된 벡터는 서로 선형 종속의 관계를 가진다 라고 표현한다.선형 독립의 관계 : 영벡터가 나오기 위해서 모든 값이 0이어야 한다면 선형 결합에 사용된 벡터들은 서로 선형 독립의 관계를 가진다 라고 표현한다. 선형 독립의 관계를 가지는 벡터끼리 결합하면 벡터 공간에 속한 모든 벡터를 생성할 수 있다. 이는 벡터 공간을 다룰 때 중요하게 여겨지는 성질이다. 선형 종속 관계에 있고, 평행 관계에 있는 벡터로 알아보았을 때, 평..
프로젝트 환경은 이전과 같습니다. 벡터로 원그리기 반지름이 5인 원을 생성하기 위해, 먼저 원을 둘러싼 사각형 영역을 생성하고, 이로부터 원을 구성하는 벡터만 골라내는 방법을 사용한다.사각형 영역을 구성하는 벡터에서 반지름의 크기가 5보다 작거나 같은 벡터를 묶으면 원의 형태가 만들어진다.사각형 영역에 속한 각 벡터의 크기는 벡터의 크기 수식을 사용해 계산할 수 있으며, CK소프트 렌더러 Vector2 에 구현되어 있다.struct Vector2{ ... FORCEINLINE float Size() const; FORCEINLINE constexpr float SizeSquared() const; ...};FORCEINLINE float Vector2::Size() const{ ..
요약 벡터의 크기 : 원점으로부터 벡터까지의 최단 거리를 의미한다.원점과 벡터를 연결해 직각 삼각형을 그린 후, 피타고라스의 정리를 사용해 거리를 측정한다. 용어 노름 Norm : 벡터의 크기단위 벡터 Unit Vector : 크기가 1인 벡터 정규화 Normalize : 임의의 벡터를 크기가 1인 단위 벡터로 가공하는 과정
이득우의 게임 수학 책에서 제공하는 프로젝트 파일을 이용했습니다. CK 소프트 렌더러에서 좌표를 관리하기 위해 선언한 Vector2 를 살펴보았다.평면의 벡터 값을 관리하는 Vector2 구조체의 선언 struct Vector2{...public:FORCEINLINE constexpr Vector2 operator*(float InScalar) const;FORCEINLINE constexpr Vector2 operator+(const Vector2& InVector) const;...static constexpr BYTE Dimension = 2;...FORCEINLINE constexpr Vector2 Vector2::operator*(float InScalar) const{ return Vecto..
요약 곱집합 : 두 집합의 원소를 순서쌍으로 묶은 원소의 집합을 의미한다.곱집합의 표현 방식 : (x, y) 데카르트 좌표계 : 직선의 수 집합을 수직으로 배치해 평면을 표기하는 방식.좌표: 데카르트 좌표계의 한 원소를 곱집합과 동일하게 순서쌍으로 표현. 점 또는 원점으로부터 화살표로 표현한다.크기와 방향 두 가지 속성을 지닌다. 벡터 공간 : 두 개 이상의 실수를 곱집합으로 묶어 형성된 집합을 공리적 집합론의 관점에서 규정한 공간.벡터 : 벡터 공간의 원소스칼라 : 체의 구조를 가지는 수 집합의 원소(3차원 공간에서의 벡터, 스칼라 등의 개념은 나중에 다룹니다.) 벡터의 합 : 평면의 점을 각 축에 대해 독립적으로 평행 이동시키는 작업스칼라 곱셈 : 원점을 지나고 벡터와 평행한 직선상에 위치, 항상..
요약 함수란 두 집합 사이의 관계를 나타내는 개념. 두 집합의 요소가 서로 대응된다고 모두 함수로 인정되는 것은 아님.1. 첫 번째 집합의 모든 원소에 대한 대응 관계가 존재해야 한다.2. 첫 번째 집합의 원소는 두 번째 집합의 한 원소에 대응되어야 한다. 정의역(Domain) : 왼쪽에 위치한 첫 번째 집합공역(Codomain) : 오른쪽에 위치한 두 번째 집합 치역(Range) : 정의역에 대응되는 공역의 원소들만 따로 보아 부분 집합을 형성한 것정의역의 모든 원소는 공역의 원소에 대응되어야 한다. 하지만 공역의 모든 원소가 정의역에 대응할 필요는 없다. 정의역과 공역이 서로 대응되는 형태에 따라 함수를 여러 종류로 구분 가능전사 함수 (Surjection) : 공역의 모든 요소가 정의역에 대응..