Post Lists

2018년 8월 21일 화요일

Physics, The Next Frontier

http://chrishecker.com/images/d/df/Gdmphys1.pdf

Physics, The Next Frontier
의심할 여지가 없다: 매년 게임은 그래픽적으로 좀 더 사실적이다. 모든 사람들은 (또는 적어도 스크린샷을 보여주고있다) 텍스쳐 매핑된 3D 게임 월드를 오늘날 하고 있고, 하드웨어 사람들이 마침내 그들의 맞는 것을 얻을 떄, 모든 개발자들은 수 많은 원극법으로 오른 텍스쳐되고 쉐이딩 된 폴리곤들을 초당 그릴 수 있을 것이다. 기술적으로 말하자면, high-end games을 위해 할 게 무엇이 남았는가? "21일 안에 3D 하드웨어 사용하는 법 배우기"라는 카피를 가진 모든 개발자들은 인상적인 게임을 만들 수 있을 것인가?

High-end developers는 많은 다른 기술에서 그 문장을 치켜세울 것이다. 그래픽 데이터베이스 복잡성, 인공지능, 네트워킹 처럼. 이러한 것들이 중요한 주제들이지만, 우리는 게임 세부적인 디테일로 들어가지 않고 깊이 이야기 할 수 없다. 그러나, 한 가지 정말 적용가능한 기술이 있는데, 내가 생각하기에 가까운 미래에 주된 촤별화 요소가 될 것이다: 물리학.

여기에 한 예시가 있다 : Duke Nukem 3D의 초기 shareware 수준들 중 하나에서 그렇게 큰 회전하는 기어를 기억하는가? 일반적인 물리 엔진이 animation loop 대신에 그것들을 통제한다는 것을 상상해보아라. 갑자기 그 기어들은 눈깔 사탕 이상의 것이 된다.  또는 미사일을 가진 기어를 쏘는 것을 상상해보알. 그것은 그 홀이 구르도록 하고, 너의 친구과 부딪힌다. 진짜 물리 엔진은 이러한 상황들을 가능하게 만든다.

물리 시뮬레이션은 또한 게임 세계를 튼튼하게 느껴지도록 만드는 것이다 - there에  "there"를 넣는다. 만약 너가 내가 무슨 말하는지 안다면. 세계에서 모든 그래픽스 마법사들은 플레이어들은 너의 게임에 집중하도록 돕지 않을 것이다. 만약 그것들이 서로서로 또는 level의 벽들을 관통한다면, 또는 만약 그들이 어떤 질량이나 운동량을 가지지 않은 것처럼 느낀다면. 디즈니에서 original animators들은 이 질량감이 믿을만한 애니메이션을 나쁜 것으로부터 떼어놓는 큰 부분이라고 발견했다. epci book Disney Animation : The Illusion of Life에 따르면, Frank Thomas와 Ollie Johnston이 만든, Disney animators들은 심지어 스튜디오에 끊임 없이 그들 자신을 상기시키기 위해 한 표지판을 달아놓았다: 너의 그림은 무게, 깊이, 그리고 균형감을 가지는가?"

그러나 거의 모든 게임은 벌써 물리 엔진을 가지지 않았는가? 물론이다. 그것은 너의 차가 트랙을 관통하여 세계에서 떨어지지 않게 하고, 너의 캐릭터가 점프할 때 흘러가지 않게하고, 그것은 너의 배가 미사일이 근처에서 폭팔 할 때 옆으로 치도록 한다. 그러나, 오늘날의 게임들에서 대부분의 물리 엔진들은 매우 약하다. 그리고 이것은 그 차가 게임에서 떨어지지 않도록 유지하지만, 게임이 다음 수준의 상호작용으로 가기에는 충분하지 않다 - 부서진 차의 잔해들이 트랙으로 튈지도 모르고, 벽이나 다른 차로 달려 나갈지도 모르고, 타이어들은 다가오는 차들로 굴러갈지도 모른다.

