"초보자"게임 프로젝트를 넘어


22

나는 게임 개발자가 알아야 할 수학 유형에 대해이 답변을 읽고 있었고이 부분은 실제로 나에게 두드러졌습니다.

How do I move my game object? The novice might say:

"I know! I'll just do:" object.position.x++.

그것이 내가 그렇게 생각하는 방식이므로 내 기술 수준을 보여줍니다. 적어도 과거에 만든 2D 사이드 스크롤링, 아케이드 스타일의 게임에는 그것이 전부였습니다. 그것과 약간의 삼각법.

사실, 나는 그 게시물을 읽기 전에 선형 대수학을 많이 사용하지 않았거나 쿼터니언에 대해 들어 보지도 않았습니다. 이 수학은 3D로 작업 할 때까지 표시되지 않거나 2D 게임이 매우 단순하여 순진한 구현으로 도망 갔기 때문입니다.

후속 질문 : 해당 유형의 수학에 익숙해지기 위해서는 어떤 유형의 프로젝트를 수행해야합니까? IE : 게임 엔진 작성, 3D 게임 작업 등


1
khanacademy.org 는 초급 및 고급 수학 학습에 적합합니다. 또한 성과가 있습니다! 지루한 학계에 활기를 불어 넣는 게임 이론은 없습니다.
감속

답변:


16

이것의 진정한 속임수는 고등학교 수준의 과학입니다. 당신 해야했던 빠른 검색을하지 않은 경우 Google 검색을 시작할 수 있습니다 . '초보자'사고 방식을 피하는 방법을 설명하려면 달 착륙선을 예로 들어 보겠습니다.

일단 [change in position] = [velocity] * [time passed]변수를 추적해야한다는 것이 명확 해졌다는 것을 읽었습니다 .

float x, y; // Your X and Y co-ordinates.
float vx, vy; // Your X and Y velocity.
float deltaTime; // Change in time.

그런 다음 각 프레임의 위치에 속도를 적용하면됩니다.

// Change X by the velocity multiplied by the time.
x = x + vx * deltaTime;
y = y + vy * deltaTime;

이제 우리는 중력을 추가 할 수 있도록 각 프레임의 속도를 변경하고 싶습니다. 정확히 같은 출처에 따르면 [change in velocity] = [acceleration] * [time passed]. 따라서 동일한 원칙을 적용 할 수 있습니다.

const float gravity = 9.8f; // The gravity of the earth.

// Add gravity to the vertical velocity.
vy = vy + gravity * deltaTime;
// Change X by the velocity multiplied by the time.
x = x + vx * deltaTime;
y = y + vy * deltaTime;

이제 플레이어가 우주선을 조종 할 수있는 방법이 필요합니다. 기본 물리학에 대한 자세한 내용을 읽어 보면 모션이 힘의 결과라는 것을 알게 될 것입니다 [change in acceleration] = ([force] / [mass]) * time. 따라서 플레이어가 키를 누르면 단순히 변수 fxfy변수를 설정하고 업데이트 중에 방정식을 적용합니다.

궁극적으로 게임에서 객체 주위의 물리학에 대해 생각해야합니다. 생각하는 방식대로 움직이려고하는 대신 방정식을 찾아보십시오 .

미래 참고 사항 : 이것은 물리학을 수행하는 가장 좋은 방법은 아니라는 것을 기억하십시오 (이는 Euler 통합이라고하며 낮은 프레임 속도에서 이상한 시나리오가 발생할 수 있음)- 다른 일을하는 방법 을 조사해야합니다 (이 기사는 상당히 베어 기본에 대한 훌륭한 글쓰기). 그러나 지금은 Euler Integration을 고수하십시오. 즉, 한 가지 적은 것을 배우려고한다는 의미입니다.

올바른 사고 방식으로 생각하는 방법을 가르치는 게임은 무엇입니까?

올바르게하고 올바른 사고 방식으로 일을했는지 ​​어떻게 테스트 하시겠습니까? Sleep(10 milliseconds)게임 루프에를 삽입하면 모든 것이 여전히 전체 프레임 속도와 동일한 방식으로 이동하고 반응해야합니다.

