12.2 몇 가지 단순한 힘의 법칙 (Simple Force Laws)
우리 우주에서는 여러 종류의 힘이 작용합니다.(원주 12-6) 실시간 시뮬레이션에서는 일부 힘을 무시하거나 근사하고, 원하는 효과를 얻기 위해 가상의 힘을 만들어 내기도 합니다.(원주 12-7) 애니메이터의 제약에 맞는 궤적을 만들거나 AI나 플레이어가 목표를 맞히도록 돕는 것이 그 예입니다. 기본 원칙은 언제나 f=ma이지만 f를 정의하는 방법은 매우 다양합니다.
이 절에서는 현실에 존재하고 물리 시뮬레이션에도 자주 쓰이는 중요한 힘 세 가지를 다룹니다. 중력·마찰·용수철을 각각 12.2.1·12.2.2·12.2.3절에서 설명합니다. 물론 부력·항력·양력처럼 더 많은 실제 힘이 필요할 수 있습니다. 이 책의 목표는 중요한 주제의 개관을 제공하는 것이므로 모두를 망라하지 않습니다. 이런 힘을 다루는 자료는 12.7절의 추천 자료에서 찾을 수 있습니다.
물리 시뮬레이션에서 매우 중요한 또 다른 힘은 접촉력(contact force) 또는 수직항력(normal force)입니다. 물체들이 서로 관통하지 못하게 하는 힘입니다. 상자가 탁자 위에 놓여 있을 때 탁자가 상자에 가하는 힘이 중력을 상쇄하고 아래로 가속되는 것을 막습니다.
이것이 접촉력입니다. 물리 엔진에서 접촉력은 충돌을 해결하는 방식과 밀접하게 얽혀 있으며, 보통 시뮬레이션의 안정성과 물리적인 현실 사이에서 타협하는 방식으로 처리합니다. 따라서 구체적인 계산법은 엔진마다 다를 수 있습니다. 충돌 해결 자체가 매우 활발한 연구 분야입니다.
12.2.1 중력
뉴턴은 《프린키피아》에서 가장 유명한 세 운동 법칙 외에도 여러 법칙을 설명했습니다. 행성의 운동을 분석하여 발견한 만유인력 법칙(law of universal gravitation)도 그중 하나입니다. 우주의 모든 물체는 서로 끌어당기는 힘을 느낍니다. 그 힘은 두 질량의 곱에 비례하고 거리를 제곱한 값에 반비례하며, 식 12.3으로 계산합니다.
f는 힘의 크기, 는 두 물체의 질량, d는 두 질량중심 사이의 거리입니다. 질량중심의 정확한 뜻은 12.3.2절에서 더 설명합니다. G는 우주의 물리 상수이며, 원문에 실린 근사값은 입니다.
만유인력 법칙은 행성 운동이나 조수를 이해할 때, 혹은 느끼한 작업 멘트가 필요할 때 매우 유용합니다.(원주 12-8) 그러나 대부분의 시뮬레이션은 지표 근처의 비교적 작은 영역을 다룹니다. 데카르트 축 하나를 ‘아래’로 둔다는 흔한 가정은 지구의 곡률을 무시하고 중력 방향을 일정하게 고정한다는 뜻입니다.
고도가 높아질수록 중력이 조금 약해지는 점도 보통 무시하여 d를 일정하게 둡니다. 그러면 을 지구 질량이라고 할 때 식 12.3에서 변하는 것은 시뮬레이션하는 물체의 질량 뿐입니다. 대부분의 게임에서는 식 12.4로 중력을 계산합니다.
비디오 게임의 중력
m은 물체의 질량이고 g는 아래쪽을 향하는 일정한 벡터입니다. 중력의 크기는 질량에 비례하지만, 제2법칙에 따르면 같은 힘에 의한 가속도는 질량에 반비례합니다. 따라서 g는 자유 낙하하는 모든 물체의 중력 가속도를 나타냅니다. 식 12.4와 제2법칙 f=ma가 닮았다는 점을 보세요.
11장에서 현실의 g 크기를 말했지만, 만유인력 법칙으로 직접 구해 봅시다. 지구의 질량은 약 이고 평균 반지름은 6,371km입니다.
그런데 앞서 말한 9.81보다 큽니다! 원문은 중력이 구심력을 제공하는 한편, 지구의 자전이 겉보기 원심력을 만들어 중력의 일부를 상쇄하기 때문이라고 설명합니다. 11.8절에서 물체가 우주로 튕겨 나가지 않도록 붙잡는 데 필요한 가속도를 계산했습니다. 적도에서는 지구의 자전 때문에 중력이 0.03369m/s²의 구심 가속도를 제공해야 합니다. 따라서 물체를 무겁게 느끼게 하는 중력의 일부를 자전 효과가 상쇄하여 조금 가볍게 느끼게 합니다.
이 겉보기 원심 효과를 빼면 이 됩니다. 이번에는 찾던 9.81보다 작습니다. 원문은 지표에서 중력 크기가 위치에 따라 달라진다고 설명하며, 방금 계산한 구심 가속도가 위도별 중력 변화의 가장 큰 원인이라고 설명합니다. 이 자전 효과가 위도에 따라 달라진다는 것입니다.
방금은 원운동 반지름 r을 지구 반지름으로 놓았습니다. 원문은 이때 구한 9.796을 적도의 올바른 중력 값이라고 표현하지만, 이 근사 모델과 실제 지구의 차이는 아래에서 구분합니다.
위도가 높아져 극지방에 가까워지면 일정한 위도를 따라 도는 원의 반지름 r이 작아집니다. 극에서는 0이 되어 물체는 제자리에서 회전하지만 원 궤도를 따라 이동하지 않습니다. 따라서 원문의 구형 지구 모델에서는 겉보기 원심력이 없고 중력 가속도는 앞서 계산한 9.83이 됩니다. 원문은 9.81을 위도 약 45°의 해수면 평균값에 해당하는 ‘표준값’이라고 설명합니다. 표준 중력의 정확한 정의는 보충 주석을 참고하세요.
현실의 중력 크기를 제법 오래 이야기했으니, 게임에서는 이 숫자가 얼마나 완전히 무관해지기도 하는지 살펴봅시다. 레이싱·비행 시뮬레이터 같은 장르에서는 사실성이 중요합니다. 그러나 다른 많은 게임에서는 다음 비디오 게임 물리학 제1법칙이 적용됩니다. 뉴턴도 법칙을 만들었으니 우리도 못 만들 이유는 없겠지요?
비디오 게임 물리학 제1법칙: 현실은 과대평가되어 있다.
예를 들어 1인칭 슈팅 게임은 점프 조작이 나쁘기로 유명합니다. 가장 근본적인 이유는 발을 볼 수 없다는 사실일 것입니다. 그런데도 일부 게임은 무슨 이유에서인지 점프 퍼즐을 넣었습니다. 어깨너머 카메라를 사용하는 3인칭 슈팅 게임 중에도 점프 느낌이 어색한 경우가 많습니다. 왜 그럴까요?
많은 1인칭 슈팅 게임은 점프할 때 위쪽 초기 속도를 한 번 준 다음, 다른 공중 물체처럼 중력을 적용해 위치를 시뮬레이션합니다. 그러면 포물선 운동을 합니다. 이를 많은 3인칭 액션 게임의 점프와 비교해 보세요. 그런 게임 상당수는 일정한 가속도로 점프를 시뮬레이션하지 않습니다. 버튼을 누르면 거의 즉시 튀어 올라 빠르게 최고점에 도달합니다. 어떤 게임에서는 최고점에서 잠시 떠 있다가 올라간 만큼 빠르게 땅으로 내려꽂히며, 분화구까지 남깁니다.
물리적으로 정확하지는 않습니다. 하지만 자기 키의 두세 배를 뛰거나, 공중에서 방향을 바꾸거나, 이단 점프를 하는 것도 정확하지 않습니다. 게임의 점프에서는 현실이 과대평가되는 정도를 넘어 완전히 무시되기도 합니다. 현실 그대로는 느낌이 맞지 않는다는 것입니다.
중력을 사용하는 점프 자체가 좋지 않은 조작감을 만들 수 있다면, 9.8m/s²라는 실제 값을 고집하는 것은 더 나쁠 수도 있습니다. 플레이어는 점프에 일정한 시간이 걸리기를 기대하면서도 비현실적인 높이까지 뛰기를 기대하는 것이 기본 문제입니다. 실제 중력으로 그 높이에 도달하게 하면 너무 오래 공중에 머물러 ‘둥둥 뜨는’ 느낌이 납니다.
아케이드 레이싱 게임에서도 차를 빨리 지면으로 돌려보내기 위해 중력을 키우는 경우가 많습니다. 레이싱이든 캐릭터 게임이든 플레이어는 가능한 한 빨리 완전한 조작권을 되찾고 싶어 하며, 실제 중력이 내려보낼 때까지 기다리면 대개 너무 오래 걸립니다. 반대로 실제와 비슷한 차량 속도로 비현실적인 도약을 만들려고 중력을 낮추는 레이싱 게임도 있습니다.
플레이어가 조작하지 않는 물체에도 중력을 조절할 이유가 있습니다. 때로 실제 중력은 시뮬레이션 속 물체들이 ‘스티로폼으로 만든 것처럼’ 느껴지게 하므로,(원주 12-9) 더 빨리 넘어지고 안정되도록 중력을 높입니다. 다른 상황에서는 중력을 인위적으로 낮추면 큰 물체가 훨씬 거대하고 묵직해 보일 수 있습니다.
알맞은 효과음이 더해지면 특히 그렇습니다. 지구에서의 중력 가속도는 대략 일정하며, 사람이 멀리 있는 물체의 절대적인 크기를 가늠할 때 본능적으로 사용하는 몇 안 되는 단서 중 하나이기 때문입니다.(원주 12-10)
이 설계 논의를 읽으면서 저자들의 개별적인 취향보다 일반적인 메시지를 받아들였기를 바랍니다. ‘느낌이 좋다’는 것은 주관적이며, 핵심은 그것이 물리적 현실보다 플레이어의 기대에 더 크게 좌우된다는 점입니다. 결국 게임에서 가장 중요한 것은 CPU 안이나 화면 위에서 벌어지는 일이 아니라 플레이어의 마음속에서 벌어지는 일입니다. 사람의 마음은 암시에 크게 영향을 받습니다.
게임을 만들 때 사실성 추구 자체가 목적이 되어서는 안 된다는 점을 기억하세요. 성공적인 게임은 최종 목표인 재미에 도움이 되는 곳에서 사실성을 사용합니다. 사실성이 그 목표와 충돌하는 경우도 꽤 많습니다. 게임 제작자, 특히 프로그래머는 이 우선순위를 혼동하여 기술적으로 인상적이지만 재미는 없는 데모를 만들기도 합니다.
원주 12-6: 엄밀히는 여러 힘을 기본 상호작용과 구분해야 합니다. 원문은 자연의 힘을 네 가지 기본 상호작용으로 설명합니다. 물질이 다른 물질과 부딪쳐 생기는 힘의 대부분은 본질적으로 전기적인 힘입니다. 원자들이 서로 떨어져 있게 하는 것이 전기적 힘이기 때문입니다. 다만 거시적인 상황은 매우 다양하므로 여러 힘의 법칙으로 나누어 기술하는 편이 유용합니다.
원주 12-7: fictional(가상의)입니다. frictional(마찰의)과 혼동하지 마세요.
원주 12-8: 힌트: ‘heavenly body’를 꼭 넣으세요. 영어로 천체이면서 ‘천상 같은 몸매’라는 중의적인 작업 멘트가 됩니다.
원주 12-9: 불안정성을 감추려고 물리 시스템에 지나친 감쇠를 적용한 것이 원인인 경우가 많습니다.
원주 12-10: 플레치: 나는 이 기법을 ‘반지의 제왕 중력’이라고 부릅니다. 모리아 광산에서 탈출할 때 거대한 계단들이 무너지는 장면이 떠오릅니다.
원하는 점프 높이와 시간에서 중력 정하기
위쪽을 양수로 두고, 최고 높이를 h, 최고점까지 시간을 T로 정한 등가속도 점프라면 다음처럼 설계할 수 있습니다.
예를 들어 h=2m, T=0.4s면 , 입니다. 수치는 실제 중력과 다르지만 설계한 높이와 상승 시간을 동시에 만족합니다. 떨어질 때 다른 가속도를 적용하면 원문의 단일 포물선 모델과 달라진다는 점을 별도로 인식해야 합니다.
원문 근사 주의: 식 12.3의 단순한 질량중심 거리식은 점질량이나 구대칭 질량 분포에서 직접 사용할 수 있습니다. 임의 모양의 가까운 큰 물체에는 질량 분포를 고려해야 합니다. 또한 지구를 평균 반지름의 구로 보고 자전 효과만 뺀 9.796을 실제 적도 중력의 정확한 값으로 받아들이면 안 됩니다. 지구의 편평도와 위도에 따른 반지름 변화 등도 영향을 줍니다. NASA의 표는 적도에서 약 9.78m/s², 극에서 약 9.83m/s²를 제시합니다. NASA Earth Fact Sheet
표준 중력: 표준 중력 가속도는 관례로 정한 정확한 값 9.80665m/s²입니다. 특정 장소에서 매번 측정해 정하는 값과 구별합니다. 원문의 G와 지구 질량 수치는 원서의 근사값으로 보존했습니다. NIST SI 단위 안내
12.2.2 마찰력
페튜니아 화분 같은 물체를 표면 위에서 미끄러뜨리면 결국 멈춘다는 것을 압니다. 약간 기울어진 표면에 놓았을 때도 경사가 어떤 한계각을 넘기 전에는 반드시 아래로 미끄러지는 것은 아닙니다. 이 두 현상은 마찰력의 조금 다른 측면입니다.
우리는 마찰을 생산성을 방해하는 골칫거리, 기계를 닳게 하고 주유소에 더 자주 가게 만드는 나쁜 원인으로 생각하기 쉽습니다. 그러나 마찰이 없으면 방을 가로질러 걸을 수도, 아이나 페튜니아 화분을 들어 올릴 수도 없습니다. 자동차의 연비는 좋아질지 몰라도 변속기는 작동하지 않고 타이어는 앞으로 나아가지 못한 채 헛돌 것입니다.
여기서는 쿨롱 마찰(Coulomb friction)이라고도 하는 표준적인 건조 마찰 모델의 두 모드를 살펴봅니다. 마찰의 이해에는 여러 사람이 기여했지만, 이름이 붙은 사람은 샤를 오귀스탱 드 쿨롱(1736~1806)입니다.
물체가 다른 물체 위에 정지해 있다면, 붙어 있는 상태를 벗어나 움직이게 하는 데 일정한 힘이 필요합니다. 그보다 작은 힘을 가하면 마찰이 어떤 최대치까지 반대 힘으로 밀어냅니다. 이것이 정지 마찰(static friction)입니다. 조금 기울어진 탁자 위의 화분이 미끄러지지 않게 합니다.
정지 마찰을 이겨 물체가 움직이면, 마찰은 계속 두 표면의 상대 운동에 반대 방향으로 작용합니다. 이 힘은 운동 마찰(kinetic friction)이라 하며, 원문의 표준적인 설명에서는 정지 마찰의 최대 크기보다 작습니다. 움직이기 시작한 화분이 결국 멈추는 원인입니다.
마찰은 미시적인 수준의 복잡한 상호작용 결과이므로, 거시적인 행동을 비교적 단순한 식으로 설명할 수 있다는 점은 조금 놀랍습니다. 먼저 정지 마찰을 보겠습니다. 다른 힘처럼 벡터이며, 방향은 두 물체를 상대적으로 움직이게 하려는 힘에 반대입니다. “어느 쪽으로 밀어야 할지 마찰이 어떻게 알죠?”라는 속임수 같은 느낌이 들 수 있습니다.
그러나 이는 미시적으로 작용하는 수많은 전기적 힘의 합입니다. 두 물체가 접촉하며 생긴 분자 사이의 결합을 떼어 내는 데 힘이 필요합니다.
정지 마찰의 최대 크기에 대한 좋은 근사는 식 12.5입니다.
차원 없는 상수 를 정지 마찰 계수라고 하고, n은 수직항력의 크기입니다. 각각 자세히 봅시다.
우리 입장에서 는 쉬운 편입니다. 표에서 찾으면 됩니다! 표 12.1이 그런 표입니다. 조금 앞서 나가서 정지·운동 마찰 계수를 함께 보여주지만, 지금은 운동 마찰 열을 무시하세요.
물론 누군가는 표를 실제로 채워야 합니다. 측정 방법은 흥미롭고 우아하지만 여기서의 주된 관심사는 아닙니다. 중요한 것은 두 마찰 계수가 상호작용하는 두 표면 모두의 특성에 의존한다는 점입니다. 표는 표면 하나의 종류가 아니라 표면 쌍으로 찾습니다. 고무와 아스팔트의 계수를 알더라도 고무와 얼음, 나무와 아스팔트에 대해서는 아무것도 알 수 없습니다. 미시적인 상호작용이 복잡하므로 각 표면 쌍의 계수는 실험으로 측정해야 합니다.
표 12.1 — 정지·운동 마찰 계수. ‘—’는 원문에 값이 없는 칸입니다.
재료 1 | 재료 2 | 정지 마찰 계수 μs | 운동 마찰 계수 μk |
알루미늄 | 강철 | 0.61 | 0.47 |
구리 | 강철 | 0.53 | 0.36 |
가죽 | 금속 | 0.4 | 0.2 |
고무 | 마른 아스팔트 | 0.9 | 0.5~0.8 |
고무 | 젖은 아스팔트 | — | 0.25~0.75 |
고무 | 마른 콘크리트 | 1.0 | 0.6~0.85 |
고무 | 젖은 콘크리트 | 0.30 | 0.45~0.75 |
강철 | 강철 | 0.80 | — |
강철 | 테플론 | 0.04 | — |
테플론 | 테플론 | 0.04 | — |
나무 | 콘크리트 | 0.62 | — |
나무 | 깨끗한 금속 | 0.2~0.6 | — |
나무 | 얼음 | 0.05 | — |
나무 | 나무 | 0.25~0.5 | — |
왁스칠한 나무 | 마른 눈 | — | 0.04 |
다시 강조하지만 식 12.5는 정지 마찰의 최대값입니다. 매 순간 실제로 가하는 힘은 그 최대값까지, 옆으로 상대 운동을 일으키려는 힘의 크기에 맞추어집니다. 최대값을 넘으면 정지 마찰이 작동하지 못하고 운동 마찰로 바뀝니다.
식 12.5의 나머지 인자는 수직항력입니다. 두 표면이 서로 파고들지 않도록 표면에 수직으로 작용하는 힘입니다. 페튜니아 화분이 탁자 위에 놓인 흔한 상황에서는 중력을 상쇄하는 힘입니다. 더 정확히는 중력 중 두 표면을 서로 압착하려는 수직 성분을 상쇄합니다.
탁자가 기울어져 있다면 그림 12.4처럼 중력을 수직 성분과 표면을 따라가는 성분으로 나눌 수 있습니다. 컴퓨터에서는 아마 법선 벡터로 탁자의 방향을 나타내고, 2.11.2절처럼 내적을 사용해 성분을 분리할 것입니다. 화분과 탁자는 수직 방향으로 서로에 대해 가속되지 않으므로, 탁자가 화분을 밀어내는 힘은 중력이 탁자 쪽으로 화분을 당기는 수직 성분과 정확히 같아야 합니다.
그림 12.4 — 여러 경사각의 탁자 위에 놓인 페튜니아 화분의 자유 물체도
그림 12.4는 같은 화분을 여러 각도의 탁자 위에 놓은 자유 물체도입니다. 각 그림에서 g로 표시한 중력은 같습니다. 수직 성분과 옆 방향 성분은 파란색으로 나누어 그렸습니다. 실제 정지 마찰력은 라고 표시한 검은 벡터입니다. 왼쪽의 ‘max fs’는 가능한 최대 마찰이고, 가운데와 오른쪽은 최대 마찰을 적용한 상태입니다.
첫 번째 상황에서는 미끄럼을 막는 데 필요한 것보다 더 큰 마찰 능력이 있습니다. 그러나 경사를 키우면 중력의 수직 성분이 줄어 가능한 최대 마찰도 줄어듭니다. 동시에 옆 방향 성분은 커져 화분을 미끄러뜨리려 합니다. 평형을 유지하려면 정지 마찰이 그 성분을 상쇄해야 합니다.
가운데 그림은 중력의 옆 방향 성분이 최대 마찰과 정확히 같아지는 임계각입니다. 오른쪽에서는 화분을 손으로 잡고 더 기울였다가 놓는다고 생각합니다. 최대 마찰을 적용하지만, 수직항력이 줄어 가운데 때보다 최대 마찰이 작고, 커진 옆 방향 중력을 이기지 못합니다. 이 그림을 찍은 직후 마찰은 정지 모드에서 운동 모드로 바뀌고, 화분이 탁자에서 미끄러져 떨어져 깨지고, 만화 같은 청소 로봇이 벽의 작은 문으로 달려 나와 잔해를 치웁니다.
운동 마찰의 계산은 본질적으로 같습니다. 아래첨자 s를 k로 바꾸면 됩니다.
운동 마찰의 방향은 언제나 두 표면의 상대 운동에 반대입니다. 제3법칙에 따라 실제로는 화분에 작용하는 힘과 탁자에 작용하는 힘, 서로 반대인 두 힘이 있습니다. 앞서 말했듯 운동 마찰 계수는 보통 정지 마찰 계수보다 작습니다. 따라서 탁자를 아주 천천히 기울여 정지 마찰을 막 이겨 내면, 두 계수의 차이 때문에 화분이 가속되기 시작합니다.
쿨롱의 핵심 기여, 이른바 쿨롱 마찰 법칙은 운동 마찰력이 두 표면의 상대 속력에 의존하지 않는다는 것입니다. 따라서 정지 마찰과 달리 실제 힘과 최대 힘을 따로 구별하지 않습니다.
식 12.5와 12.6에는 두 물체의 접촉 면적이 나오지 않습니다. 같은 무게지만 바닥 면적은 작고 더 키가 큰 화분으로 옮겨 심는다고 합시다. 탁자와 닿는 면적은 줄었지만 그림 12.4의 자유 물체도에 나타나는 힘은 그대로입니다. 미끄러지기 시작하는 각도도 변하지 않습니다!
면적이 넓으면 더 많이 ‘붙잡을’ 것 같지만, 압력 변화가 이를 상쇄합니다. 원문은 이 설명에서 ‘더 작은 면적에 같은 수직항력이 분포하므로 압력이 감소한다’고 적었는데, 면적과 압력의 방향이 뒤섞인 표현입니다. 정확한 관계는 아래에 구분했습니다. 물론 매우 키가 큰 화분은 미끄러지기 전에 넘어질 수도 있습니다. 그것은 회전의 문제이며, 지레팔이 길어져 토크가 커지기 때문입니다. 12.5절에서 다룹니다.
정지 마찰은 언제나 최댓값이 아닙니다
수직항력이 10N이고 μs=0.5라면 정지 마찰은 최대 5N입니다. 옆으로 2N만 밀면 정지 마찰도 반대로 2N입니다. 처음부터 5N을 적용하면 정지해 있어야 하는 물체가 거꾸로 움직이는 잘못된 시뮬레이션이 됩니다.
정지한 경사면 위 물체에서 다른 힘을 무시하면 , 경사 아래로의 힘은 입니다. 미끄러지지 않는 조건은 다음과 같습니다.
질량이 약분되므로 이 단순한 모델에서는 같은 표면 쌍의 미끄럼 임계각이 물체 질량에 의존하지 않습니다.
원문 표·표현 주의: 표 12.1의 ‘젖은 콘크리트/고무’ 행은 정지 0.30, 운동 0.45~0.75로 적혀 있어 바로 앞의 전형적인 계수 관계와 맞지 않습니다. 값은 원문대로 보존했습니다. 실제 표면 상태와 측정 조건을 알 수 없으므로 제작용 재료 상수로 그대로 확정하지 마세요.
압력 설명 교정: 같은 수직항력에서 접촉 면적이 커지면 평균 압력은 작아지고, 면적이 작아지면 압력은 커집니다. 입니다. 원문의 마지막 문장은 작은 면적과 압력 감소를 연결한 방향이 잘못되어 있습니다. 면적이 식에 직접 들어가지 않는다는 결론은 여기서 가정한 이상적인 쿨롱 마찰 모델의 특성입니다.
12.2.3 용수철의 힘
별도 절에서 설명할 만큼 중요한 힘이 하나 더 있습니다. 평형 위치에서 벗어난 용수철이 가하는 힘입니다. 왜 이런 특이한 힘을 다룰까요? 게임에서 갑자기 용수철이 중요해졌고, 정확한 시뮬레이션이 핵심 플레이 요소라도 된 걸까요? 사실 그렇습니다. 눈에 보이는 용수철은 많지 않아도, 게임 속에는 수많은 가상 용수철이 작동하고 있을 가능성이 큽니다. 용수철의 일반적인 행동은 제약 조건을 지키게 하거나 물체가 서로 관통하는 것을 막는 데 유용합니다.
이 절에서는 감쇠가 없는 진동과 감쇠가 있는 진동의 고전적인 운동 방정식을 차례로 설명합니다. 게임 프로그래머가 가상 용수철, 흔히 용수철·댐퍼 시스템을 사용할 때 실제로 쓰는 것은 제어 시스템인 경우가 많습니다. 문제에서 물리적인 비유를 걷어내고 순수한 수학으로 보면 이점이 있습니다. 애초에 물리적인 문제가 아니었는데 용수철·댐퍼 도구를 적용하려고 물리적인 말로 바꾸어 놓은 경우도 많습니다.
마찰 법칙처럼 용수철의 힘 법칙도 복잡한 미시적 상호작용에서 나온 거시적 행동을 놀랍도록 정확하게 근사합니다. 한쪽 끝을 고정하고 다른 끝은 1차원으로 움직일 수 있는 용수철을 생각해 봅시다. 외력이 없이 평형일 때의 자연스러운 길이를 정지 길이(rest length)라고 합니다. 잡아 늘리면 원래 길이로 돌아가려 당기고, 압축하면 밀어냅니다. 각 경우의 힘이 얼마나 큰지는 힘의 법칙이 알려줍니다.
용수철의 힘 법칙은 훅의 법칙(Hooke's law)입니다. 기본적으로 복원력은 현재 길이와 정지 길이의 차이에 비례합니다. 단, 재료에 따라 달라지는 탄성 한계(elastic limit)를 넘지 않는 범위에서 성립합니다. 현재 길이를 l, 정지 길이를 라 하면 복원력은 다음과 같습니다.
상수 k는 용수철 상수(spring constant)이며, 얼마나 ‘뻣뻣한’ 용수철인지 나타냅니다. 차원이 없는 수는 아닙니다. 식 12.7이 성립하려면 다음 관계를 만족해야 합니다.
그냥 ‘단위 길이당 힘’이라고 생각해도 됩니다.
용수철의 정말 흥미로운 점은 시간에 따른 행동입니다. 이를 보기 위해 복원력을 받는 입자의 운동학에 초점을 맞추어 훅의 법칙을 다시 쓰겠습니다. 구하려는 것은 입자의 위치·속도·가속도 함수입니다.
x=0이 복원력이 없는 정지 위치를 나타내는 기준계를 택하면 편리합니다. 힘보다 가속도에 관심이 있으므로 이라는 상수도 도입합니다. 용수철 상수 k와 입자 질량 m을 함께 담아, 이 용수철이 해당 입자를 얼마나 가속할 수 있는지 나타내는 값입니다. 이렇게 표기를 바꾸면 식 12.7은 다음이 됩니다.
이 식이 식 12.7과 같은 내용인지 스스로 확인하고 넘어가세요.
식 12.8은 위치 함수와 가속도 함수의 관계를 말하지만, 우리가 원하는 것은 x(t) 자체입니다. 이런 식을 미분방정식(differential equation)이라고 합니다. 미지의 함수와 그 함수의 하나 이상의 도함수 사이 관계를 기술합니다. 가속도가 위치의 두 번째 도함수라는 점을 기억하세요. 미분방정식을 ‘푼다’는 것은 식을 만족하는 미지의 x(t)를 찾는다는 뜻입니다.
이 책에서는 미분·적분의 기초만 간략히 살펴보았으므로 미분방정식을 푸는 기법까지 다룰 수는 없습니다. 다행히 어떤 x(t)가 해인지 검산하는 데 미분방정식 풀이법은 필요하지 않습니다. 함수를 미분할 줄만 알면 됩니다. 이 책에서 미분방정식과 마주치는 몇 경우에는 그것으로 충분합니다.
그래프를 보면 x(t)의 모양을 꽤 잘 추측할 수 있습니다. 순환 논리는 아닙니다. 그래프를 얻기 위해 x(t)를 미리 알 필요는 없고, 기록 장치를 붙인 용수철만 있으면 됩니다.(원주 12-11) 그림 12.5가 그런 그래프입니다.
그림 12.5 — 용수철 운동의 그래프. 어딘가 익숙한 모양이지요?
익숙한 함수일 것입니다. 코사인 곡선입니다. 위치를 일단 라고 놓으면 어떻게 될까요? 두 번 미분해 속도와 가속도를 구합니다. 사인·코사인의 미분은 11.4.6절에서 배웠습니다.
거의 맞지만 K라는 인자가 빠져 있습니다.
K가 x(t)의 어디에 들어가야 할지 알아보려면 K를 바꿀 때 그래프가 어떻게 변하는지 생각해 봅시다. 용수철의 뻣뻣함이나 끝에 단 기록 장치의 질량을 바꾸어 실험을 반복하는 것입니다. K가 커지면, 즉 용수철이 더 뻣뻣하거나 기록 장치가 가벼워지면, 그래프가 가로로 ‘압축’되어 진동수가 커집니다. K가 작으면 진동이 느려지고 그래프가 가로로 늘어납니다.
또 진동수는 K의 제곱근에 비례합니다. K를 네 배로 하면 진동수가 두 배가 됩니다. 시간축의 배율을 조절하는 것이므로 K를 어디에 넣어야 할지 힌트를 얻습니다.
식 12.8에 대입하면 해임을 검증할 수 있습니다. 라는 점을 기억하면 다음과 같습니다.
를 각진동수(angular frequency)라고 합니다. 자주 나오므로 다음 표기를 도입하면 편합니다.
그러면 해를 다음처럼 적을 수 있습니다.
이 형태를 보면 ‘각진동수’라는 이름의 이유도 드러납니다.
이제 용수철의 운동학 방정식을 찾았습니다. 정확히는 미분방정식의 한 해를 찾았다고 해야겠습니다. 식 12.9에는 반영하지 않은 자유도가 있습니다. 첫째, 최대 변위인 진폭(amplitude) A를 고려하지 않았습니다. 지금 식의 진폭은 언제나 1입니다. 둘째, 라고 가정했습니다.
용수철을 최대 변위 A까지 늘인 뒤 초기 속도 0으로 놓았다는 뜻입니다. 일반적으로는 인 위치까지 당겼다가 밀어서 초기 속도 를 줄 수도 있습니다.
완전히 일반적인 식을 만들려면 진폭·초기 위치·초기 속도라는 세 변수를 더 담아야 할 것처럼 보입니다. 하지만 이 세 값은 서로 관련됩니다. 원문은 둘을 정하면 셋째가 고정된다고 설명합니다. 아래 보충에서는 방향 부호의 주의점을 설명합니다. A는 유지하되, 는 t=0에서 주기의 어디에 있는지를 나타내는 위상 오프셋(phase offset) 로 바꾸겠습니다.
위상을 조절하면 그래프가 시간축을 따라 가로로 이동합니다. 두 변수를 더하면 단순 조화 운동(simple harmonic motion)의 일반해를 얻습니다.
몇 가지를 살펴봅시다. 먼저 사인과 코사인은 서로 이동한 함수입니다. 입니다. 따라서 사인으로 x(t)를 써도 됩니다. 주로 취향의 문제이며 위상을 π/2만큼 조절하면 됩니다. 정현파(sinusoidal)라는 말은 사인과 코사인 모두의 모양을 가리킬 수 있으므로, 어느 것을 써도 되는 상황에서는 이 말을 사용합니다.
다음으로 진동수를 생각해 봅시다. 사인·코사인의 주기는 2π이므로, 가 2π만큼 늘어나는 시간에 한 주기를 마칩니다. 각진동수 ω는 단위 시간당 라디안입니다. 단위 시간당 주기 수인 진동수 F로 나타내면 다음과 같습니다.
진동수는 용수철 강성과 질량의 비율에만 의존합니다. 특히 초기 변위 에는 의존하지 않습니다. 더 멀리 당겼다가 놓으면 진폭은 커지지만 진동수는 그대로입니다.
여러 상황에서는 우리가 조절하려는 중요한 값이 바로 진동수입니다. 실제로는 제어 시스템인 가상 용수철에서 특히 그렇습니다. 이 경우 용수철 상수나 질량을 굳이 다루지 않고 진동수로 운동 방정식을 직접 적을 수 있습니다.
지금까지는 복원력만 존재하여 용수철이 영원히 진동하는, 현실에는 없는 상황을 연구했습니다. 실제로는 적어도 두 가지 힘이 더 있습니다. 하나는 구동력(driving force)이라고도 하는 외력으로, 시스템의 ‘입력’이 되어 처음 움직임을 시작하게 합니다. 다른 하나는 실제 용수철이 겪는 마찰로, 결국 운동을 멈추게 합니다.
진동계의 진폭을 줄이는 효과를 통틀어 감쇠(damping)라고 하고, 시간이 지나면서 진폭이 줄어드는 진동을 감쇠 진동(damped oscillation)이라고 합니다. 감쇠력은 우리의 목적에 특히 중요하므로 자세히 살펴봅시다.
가장 흔한 모델은 속도에 비례하면서 방향은 반대인 단순한 감쇠력입니다. 마찰 법칙과 비슷하지만, 이전 절의 수직항력에 관한 문제는 없습니다.
는 순간적인 감쇠력의 크기와 방향을 함께 나타내고, 는 순간 속도, c는 점성이나 거칠기 등을 나타내는 상수입니다.
힘의 형태는 매우 단순하지만, 복원력처럼 시간에 따른 운동을 보면 흥미로워집니다. 감쇠가 있는 용수철과 감쇠가 없는 용수철이 어떻게 다를지 정성적으로 예측할 수 있습니다. 가장 분명한 예측은 시간이 지나며 진폭이 줄고, 매 주기 최고 변위가 이전보다 작아진다는 것입니다. 마찰처럼 감쇠는 계에서 에너지를 제거합니다.
두 번째 예측은 조금 덜 분명합니다. 감쇠가 끝에 매달린 질량의 운동을 느리게 하므로, 감쇠가 없을 때보다 진동수도 줄어들 것이라고 기대합니다. 두 예측은 맞지만 구체적으로 알려면 수학을 분석해야 합니다.
복원력과 감쇠력을 합한 알짜힘은 다음과 같습니다.
운동 방정식을 구하려면 힘 대신 가속도가 필요합니다. 뉴턴의 제2법칙을 적용하고 질량으로 나누면 다음을 얻습니다.
원주 12-11: MIT의 월터 르윈 교수는 물리 강의에서 이 시범을 보여줍니다. 원문은 MIT OpenCourseWare, http://ocw.mit.edu 에서 강의들을 무료로 내려받을 수 있다고 안내합니다. 이 문장은 원서 집필 당시의 안내를 보존한 것입니다.
초기 상태를 빠짐없이 정하기
식 12.7의 는 방향 부호를 가진 1차원 힘입니다. 원문이 ‘크기’라고 표현해도, 진정한 크기만 구하려면 처럼 절댓값이 필요합니다.
초기 위치와 속도를 알면 진폭과 위상을 다음처럼 구할 수 있습니다.
A=0이면 운동은 정지이며 위상은 의미가 없습니다. 원문의 ‘세 변수 중 둘을 정하면 셋째가 정해진다’는 말에는 부호에 관한 주의가 필요합니다. A와 만 주면 속도의 크기는 정해지지만 어느 방향으로 움직이는지는 아직 두 가능성이 남습니다. 를 함께 지정하면 이 모호함이 사라집니다.
감쇠비와 감쇠 진동
이제 두 양을 도입하여 식을 다시 쓰겠습니다. 첫째 는 비감쇠 각진동수(undamped angular frequency)로, 사실 새로운 값은 아닙니다. 앞서의 와 같습니다. 실제 진동수가 아니라 감쇠가 없을 때의 진동수임을 강조하려고 아래첨자 0을 붙였습니다. 실제 진동은 더 느릴 것이라고 예상했다는 점을 기억하세요.
둘째는 감쇠비(damping ratio)로, 감쇠 계수 c와 혼동하면 안 됩니다. 전통적으로 그리스 문자 제타 를 씁니다. 모양이 특이해서 손으로 쓰려면 연습이 좀 필요합니다. 감쇠 계수·질량·비감쇠 각진동수와의 관계는 다음과 같습니다.
조금 뒤 의 정성적인 의미를 설명하면, 이렇게 임의적으로 보이는 식을 사용하는 이유가 분명해질 것입니다.
식 12.11에 와 를 대입하면 다음을 얻습니다.
미분방정식을 공부한 독자는 이것이 상수 계수를 가진 2계 선형 동차 미분방정식이라는 것을 알아볼 것입니다. 우리가 바랄 수 있는 가장 다루기 좋은 종류 중 하나이며, 종이와 연필로 실제 해를 구할 수 있습니다. 배우지 않은 독자도 걱정하지 마세요. 답을 이해하는 데 그 지식은 필요하지 않습니다. 원문은 유도를 생략하고 바로 답으로 넘어갑니다. 부족 감쇠·임계 감쇠·과감쇠의 세 경우로 나뉩니다.
이면 부족 감쇠(underdamped)라고 합니다. 예상한 대로 진동을 계속하면서 진폭이 시간에 따라 지수적으로 줄어듭니다. 단, 끝점 에서는 감쇠 자체가 없다는 예외를 아래에서도 확인합니다. 운동 방정식은 다음과 같습니다.
는 실제 감쇠 진동의 각진동수이며, 비감쇠 각진동수와 다음 관계가 있습니다.
상수 는 초기 위치와 속도로 결정합니다.
을 넣으면 감쇠가 없는 진동을 얻으며, 식 12.13은 식 12.10과 같은 결과를 나타냅니다.
감쇠비를 키우면 진동수가 줄어들 것이라는 직관을 식 12.14로 확인할 수 있습니다. 에서는 진동수가 완전히 사라집니다. 이 경계를 임계 감쇠(critical damping)라고 하며, 계의 행동이 정성적으로 달라집니다. 더는 진동하지 않고 지수적으로 줄어듭니다. 이때 운동 방정식은 다음과 같습니다.
상수들은 다시 초기 조건으로 정합니다.
임계 감쇠는 진동 없이 가능한 한 빠르게 줄어드는 적절한 감쇠량입니다. 감쇠를 줄이면 앞서 본 부족 감쇠가 되어 진동하고, 더 키우면 과감쇠(overdamped)가 됩니다. 과감쇠에서는 진동하지 않지만 임계 감쇠보다 느리게 줄어듭니다. 그림 12.6은 감쇠 값에 따른 행동 변화를 보여줍니다.
그림 12.6 — 비감쇠·부족 감쇠·임계 감쇠 시스템
게임의 용수철·댐퍼 제어 시스템
물리 교과서나 위키백과에서 볼 수 있는 고전적인 식을 복습했으니, 게임에서 용수철·댐퍼 시스템을 제어 시스템으로 사용하는 방법도 이야기해 봅시다. 일반적인 제어 시스템은(원주 12-12) 어떤 목표값을 나타내는 시간 함수를 입력으로 받습니다.
예를 들어 카메라 코드는 매 프레임 플레이어 위치로부터 목표 카메라 위치를 계산할 수 있습니다. AI는 적의 정확한 조준각을 정하고, 조작 스틱의 기울기에 따라 플레이어의 목표 속도를 정할 수도 있습니다. 메뉴에서는 현재 선택한 항목에 따라 강조 효과의 목표 화면 위치를 정할 수 있습니다. 어느 경우든 현재 입력 신호의 값을 제어 용어로 설정값(set point)이라고 합니다.
설정값은 본질적으로 용수철의 정지 위치입니다. 입력 신호는 누군가 용수철의 반대쪽 끝을 잡아 이리저리 움직이는 것과 같습니다. 구동력과 비슷하지만, 보통 힘이나 가속도 대신 위치를 기술하는 함수가 주어진다는 차이가 있습니다.
제어 시스템의 일은 입력 신호를 받아 출력 신호를 만드는 것입니다. 앞의 예에서는 프레임마다 실제 사용할 카메라 위치, 적이 무기를 겨누는 실제 애니메이션 조준각, 실제 플레이어 속도, 실제 강조 효과의 화면 위치가 됩니다. 많은 제어 시스템에서는 실제 위치와 설정값을 각각 쓰기보다 둘 사이의 오차(error)만 필요합니다.
“원하는 값을 이미 알면 그냥 그것을 쓰면 되지 않나요?”라는 질문이 당연히 나옵니다. 너무 덜컥거리기 때문입니다. 자동차의 충격 흡수 장치와 용수철이 도로 높낮이를 그대로 차체에 전달하지 않는 것과 같습니다. 자동차 서스펜션은 전형적인 용수철·댐퍼 시스템입니다. 게임의 제어 시스템도 카메라가 갑자기 새 위치로 튀거나 플레이어가 갑자기 움직이게 하는 상태 변화를 부드럽게 만들기 위해 설계하는 경우가 많습니다.
카메라나 화면 강조 효과는 물리적인 대상이 아니므로 질량이라는 양은 적절하지 않아 생략합니다. 그래도 미분방정식과 그 해는 같습니다. 용수철 비유를 벗기면 PD 제어기(PD controller)가 남습니다. P는 proportional, 즉 비례이며 현재 오차에 비례해 작용하는 용수철 부분입니다. D는 derivative, 즉 미분이며 순간적인 작용이 도함수인 속도에 비례하는 댐퍼 부분입니다.
PD 제어기와 더 발전된 친척인 PID 제어기는 널리 쓰이는 도구입니다. PID의 I는 integral, 즉 적분이며 정상상태 오차를 없애는 데 사용합니다. 수십 년, 어쩌면 수백 년 동안 표준 공학 도구로 쓰여 잘 이해되어 왔습니다. 그런데도 게임 프로그래밍에서는 이런 기존 방법을 모르고 처음부터 다시 구현하는 일이 자주 일어납니다.
실제 시뮬레이션 코드는 식 12.11에 대한 매우 단순한 오일러 적분입니다. 12.6.3절에서 보겠지만, 이 거창한 표현은 코드 12.1 같은 코드를 뜻합니다.
코드 12.1 — 단순한 용수철·댐퍼 제어 시스템. 구조체 이름 SprintDamper는 원문 표기를 보존했습니다.
struct SprintDamper {
float value; // 현재 값
float setPoint; // 원하는 값
float velocity; // 현재 '속도': value의 도함수
float c; // 감쇠 계수
float k; // 용수철 상수
// 주어진 시간 간격만큼 전진하여 값과 속도를 갱신합니다.
void update(float dt) {
// 가속도를 계산합니다.
float error = value - setPoint;
float accel = -error*k - c*velocity;
// 오일러 적분
velocity += accel*dt;
value += velocity*dt;
}
};
C++
복사
자동차마다 서스펜션 조정이 다릅니다. 스포츠카는 더 ‘단단하고’, 은퇴자들이 좋아하는 차는 더 부드럽습니다. 제어 시스템도 원하는 반응을 얻도록 조절합니다. 시뮬레이션은 식 12.11의 k와 c를 사용합니다. 하지만 대부분의 사람에게 이 두 값은 직관적으로 이해하기 쉬운 조절 값가 아닙니다. 그래서 설계자에게는 감쇠비와 진동수를 노출하고, k와 c는 거기서 계산하는 방식이 흔합니다.
진동수는 감쇠 또는 비감쇠 값을 조절할 수 있고, 각진동수나 헤르츠 중 하나로 표현할 수도 있습니다. 느낌이 좋은 값은 결국 실험으로 정하므로 단위와 절대값 자체는 중요하지 않은 경우가 많습니다. 게임의 여러 시스템에서는 진동이 바람직하지 않으므로 임계 감쇠를 가정해 로 고정하기도 합니다.
그러면 조절할 값은 ‘진동수’ 하나만 남습니다. 실제로 진동하지 않으므로 따옴표를 붙였습니다. 큰 값은 스포츠카처럼 반응이 빠르지만 거칠고, 작은 값은 부드럽지만 반응이 늦는 느낌을 줄 수 있습니다.
시뮬레이션에서는 운동학 식 12.13과 12.15를 직접 사용할 필요가 없고, 부족 감쇠·임계 감쇠·과감쇠를 명시적으로 나눌 필요도 없습니다.
마지막으로 지금 설명한 2계 시스템이 유일한 제어 시스템도, 가장 단순한 제어 시스템도 아니라는 점을 언급해야겠습니다. 다만 아주 넓은 범위에서 안정적으로 작동하고 구현·조절이 쉽습니다. 다른 흔한 방법은 단순 1차 지연(first-order lag)입니다. 원문은 라고 적고 오차가 지수적으로 감소한다고 설명합니다. 이 식의 부호 조건은 아래에서 바로잡습니다. 임계 감쇠 2계 시스템과 비슷하지만 설정값이 갑자기 바뀔 때 반응이 조금 더 급합니다.
또 중요한 방법은 설정값을 일정한 속도로 ‘쫓아가는’ 것입니다. 필터(filter)도 넓은 범주의 제어 시스템이며, 이전 프레임들의 설정값이나 값들을 선형 결합하여 출력을 계산합니다.
원주 12-12: 가능한 가장 넓은 의미의 ‘제어 시스템’ 정의는 아니지만, 가장 흔한 경우입니다.
조절 값과 적분법을 분리해서 보기
질량을 생략한 코드 12.1에서는 , 로 연결하면 됩니다. 원래의 물리적인 용수철 상수와 감쇠 계수라면 질량으로 나눈 값이라는 점이 중요합니다.
코드는 속도를 먼저 갱신한 뒤 새 속도로 위치를 갱신합니다. 구체적으로는 반암시적 오일러(semi-implicit Euler) 방식입니다. 연속 시간의 식이 안정적이라고 해서 어떤 dt에서나 이산 갱신까지 안정적인 것은 아닙니다. 큰 시간 간격이나 매우 큰 k에서는 수치적으로 진동하거나 발산할 수 있습니다.
1차 지연식의 부호: 오차가 를 따르면 입니다. 감소하려면 k<0이어야 합니다. 양수 조절 값 λ를 쓰려면 라고 적습니다. 고정된 목표 r을 따라가는 위치 q라면 다음 갱신은 해당 1차 모델의 정확한 시간 해입니다.
이는 용수철·댐퍼의 2계 운동과 다른 모델입니다. 상황에 맞게 선택해야 합니다.
임계 감쇠 주의: ‘진동하지 않는다’는 말과 ‘어떤 초기 속도에서도 목표를 한 번도 넘지 않는다’는 말은 같지 않습니다. 충분히 큰 초기 속도를 주면 임계 감쇠 해도 목표를 한 번 지날 수 있습니다. 원문의 ‘가장 빠른 비진동 복귀’는 이런 초기 조건과 비교 기준을 고려해 해석하세요.