다른 종종 무시되는 물리적 가능성은 간단한 회전 효과로부터 오는 몯느 것을 포함한다.  그 효과는 중심을 쳐서 나오는 것인데, 게임에서 생물체들이 자기 중심을 잡고, 동기부여받게 한다. -이것은 오히려 정적 애니메이션 기반이다. 그래서 그것들은 새로운 물리 자극에 반응할 수 있다. 나는 대부분의 개발자들이 이러한 가능성을 무시한다고 생각한다. 왜냐하면  그들은 물리 뒤의 수학을 이해하지 않기 때문이고, perspective texture mappers를 쓰느라 너무 바빠서 그것을 배울 수 없기 떄문이다. 3D 하드웨어의 맹습은 후자의 문제를 다룰 것이지만, 내가 이 자료로 시작할 새로운 시리즈는 전자를 다룰 것이다. 우리가 다 끝날 때 즘에, 너는 플레이어를 너의 게임에 집중시킬 물리엔진을 쓰기에 충분히 알 것이다. 극한의 물리적 사실성을 통해서든 멋지지만 일관된 초현실성에 의해서든.

경고의 말: 물리학은 수학이다 - 너는 두 개를 분리할 수 없고, 여전히 흥미로운 일을 할 수 없다. 이것이 사람들에게 겁주기 전에, 내가 물리 뒤의 수학은 총체적으로 우아하고 아름다울 뿐만 아니라, 적용되어진다는 것을 지적하고자 한다. 즉, 수학을 위한 추상적인 수학이 아니다. 우리가 사용하는 각 방정식은 실제 물리적 의미를 갖는다. 우리는 물리 모델로부터 방정식을 만들고, 그에 대해, 그 방정식은 우리에게 어떻게 그 모델이 시간에 따라 행동하는지를 말해준다.

Mass-ive Undertaking
물리학은 거대한 분야이다. 우리는 실제로 역학이라 불리는 것의 작은 부분에만 관심이 있고, 심지어 더 특정하게 rigid body 역학이다. 역학은 가까운 관련된 분야인 운동학의 관점에서 가장 쉽게 정의 될 수 있다 - 시간에 대한 움직임에 대한 연구이다. 운동학은 그 자체로 움직임을 일으키는 것이나 또는 그것들이 처음 장소가 어디에 있는지오 ㅏ관련없고, 그것은 그냥 실제 움직임 자체를 다룬다. 반면에 역학은 운동량이 시간이 진행함에 따라 변하도록 하는 힘과 질량에 대한 연구이다. 한 야구공이 직선으로 시간 당 50킬로미터로 여행한다면 한 야구공은 10초간 얼마나 멀리가는 가는 운동학 문제이다; 지구의 중력장에서 내가 야구공을 배트로 친다면 야구공이 얼마나 멀리가는가는 역학 문제이다.

rigid body dynamics의 "rigid body(강체)" part는 우리가 재현하려는 오브젝트에 두는 constraints(제약)을 말한다. 강체의 모양은 우리의 시뮬레이션 동안 변하지 않는다 - 그것은 jello보다는 나무 또는 금속 같은 것이다. 우리는 여전히 관절이 있는 모형을 만들 수 있다. 인간같은, 그 모형의 각 부분을 rigid body로부터 구축하고 그것들 사이에 관절을 넣어서, 하지만 우리는 압박하의 뼈의 굽힘 또는 유사한 효과들을 설명하지 않을 것이다. 이것은 우리가 우리의 방정식을 간단하게 할 것이다. 여전히 흥미로운 역학 행동을 고려하면서.