마지막으로, 2D 게임 제작에 대한 충분한 경험이있을 때까지 3D (Quantions 및 Matrix 적용)로부터 멀리 떨어져 있어야합니다. 나는 꽤 많은 게임 개발자들이 실제로 쿼터니언이나 매트릭스가 어떻게 작동하는지 알지 못하지만 단지 그것들을 사용하는 방법을 알고있다가 나중에 훨씬 더 가까이 접근하거나 2D 게임이 너무 재미 있고 성공한). 기본 대수에서이 작업을 수행하기 위해 선형 대수 등을 알 필요는 없습니다 (그러나 실제로 도움이되므로 가능하면 일부 야간 수업으로 가십시오).

최종 보너스 : 나의 미술 선생님이 항상 나에게 한 말은 "당신이 생각 하는 것을 그리는 것이 아니라, 당신이 보는 것을 그리는 것"입니다. 동일한 일이 " 적절하게 생각 하는 것을 모델링하지 말고 ( object.position++), 일어나는 일을 모델링하십시오 (`object.position + = velocity * time)"-최소한 합리적인 한계까지 (완벽하게 정확한 시스템을 모델링하지는 않지만, 좋은 모방 인 것).


테스트를 위해 인공 지연을 삽입하는 아이디어가 마음에 듭니다. 또한 지구의 중력은 9.1이 아니라 9.8입니다.
Steve

실제 시뮬레이션을 작성하지 않는 한 "생각하는 일을 모델링하지 말고 무슨 일이 일어 났는지 모델링"하십시오 프로젝트에 필요한대로 확장하십시오. 때때로 "생각하는 것"은 디자인에 대한 좋은 해답입니다.
chaosTechnician

이 수준에서 @chaosTechnician "당신이 생각하는 것은"입니다 object.position++. 나는 대답을 명확히 할 것이다.
조나단 디킨슨

의 경우 -1입니다 instead of trying to make them move in the way you would think, rather look up the equation. 그것은 관하여 이해 그들을 보지 않고, 방정식을. 가장 중요한 것은 게임을 재미있게 만드는 것입니다. 누가 변수 가속을 사용하면 중력이 더 재미있을 것입니다. 그러나 방정식을 이해 하지 못하면 어떻게 해야하는지 추론하기가 매우 어려울 것입니다 .
BlueRaja-대니 Pflughoeft 1

3
@ BlueRaja-DannyPflughoeft는 내가 그에게 정확하게 설명한 것입니다. 처음에 방정식을 알지 못한다는 것은 결코 그것을 이해할 수 없다는 것을 의미합니다. 그들을 이해하는 유일한 방법은 실제 상황에서 사용하는 것입니다.
Jonathan Dickinson

3

나는 당신이 연결 한 답변의 일부가 프레젠테이션에서 약간의 엘리트 주의자라고 생각합니다. 벡터 수학의 미덕을 칭찬하고 객체에 위치, 방향 및 가속이 필요하다고 말하는 것은 객체가 실제로 object.position.x += (object.velocity.x + object.acceleration.x) * deltaTime는 근본적으로 다르지 않기 때문에 일관성이 없기 때문 입니다 object.position.x++. 쿼터니언은 회전을 나타내는 여러 가지 방법 중 하나입니다. 나는 그것들을 좋아하지만 3D 회전을 이해하는 데 필수적인 것은 아닙니다. 많은 쿼터니언 사용자가 암시하는 내용에도 불구하고, 그들은 회전 수학의 성배가 아닙니다.

선형 대수의 원리는 간단한 2D 이동, 회전 등에 존재하지만 2 차원 만 있기 때문에 수학이 더 간단합니다. 다음은 예 입니다.

선형 대수학에 대한 지식을 배우고 향상시키는 방법에는 여러 가지가 있습니다.

  1. 나는 선형 대수학에서 코스를 수강하는 것을 고려했지만 코스로드가 이미 무거워서 추가 작업을 정당화 할 수 없었습니다.
  2. 일련의 게임 엔진 프로그래밍 수업을 들었을 때 선형 대수학에 대한 이해가 훨씬 더 커졌습니다. 나에게있어 Vectors, Matrices 등의 사용은 게임 쪽보다 엔진 쪽에서 더 널리 퍼졌습니다. 물론, 게임 코드에서 행렬을 사용하지 않았다는 말은 아닙니다. 엔진 코딩에서 자주 사용하지는 않습니다. ymmv
  3. 또한 알아야 할 수학을 이해하는 데 도움이되는 책이 많이 있습니다. "3D Math for Games"라는 장이있는 이 책이 마음 에 듭니다.

