프로그래밍/수학

프로그래밍을 위한 수학 - 마찰력 모델링

Lou Park 2022. 9. 12. 13:40

마찰력(Friction)은 두 물체의 접촉면 사이에서 물체의 운동을 방해하는 힘이다. 그림에서처럼, 썰매와 눈이내린 언덕사이의 마찰력때문에 이 썰매는 언젠가 멈추게 될 것이다. 그러면 프로그래밍에서 이 썰매를 어떻게 멈추게 할 것인가? 이 글에서는 두 물체가 상대적으로 움직이면서 문질러질때 발생하는 운동 마찰력만을 다루려고 한다.

 

 

마찰력의 공식은 다음과 같다. 이제 마찰력을 크기방향 두 성분으로 나누어 어떻게 계산하면 되는지 살펴볼 것이다. 먼저 방향이다. 마찰력의 방향은 물체에 작용하고 있는 힘과 반대로 작용한다. 공식에서 v는 속도 벡터를 의미하는데, 속도 벡터에 -1을 곱해 방향을 반대로 틀었다.

// 벡터의 크기 구하기
function getMagnitude(x, y) {
    return Math.sqrt(x * x + y * y);
}

// 정규벡터 구하기
function getNormalizedVector(x, y) {
    var mag = getMagnitude(x, y);
    return [x / mag, y / mag];
}

function main() {
    // 속도 벡터 V(4, 3)
    var velocityX = 4;
    var velocityY = 3;

    var [normX, normY] = getNormalizedVector(velocityX, velocityY);

    // 방향을 반대로
    var fricX = normX * -1;
    var fricY = normY * -1;
}

현재까지를 Javascript로 구현하면 이렇게 된다. 이제 μN이 남았다. 이들은 스칼라 값으로, 마찰력의 크기를 나타낸다. μ마찰계수를 나타내는데, 물질에 따라 달라지는 값이다. 예를들면 얼음을 구현할때 마찰계수를 0.005 라고 잡았다면 아스팔트 도로 위에서는 0.07로 잡을 수 있다. 우리가 만들 프로그램에서는 임의로 μ = 0.01이라고 잡아보겠다.

 

https://byjus.com/physics/normal-force/

N은 수직항력(Normal Force)이다.

수직항력(Fn)은 표면에서 물체에 수직으로 작용하는 접촉 힘이다.

 

그림처럼 책상에 골드바가 놓여져있을 경우 수직항력은 중력과 크기는 같지만 방향은 반대이다. 수직 항력은 물체가 가라앉는 것을 방지하기 위해 책상에서 골드바로 가해지는 힘을 나타내는 것으로, 책상이 튼튼하지 않아서 골드바에 가해지는 중력보다 수직항력이 낮아지면 골드바는 가라앉게 될 것이다. 이때, 수직항력은 다음과 같이 표현한다.

 

N = mg (m=질량, g=중력가속도)

 

 

N = mgcosθ

 

하지만 만약에 물체가 기울어져있다면 다음과 같이 수직항력을 구할 수 있다. 위 그림에서 빗면을 누르는 힘은 cosθ, 미끄러 지는 힘은 sinθ이다.

 

왜 sin이고 cos가 되는지 까먹었다면 이 글이 도움이 될 것이다.

 

다시 돌아와서, 우리의 프로그램에는 경사면이 없으므로 N = mg 공식을 사용하면 되고 마찰력을 Javascript로 다음과 같이 표현 할 수 있다.

// 벡터의 크기 구하기
function getMagnitude(x, y) {
    return Math.sqrt(x * x + y * y);
}

// 정규벡터 구하기
function getNormalizedVector(x, y) {
    var mag = getMagnitude(x, y);
    return [x / mag, y / mag];
}

function main() {
    var gravity = 0.01; // 중력
    var mass = 1; // 질량
    var c = 0.01; // 마찰계수

    // 속도 벡터 V(4, 3)
    var velocityX = 4;
    var velocityY = 3;

    var [normX, normY] = getNormalizedVector(velocityX, velocityY);

    // 방향을 반대로
    var fricX = normX * -1;
    var fricY = normY * -1;

    var n = mass * gravity; // 수직항력
    fricX *= c * n;
    fricY *= c * n;

    // 물체의 위치에 fricX와 fricY를 더해주면 
    // 마찰력이 적용될 것이다.
}

 

 

참고자료

http://wiki.hash.kr/index.php/%EB%A7%88%EC%B0%B0%EB%A0%A5

https://ko.khanacademy.org/computing/computer-programming/programming-natural-simulations/programming-forces/a/modeling-gravity-and-friction

https://ko.wikipedia.org/wiki/%EC%88%98%EC%A7%81%ED%95%AD%EB%A0%A5#:~:text=%EC%97%AD%ED%95%99%EC%97%90%EC%84%9C%20%EC%88%98%EC%A7%81%ED%95%AD%EB%A0%A5%20F,%EB%90%98%EC%96%B4%20%EC%84%9C%EC%9E%88%EC%9D%84%20%EC%88%98%20%EC%9E%88%EA%B2%8C%20%EB%90%9C%EB%8B%A4.