우리의 엄청난 집중과 함께, 강체 역학은 설명할 일련의 자료들이 필요할 것이다. 우리는 우리의 여정을 힘의 영향 하에 있는 2D 강체를 움직이게 하는 컴퓨터 프로그래밍의 기본을 배워서 시작할 것이다. 나는 명백히 말한다, "program a computer,"라고. 왜냐하면 방정식 외에도, 우리는 운동학과 역학을 위해서 개발할 것이기 때문에, 우리는 또한 이러한 방정식을 부동소수점 수학을 사용하여 해결하는 방법을 배워야 할 것이다. 그리고 그것은 그 자체로 중요한 주제이다. 나는 "2D 강체"라고 말하는데, 우리가 다음 자료까지 2차원을 고수할 것이기 때문이다. 원칙들 - 사실 대부분의 방정식들 -은 3D를 넘나들지만, 어떤 것은 2D에서 더 간단하다. 그래서 우리는 한 차원을 올리기전에 편하게 있을 것이다. 미래의 자료에서, 우리는 회전 효과, 충돌 탐지 그리고 반응과 물론 모든 이것으 3차원에서 어떻게 할지를 배울 것이다. 우리가 무엇을 할지 충분히 했으니, 시작해보자!

Derivative Work
이것은 너에게 놀라울지도 모르지만, 너는 실제로 직접적으로 물체를 밀어서 움직이게 할 수 없다. 나는 너가 이러한 말안되는 것을 프린트 해놓은 이 잡지를 쓰레기통에 버려서 내가 틀렸다고 생각하는 것을 안다. 그러나 그것은 사실이다: 그 잡지를 미는 것은 그것의 위치에 영향을 주지 않는다. 사실, 미는 것은 심지어 그것의 속도에 영향을 주지 않는다. 그러나, 미는 것이 직접적으로 영향을 미치는 것은 그 잡지의 가속도이다. 그리고 이 사실은 과학 역사상 가장 중요한 발견물 중 하나이다.

어떤 흥미로운 것을 하기 위해 이 놀라운 사실을 사용하기 위해서, 우리는 처음에 위치, 속도, 그리고 가속도 사이의 관계에 대해 말할 필요가 있다. 이러한 양들이 매우 밀접하게 관련되어 있다는 것이 밝혀졌다 (너가 아마도 알 듯이): 속도는 시간에 대한 위치의 변화율이고, 가속도는 속도의 변화율이다. 이러한 변화들을 시간에서 연구하기 위한 주요한 도구는 적분이다. 나는 너가 적분을 조금 안다고 가정할 것이다. 우리는 오직 간단한 스칼라와 벡터 적분을 사용할 것이다 (미분과 적분), 그러나 만약 너가 그 주제에 전체적으로 친숙하지 않다면, 그것은 힘들것이다. 레퍼런스를 위해, 내가 가장 좋아하는 교재는 Calculus with Analytic Geometry by Thomas and Finney 이다.

위치, 속도, 그리고 가속도는 우리가 이 자료에서 신경쓰는 운동학적 양이다 (운동량). 2D에서 rigid body의 위치는 명백히 그 몸의 어떤 알려진 점의 world 좌표를 표기하는 X,Y의 쌍이다. 위치 벡터의 미분은 그 점에 대한 속도이고, 그것은 우리에게 그 점이 무슨 방향으로 움직이는지를 말해준다 (그리고 만약 우리가 회전을 무시한다면 그 몸이 무슨 방향으로 움직이는지) 그리고 그것이 얼마나 빠르게 가는지를 말해준다. 벡터 적분은 그 벡터의 각 원소에 대한 스칼라 적분이다, 그래서 위치의 X원소의 미분은 속도의 원소 X이고 등등. 우리는 위치 벡터를 r로 표기하고, 속도 벡터를 v로 또는 "점이 찍힌" 위치 벡터로 표기한다. (일반적으로 점은 시간과 관련하여 미분되는 것을 의미하고, 두 개의 점은 두 번 미부되는 것을 의미한다 ,등등):



대조적으로, 우리가 시간에 대해 속도 벡터를 적분한다면, 그것은 우리에게 그 위치 벡터가 그 시간에 대해 얼마나 변화했는지를 말해준다.