마지막으로, 게임 디자인에 복잡한 수학이 필요하지 않으면 사용하지 마십시오. :) 그러나 물론 게임 디자인에 대해 깊이 파고 들지 마십시오.


0

2D의 쿼터니언은 계산이 너무 비싸다는 것은 말할 것도없고 완전한 과잉입니다. 비트 맵 회전 (2D)은 많은 플랫폼 / 라이브러리에 의해 암시 적으로 처리됩니다. 응용 프로그램을 작성하는 데 매우 기본적이고, 그렇지 않은 경우에도 2D 비트 맵의 ​​회전은 단순한 삼각법에 지나지 않습니다. 물론 인간이 자전거를 타야했을 때 3D 코드를 작성하면서 자랐다 고 말하지 않는 한, 3D에서는 상황이 일반 인간에 비해 훨씬 덜 직관적입니다.

선형 대수학은 2D에 3D 그대로 적용 할 수 있으며 중학교 수학 만해도 친숙해야합니다. 선 교차점을 수행하거나 선에 주기적으로 플로팅 한 경우 (통합) 선형 대수학을 사용한 것입니다.

3D 수학 학습은 일반적으로 3D 공간에 간단한 물체 (입방체)를 배치하고, 다른 관점에서 해당 물체를 볼 수있는 이동 가능한 카메라를 구현하는 것부터 시작하며,이 관점은 사물을 더 단순하게 유지하기 위해 직교 할 수 있습니다. 화면을 나타내는 3D 평면에 점을 투영하는 것입니다 ( 여기서 공식 은 y 이외에 x 및 z 축으로 확장합니다). 실제로, 그것은 당신의 경험 수준에 관계없이 3D 엔진을 작성하기 시작한 것입니다. Flash와 Processing.js는 이와 같은 것을 쉽게 프로토 타입 화하는 두 가지 좋은 방법입니다.


0

선형 대수와보다 복잡한 수학에는 일반적으로 3D 그래픽과 3D 공간이 포함되어 있습니다. 그러나 2D 게임 내에서 더 많은 수학을 할 수 있습니다. 물리학 수학은 꽤 하드 코어 될 수 있으며, 부드러운 신체 물리학과 B- 스플라인 역학을 고려하면 더욱 복잡해집니다 (그리고 여전히 2D로 생각하십시오).

일반적인 2D 모양에 대한 충돌 처리 및 응답을 다루는 물리 라이브러리를 작성하거나 해부하십시오. 선형 대수는 충돌에 대한 궤도 벡터를 계산하는 데 매우 유용합니다. 내적은 삼각법에 사용 된 단위 원과 관련이 있습니다. 그러나 강체 물리학의 복잡성은 3D로 적용 할 때 기하 급수적으로 증가합니다.

3D 그래픽을 사용하면 행렬 계산, 쿼터니언, 선형 대수 및 일부 적용 미적분에 대한 이해를 높일 수 있습니다. 가장 먼저 선택해야 할 것은 행렬을 사용하여 3D 공간에서 객체를 이동하고 조작하는 것입니다.


0

2D 게임을 작성하고 있다면 이미 선형 대수학을 사용하고있을 것입니다. 공식적으로 벡터에 대한 기본을 배우는 것은 쉽지만 복잡한 운동에 대한 생각을 단순화하는 데는 먼 길을갑니다.

예를 들어, 대포에서 발사 한 캐논볼이나 원점 미사일과 같이 곡선 운동을 시뮬레이션하는 데 사용할 방정식에 대한 많은 질문이 있습니다. 그러나 벡터를 이해한다면 두 벡터를 더하는 데 필요한 유일한 "방정식"입니다. 뿐만 아니라 에어 드래그 또는 마찰과 같은 것을 추가하는 것은 매우 간단합니다. 드래그 벡터를 계산하고 속도에 추가하십시오. 프레스토 악장!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.