안녕하세요. 승승이입니다.
이번에는 약간의 상상력도 필요한 이야기입니다. 우리가 물체가 분자로 이루어져 있고 그 안에 원자로 구성되어 있고 더 나아가서는 더 작은 물질들로 이루어져 있다는 이야기는 상식으로 알고 있습니다. 그 물질들의 대부분의 공간은 빈 공간입니다. 그런데 빈 공간에서 어떻게 우리가 물체를 만지고 잡을 수 있을까요? 우리가 보고 있는 실체는 99%가 빈 공간이기 때문에 눈으로 보는 세상과 실제로 만지는 느낌들은 단순히 뇌에 자극으로 들어오는 것이고 실체가 없는건 아닌가 하는 이야기도 있습니다.
과학적으로 보면 물체가 색을 가지는 것은 원자 껍데기에 있는 전자가 빛을 받아서 들뜬 상태로 되다가 다시 안정화 되면서 빛을 발산한 것을 눈으로 보기 때문입니다. 그러면 물체를 만지는 것은 어떻게 될까요? 이것도 역시 원자의 껍데기의 전자 구름이 전기적으로 반발하여 발생하는 현상입니다. 특별히 화학적이나 다른 어떤 이유로의 결합이 생기지 않으면 우리가 만지는 물체들은 서로 전기적인 반발에 의해서 반작용이 나타나거나, 충돌이 일어나거나 합니다.
그러니까 물체가 물체를 미는 것은 매우 작은 거리에서의 전기적인 반발로 생각하면 됩니다. 하지만 컴퓨터에서 실제로 전기적인 힘으로 충돌과 반발력을 구현하기에는 물질의 여러가지 상태가 많기 때문에 구현하기 힘듭니다. 여기서 필요한 것은 뉴턴의 유명한 법칙 1인 '운동량 보존 법칙'입니다.
컴퓨터상에서는 먼저 위치-속도-가속도의 법칙을 따르도록 설정합니다. 그리고 물체가 멀리 떨어져 있으면 어떠한 힘도 가하지 않아서 가속도는 0입니다. 하지만 어떤 이유로 두개의 물체가 부딪치게 된다면 '충돌'이 일어나게 됩니다.
물체가 서로 겹치게 된다면 서로 떨어지려는 힘이 작용해야 합니다. 그리고 두 물체가 서로 밀어내는 힘은 '작용 반작용 법칙'에 의해서 그 힘의 합은 0이 되어야 합니다. 물론 실험에서는 힘 뿐만 아니라 지켜져야 하는 법칙이 더 있습니다. 운동량 보존법칙입니다. 또 한가지는 법칙은 아니고 하나의 관계식인데, 반발계수 적용입니다. 운동량 보존법칙은 '작용 반작용' 법칙과 관련한 법칙입니다. 여기부터 좀더 이해하기 쉽게 쓰기 위해서 '[n]번째'를 적용하겠습니다.
여기서 컴퓨터의 가속도 x''은 x'의 변화량으로 다음과 같이 쓸 수 있습니다.
이것을 위 식에 정리하면,
왼쪽은 충돌 후의 운동량이고, 오른쪽은 충돌 전의 운동량입니다. 즉, 작용반작용만 적용해도 운동량 보존이 잘 된다는 것을 알 수 있습니다.
위 식만을 적용하면 완전 탄성 충돌을 구현이 가능합니다. 하지만 변수 하나만 더 사용해서 에너지가 소실되는 탄성운동을 만들어 볼까 합니다. 탄성계수는 다음과 같이 정의됩니다.
탄성계수는 충돌 전의 속도차이와 충돌 후의 속도차이의 음의 비례값인데, 이때 e는 0부터 1사이의 값을 가집니다.
(비례값이 아닌 음의 비례값을 가지는 이유는, 만약에 탄성계수가 1이고 무게가 같은 두개의 물체가 정면으로 충돌 시 모든 속도는 다음의 속도를 넘겨주게 되는데, 이때 충돌시킨 물체가 v에서 0으로, 충돌된 물체가 0에서 v가 되면 음의 값을 가지게 되므로 이것을 보정하기 위한 것입니다.)
2개의 식을 정리하면,
한쪽으로 정리해봅니다. 첫번째 식으로 부터 x'(n)으로 정리합니다.
정리한 것을 한쪽으로 옮겨 넣습니다.
위 식에서 x'(n-1)을 양변에 빼서 변화량을 다시 구하면,
x2의 가속도는 '작용 반작용'에 의해서 같은 힘을 받습니다. 따라서
결과적으로는 충돌이 일어나는 순간 두 물체의 가속도를 다음과 같이 주면 됩니다.
쉽게 구현할 줄 알았는데… 생각보다 오래걸리고 힘드네요. 이제 프로그래밍으로 구현할 시간입니다.
메인루프에서 한번에 계산하기 위해서 기존의 방법은 버리고 리스트를 사용해서 계산하기로 하였습니다.
위치리스트, 속도리스트, 가속도리스트, 무게리스트를 만들고 1번물체 2번물체 등이 리스트의 행 번호가 될 것입니다.
속도와 위치에 대한 계산은 n번째 행렬에 대해서 각각 순차적으로 계산합니다.
충돌시의 조건으로는 거리가 50이하일 경우에 계산됩니다.
충돌을 하게 되면 가속도를 주어진 공식만큼 바뀌게 하고, 충돌시의 계산 중복을 막기 위해서 @충돌계산수 변수를 사용해 방지해 주었습니다. 기존의 다른 시뮬레이션들은 속도를 변화하는 방식을 사용하지만 여기서는 가속도를 변화하는 방식이기 때문에 이런 방법을 써야 제대로 동작이 되었습니다.
충돌이 일어나지 않는 상태에서는 외력이나 기존의 힘이 닫지 않는 상태로 만들어 줍니다.
시뮬레이션을 하면 ks값(k의 1/10)을 0에서 10으로 조절하여 완전탄성에서 완전비탄성까지 잘 구현이 됬음을 확인이 가능합니다. 여기서 E는 에너지로써, 운동에너지를 알아본 것입니다. 완전탄성이 아닌 경우는 어디선가 에너지가 새어나가 두 물체 에너지가 충돌 후 더 작아지게 됩니다.
전체 스크립트 보기:
https://scratch.mit.edu/projects/185952316/
'스크래치 > 스크래치 물리강좌' 카테고리의 다른 글
스크래치 물리강좌. 충돌처리 만들기 (0) | 2018.04.20 |
---|---|
스크래치 물리강좌. 기본적인 모델링 (0) | 2018.04.20 |
스크래치 물리강좌. 운동방정식을 미분방정식으로 구현하는 이유 (0) | 2018.04.20 |
스크래치로 물리실험하기-6. 두개의 인력 (0) | 2017.11.12 |
스크래치로 물리실험하기-5. 두개의 물체의 스프링 작용 (0) | 2017.11.08 |
스크래치로 물리실험하기-4. 스프링실험 (0) | 2017.11.07 |
스크래치로 물리실험하기-3. 마찰력 실험 (0) | 2017.11.06 |
스크래치로 물리실험하기-2. 가속도/속도/위치 시뮬레이션 (0) | 2017.11.03 |
댓글