가속도는 유사하게 처리된다; 그것은 속도의 미분이고, 또는 위치를 2번 미분한 것이다:



시간에 대해 속도를 적분하는 것은 속도를 주고, 가속도를 두 번 적분하는 것은 위치를 준다.

이렇나 운동학적 관계는 우리에게, 만약 우리가 한 오브젝트의 가속도를 찾을 수 있다면, 우리는 그것의 속도와 위치를 얻기위해 시간에 대해 그것을 적분할 수 있다는 것을 말해준다. 우리가 보게 되듯이, 우리는 이 적분을 우리의 simulation code에서 numerically하게 수행하고, 매 프레임마다 우리의 rigid body에 대해 새로운 위치를 얻게 된다. 어때, 이게 애니메이션이다!

여기에 우리가 analytically(분석적으로) 적분할 수 있는 짧은 1D example이다. 우리가 마지막 프레임의 끝에서 현재 프레임까지의 시간 주기에 대해 우리의 위치에서의 변화를 찾길 원한다고 가정하자. 그래서 우리는 우리의 현재 위치를 그릴 수 있다. 더욱이 우리가 이 시간 동안 우리의 rigid body의 가속도가 상수 5 units/sec^2 이라고 가정하자. 우리는 마지막 프레임의 끝 이후로, 적분 변수 t로 그 시간을 사용할 것이다:



위의 방정식은 우리에게 지난 프레임부터 시간의 함수로서의 속도를 보여준다. 우리는 적분 상수 C가 t = 0을 넣음으로써, 이 적분 주기의 시작에서의 초기 속도라는 것을 발견한다.



이제 우리는 위치를 찾기 위해 우리의 속도 방정식을 적분할 것이다 ( 또 다시, 적분상수를 해결할 것이다):



그래서 방정식 5는 만약 우리가 초기 위치와 속도 (우리는 우리가 마지막 프레임의 끝으로부터 가졌다고 가정하는 위치와 속도이다) 그리고 경과된 시간을 알고있다면, 우리가 주어진 가속도 아래에서 현재 위치를 계산할 수 있다고 말한다. 우리는 시간을 넣고, 현재 위치를 뱉어낸다. 우리는 또한 최종 속도를 계산하기 위해 그 시간을 방정식 4에 넣길 원할 것이다. 그래서 우리는 그것을 다음 프레임의 초기 조건으로서 사용할 수 있다.

May The Force Be With You
우리가 애니메이션을 얻기 위해 운동 방정식을 어떻게 적분하는지에 대한 아이디어를 가졌으니, 우리는 처음으로 사용할 올바른 가속도를 결정할 필요가 있다. 이것이 역학이 들어오는 지점이다. 어떤 것을 미는 것이 직접적으로 그것의 가속도에 영향을 미친다고 말한 방식을 기억하는가? 음, 미는 것은 힘을 적용하는 것을 돌려서 말한 것이다. - 그 힘은 역학에서 두 개의 중요한 양들 중의 하나이다 - 그리고 우리는 힘이 어떻게 가속도에 영향을 미치는지 보기 위해서 뉴턴에게 의지할 수 있다. 뉴턴의 법칙들은 힘 F를 (질량 * 속도)의 미분과 연관짓는다. - 질량은 두 번째 중요한 역학의 양이다 -. 질량 * 속도는 선형 운동량(linear momentum)이라고 불려지고, p로 표기된다:



그 질량은 우리가 신경쓰는 속도에 대해 상수이다. 그래서 그것은 Eq.6의 미분에서 빠지게 된다. 그리고 우리는 유명한 F = ma 를 얻게 된다 (비록 뉴턴이 원래 힘의 정의를 운동량의 미분이라고 명시했다고 내가 믿을지라도).

만약 우리가 단일 점의 질량을 다루려고만 한다면, Eq.6은 우리가 역학에서 할 필요가 있는 모든 것이 될 것이다. 주어진 적용될 힘에 대해, 우리는 힘을 질량으로 나누어서 그 점의 가속도를 발견한다. 이것은 우리에게 우리의 적분에서 사용할 가속도를 주는 것이다. 그래서 우리는 위의 우리의 예제에서 처럼, 그 움직임에 대해 해결할 수 있다. 그러나, 우리는 rigid body의 면적에 분산된 질량을 가진 rigid bodies들을 다룰 것이다, 그래서 우리는 좀 더 일을 할 필요가 있다.

처음에, 우리의 rigid body를 점으로 된 것(point mass)들의 한 집합으로 상상해라. 우리는 그 rigid body의 총 운동량 p^T를 (여기에서 T는 total를 가리킨다) 그 몸을 구성하는 모든 점의 모든 운동량의 합으로 정의한다. (나는 어떤 quantities가 어떤 점에 속하는지를 표기하기 우해 superscripts(문자 오른쪽 위에 작게 쓰여진 글자)를 사용하는 중이다.):



우리는 질량의 중심(center of mass, CM)이라고 불려지는 한 점을 도입하여 rigid bodies의 역학 분석을 크게 간단하게 할 수 있다. 질량의 중심(CM)에 대한 벡터는 그것들의 질량에 의해 가중치되어진 rigid body의 모든 점들에 대한 벡터들의 선형 결합(linear combination)이다. 그리고 그것은 그 body의 총 질량 M으로 나눠진다:



이 질량의 중심점(CM)의 정의를 사용하여, 우리는 Eq.8의 양 변에 M을 곱하고, 양 변을 미분하고, 그러고나서 그 결과를 Eq.7으로 대체하여, Eq.7을 간단하게 할 수 있다.



Eq.9의 오른 쪽 변은 Eq.7의 정의에 의한 총 운동량이다. 이제 왼쪽 변을 보자: 그것은
(질량의 중심점(CM)의 속도 * 전체 body의 질량) 이고, 그래서 오른쪼 변으로 넘기는 것은 우리에게 다음의 식을 준다:



Eq. 10은 총 선형 운동량은 (총 질량 * 질량의 중심점(CM)의 속도)와 동일하다. 우리가 총 질량과 CM의 위치와 속도를 아는 한, 운동량의 찾기 위해 Eq.7에서의 합을 할 필요가 없다는 것이다. 지속적인 rigid bodies를 위해, 위의 모든 유한한 합은 그 몸에 대한 적분으로 밝혀졌지만, CM은 여전히 존재하고, Eq.10으로 총 운동량 방정식을 간단하게 만든다. 그래서 우리는 신경쓸 필요가 없는 것이다 - 선형 운동량을 찾으려는 목적을 위해서, 우리는 모든 bodies를 single point mass and velocity로 다룰 수 있다.

게다가, total force는 total momentum의 미분이다. 그래서 CM의 개념은 같은 방식으로 force equation을 간단하게 하기 위해서 사용되어질 수 있다:



요약해서, Eq.11은 우리가 우리의 rigid body에 작용하는 힘들을 마치 그 힘들의 벡터 합이 전체 body의 질량을 가진 CM에서의 한점에 작용하는 것처럼 다룰 수 있다는 것을 말해준다. 우리는 CM의 가속도를 찾기 위해 힘을 (가령, 중력) M으로 나누고, 그러고나서 우리의 body에 대한 속도와 위치를 얻기위해 시간에 대해 그 가속도를 적분한다. 우리는 다음의 자료까지는 회전 효과를 무시할 것이기 때문에, 우리는 이제 우리가 rigid body dynamics를 하는데 필요한 모든 방정식을 가지게 되었다. Eq.11은 그 힘들이 몸에 어디에서 적용되었는지에 대한 어떠한 정보도 포함하지 않는다는 것에 유의해라. 그 정보는 linear momentum(선형 운동량)과 CM을 다룰 때 떨어져 나갔다.그래서 우리는 그것의 가속도를 찾기 위해 CM에 모든 힘을 그냥 적용한다. 우리가 다음 자료에서 힘이 주어졌을 때 회전을 계산한다면, 우리는 그 힘이 적용되는 위치가 어떻게 사용될지를 보여줄 것이다.

Ode to Joy
이 시점에서, 우리는 값 5를 임의로 선택하는 대신에 우리의 CM의 가속도를 계산하기 위해 Eq.11를 사용하여 또 다른 analytical 적분 예시를 훑어 볼 수 있다. 그러나, non-toy problems에 대해, analytical integration은 보통 대안이 아니다. integrand가 너무 복잡하기 때문이다. 그래서 우리는 결국에 numerical integration of ordinary differential equations (ODEs)라고 부릴는 것을 하게 될 것이다. 와우, 이제 그것은 정말 수학 처럼 들린다. 일단 너가 이것을 배우기만 한다면, 너가 올라가기를 요청할 시간이다. 운 좋게도, ODE의 numerical integration(수치 적분)은 들리는 것 만큼 꽤 복잡하지 않다. 그것이 의미하는 것을 알아내기 위해서, 그 안에 있는 구(phrase)를 떼어내 보자.

처음에, differential equation(미분 방정식)은 종속 변수(y) 그 자체와 독립변수(x)외에도 종속 변수(함수에서 y)의 미분이 그 방정식에 나타나는 방정식이다.  그것은 장황하지만, 여기에 몇 가지 예제가 있다: 만약 우리가 f = 2t같은 1D(1차원) 힘을 변화시키는 한 시간에 대한 방정식을 가진다면, f는 종속 변수이고 그리고 t는 독립 변수이다; f의 값은 t의 값에 의존한다는 것이다. 그러나, 만일 우리의 몸에 대한 그 힘의 방ㅈ어식이 우리의 body의 속도에 의존한다면 어떨까? 공기마찰은 이것과 같은 힘이다. - 그 비행기가 더욱 빨리 가면 갈수록, 그것은 더욱 많은 공기마찰을 만나게 된다. 또 다시 1D의 예제에서, 마찰력을 의미하는 것이 우리의 속도와 비례하는 비율로 우리의 body의 속도 줄인다면 어떨까?  (f = -v). 이제 우리는 한 문제를 ㅏㄱ진다, 왜냐하면 만약 우리가 f = ma = -v를 써서 가속도에 대해 풀려고 하고, 그것을 m으로 나눈다면, 우리는 다음을 얻게 된다 (가속도는 속도의 미분이라는 것을 기억해라):



속도에 대한 방정식이 그것 안에 속도에 대한 미분을 가지기 때문에 이것은 미분 방정식이다. Eq.12는 그 방정식이 오직 그 종속 변수의 ordinary derivatives(일반 미분)를 가지기 때문에, 소위 ordinary differential equation이라고 불린다. (parital derivatives(편미분)와 반대인 것이다. partial derivatives는 PDEs들을 만들고, 우리는 그것에 대해 말하지 않을 것이다).

이제 우리의 phrase의 다음 부분에 대해서 : 적분이다. dv/dt에 대한 방정식이 그것 안에 이미 v를 가질 때 t의 관점에서 v를 찾기위해 어떻게 dv/dt를 적분하는가? 그것은 불가능하게 들리지만, 실제로 물리학에서 거의 모든 방정식은 미분 방정식이다. 그래서 ODE들은 많이 연구되어 왔다. 미분 방정식들은 물리학에서 너무 많이 튀어나온다. 왜냐하면 한 양의 변화율은 매우 종종 그 양의 값에 의존하기 때문이다. 예를들어, 우리가 이미 공기마찰력에 의해 나온 그 deceleration (속도의 변화율)이 속도에 의존적이라고 말했었다. 다른 물리 예시들은 cooling (열 손실의 비율은 현재 기온에 의존한다)과 방사성 붕괴(radioactive decay, 붕괴의 비율은 방사능 물질이 얼마나 많이 존재하는가에 의존한다)를 포함한다.

우리의 phrase에서 최종 단어는 numerical인데, 그것은 구세주이다. 나는 analytically integrating differential equations의 이론이, 심지어 ordinary ones들이 거대하고 꽤 복잡하기 때문에 이것을 말한다. 그러나, 운영의 이상한 왜곡으로 인해, ODE들을 numerically하게 컴퓨터에서 적분하는 것은 상대적으로 이해하기에 쉽다. 내가 떠난 공간에서, 나는 가장 간단한 numerical integrator는 묘사할 것이다. 내가 지금 남겨둔 공간에서, 나는 가장 간단한 numerical integrator인 Euler's method를 설명할 것이고, 나중의 자료에서 그것에 대한 개선점을 남겨둔다.

거의 모든 numerical integrators 들이 오일러의 방식처럼, 기울기로서 1차 미분의 평이한 오래된 적분의 정의에 기반을 둔다: dy/dx는 x와 관련한 y의 기울기를 정의한다. 예를들어, 만약 우리가 1차 방정식 y = 5x를 가진다면, 그러면 dy/dx = 5이다. 이것은 너가 직선에 대해 예측하듯이 그 기울기가 모든 x의 값에 대해 상수 5라는 것이다. 다소 복잡합 예제는 포물선 y = x^2이다. 이 경우에, dy/dx = 2x이고, 그것은 각 x좌표에 대한 새로운 기을기의 정의이다. 나는 y = x^2을 그림 1에서 그렸다. 게다가, 나는 또한 그림 1에 기울기의 vector field를 덮어놓았다. gird에서 각 좌표에서 짧은 벡터로서 그 기울기 방정식에 대한 솔루션 dy/dy = 2x를 그리면서. 어떻게 vetor field가 모든 점에서 그 포물선에 접하는지를 주목해라. - 이것이 방정식 dy/dx = 2x를 만족시키는 것의 정의이다. 너는 또한 각각이 y축에서 평행이동된 그  vector field tangency를 만족시키는 많은 다른 포물선이 있다는 것에 주의해야 한다. 이러한 포물선들 각각은 너가 dy/dx = 2x를 적분할 때 얻는 적분상수의 다른 값을 사용해서 생성된다. 내가 그린 포물선ㅇ는 적분 상수 0과 일치한다. 왜냐하면 y = x^2이기 때문이다. 만약 내가 그 상수로 1을 선택한다면 나는 y = x^2 + 1을 얻고, 그것은 y로 1 단위 만큼 평행이도된 동일한 포물선이다.

이제 만약 너가 그림 1에서 vetor field가 포물선을 정의한다는 것을 모른다고 한다면, 그래서 너는 너 자신이 그 grid에 그냥 떨어진 것이다. 음, 만약 너가 그 기울기 방정식을 만족하려면, 너는 각 점에서 vector field를 따라야많 나다. 너가 감에 따라, 그 벡터 field는 방향을 바꾸고, 방향도 바꾸게 된다. 너는 알지 않느냐 - 잠시 후에, 너가 포물선을 추적하고, 또는 그것들 중 적어도 일부, 너가 어디에서 시작하는지에 의존한다고. 너는 그것을 깨닫지 못할지도 모른다. 그러나, 너는 vector field에 대해 그 방정식을 적분했다. 너는 (너가 시작하는 곳을 의존하거나 또는 너의 초기 상태에 의존하는) 특정한 포물선을 발견했다. 오직 그 도함수에 대한 방정식을 사용하여 (dy/dx를 평가하는 것은 너가 그 vector field를 따르는 방식이다.)

실제 미분 방정식에 같은 것을 하는 것은 쉽다. dy/dx = f(x,y) 형태의 미분 방정식에 대해, 기울기로서그 도함수의 정의 dy/dx는 x,y 그래프에서 각 좌표의 기울기를 정의한다. 만약 너가 dy/dx = f(x,y)에 의해 주어진 vector field를 그린다면, 너는 너가 포물선에 대해 했던 것처럼 그것을 따라갈 수 있다. 각 지점에서 도함수를 샘플링하고, 그 방향대로 나아간다. 그림 2는 Equation 12의 vector field를 보여준다. 이것은 우리의 공기 마찰 방정식이다. 수직 축은 속도이고, 수평축은 시간이다. (나는 이 그래프에서 임의로 m = 1을 선택했다). 그것은 또한 많은 가능한 솔루션 곡선들 중의 하나를 보여준다. 너는 만약 너가 그래프에서 초기 위치를 고른다면 (방정식에서 초기 속도와 대응되는), 시간이 지나감에 따라, 마찰이 너에게서 속도를 가져가기 때문에 너의 속도가 0으로 쇠퇴할 것을 볼 것이다. 너는 또한 너의 속도가 감소하는 비율이 너의 속도의 현재 값에 의존하는 것을 볼 수 있다: 너가 더 빠르게 갈수록, 그것은 더 빠르게 감소한다. 우리는 Equation 12에서 우리에게 정확히 이 결과를 주기 위해 선택했기 때문에, 이것은 말이 된다.

이러한 적분을 numerically하게 하는 것은, 꽤 그래프에서 하는 것과 유사하다. numerical integration의 오일러의 알고리즘은 간단히 초기 위치에서 그 현재 위치에서 기울기를 찾기 위해 그 도함수 방정식을 측정하고 그러고나서 그 접선에서 고정된 양만큼 시간 h 에서 진행하여 그 vector field를 따라간다.  그것은 그러고나서 새로운 기울기를 얻기위해 새로운 위치에서의 도함수를 측정하고 또 다른 time step을 취한다:



또는, 우리의 공기 마찰 방정식의 관점에서:



명백히 오일러 방식은 그것이 진행 될 때마다 작은 에러가 축적된다. 실제 vector field (그러므로 solution curve)가 어떤 점에서 곡선을 그리고 있기 때문이다. 그리고 오일러 알고리즘은 그 접선을 따라 진행하고 있다. 그러나 만약 그 스텝 사이즈 h가 충분히 작다면, 오일러 방식은 괜찮다. 우리는 이 에러를 나중에 좀 더 이야기 할 것이다.

오일러 방식으로 numerically 적분하는 것이 이게 다이다. 그러나, 너는 어떻게 위치를 얻기 위해 속도를 적분하는지 궁금할 것이다. 우리가 numerically하게 속도를 얻기 위해 가속도를 적분하기 때문에. 우리는 그냥 동시에 dv/dt = a를 적분하면서 dr/dt = v를 적분하기 위해 오일러 방식을 다시 사용한다. 우리는 두 개의 oridnary differential euqations로 끝나게 된다:




이것은 우리에게 우리이 오브젝트에 대한 몇 가지 임의의 힘으로부터 위치를 계산하기 위한 iterative algorithm을 준다. (그리고 이것은 우리가 보았듯이 속도에 의존하고, 그 몸체와 다른 몸체의 위치에 또는 한 번에 다 의존한다). 오일러의 방식은 힘이 어떻게 생겼는지를 신경쓰지 않는다, 너가 그것을 각 step에서 연산하는 한. 오일러는 질량에 대한 힘의 값을 기울기로 다루었고, 아무생각없이 나아간다.

나는 공간이 부족하다. 그래서 나는 레퍼런스를 줄 여유가 없다. 다음에, 나는 몇 가지 좋은 책들을 열거할 것이고, 어떻게 rigid bodies로 회전을 할지에 대해 들어갈 것이다.

===================================

댓글 없음:

댓글 쓰기