본문 바로가기
카테고리 없음

[게임이론] 마찰력의 활용

by Mulder5 2021. 1. 21.
반응형

[게임이론] 마찰력과 저항력에서 학습한 것들을 바탕으로 Unity에서의 예제를 구현해본다.

마찰력

아래와 같이 경사가 있는 Slope와 Box가 있고 마찰력에 의해 상자가 움직이거나 움직이지 않는 것을 바탕으로 마찰력에 대해 알아본다.

 

이 예에서는 Box의 friction이 0.9, Slope의 friction은 0.9로 동일하다. 그러므로 상자는 움직이지 않는다.

 

이 예에서는 Box의 friction은 0, Slope의 friction은 0.9로 차이가 발생하여 상자가 Slope상에서 아래로 미끄러져 내려간다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BoxState : MonoBehaviour
{
    public PhysicsMaterial2D slopeMaterial;
    private Rigidbody2D boxRigidbody2D;

    private float boxMass = 0f;     // Box의 질량
    private float gravity = 0f;     // 중력
    private float friction = 0f;    // 마찰 계수
    private float angle = 0f;       // 각	

    void Start()
    {
        boxRigidbody2D = GetComponent<Rigidbody2D>();   // Box - Rigidbody
        boxMass = boxRigidbody2D.mass;                  // Box에 설정된 질량값 받음
        gravity = 9.81f * boxRigidbody2D.gravityScale;   // 중력값
        friction = slopeMaterial.friction;               // Slope의 마찰계	

        // 쿼터니언으로 받으므로 쿼터니언을 오일러 각으로 변경
        // 2D에서는 회전하면 z값만 바뀐다.
        angle = transform.rotation.eulerAngles.z;     

        // m * g * sin(theta) -> 물제가 나아가려고 하는 힘
        float pushForce = boxMass * gravity * Mathf.Sin(angle * Mathf.Deg2Rad);

        // µs * m * g * cos(theta) -> 최대 마찰계수 
        float frictionForce = friction * boxMass * gravity * Mathf.Cos(angle * Mathf.Deg2Rad);

        Debug.Log("Push: " + pushForce + " , Friction: " + frictionForce);

        // 물체가 나아가려고 하는 힘이 최대 마찰계수보다 크면 물체는 움직인다.
        if (pushForce > frictionForce)
            Debug.Log("움직임");
        else
            Debug.Log("정지");
    }
}

[게임이론] 마찰력과 저항력에서 아래 그림과 같이 물체가 아래로 미끄러져 내려가는 힘은 mg*sin(theta)이고, 반대로 작용하는 힘인 마찰력은 µmgCos(theta) 였다.

이 소스코드에서 이에 대한 중심 구현은 아래와 같다. 

 // m * g * sin(theta) -> 물제가 나아가려고 하는 힘
 float pushForce = boxMass * gravity * Mathf.Sin(angle * Mathf.Deg2Rad);

 // µs * m * g * cos(theta) -> 최대 마찰계수 
 float frictionForce = friction * boxMass * gravity * Mathf.Cos(angle * Mathf.Deg2Rad);

 Debug.Log("Push: " + pushForce + " , Friction: " + frictionForce);

 // 물체가 나아가려고 하는 힘이 최대 마찰계수보다 크면 물체는 움직인다.
 if (pushForce > frictionForce)
     Debug.Log("움직임");
 else
     Debug.Log("정지");

pushForce(mg*sin(theta))와 frictionForce(µmgCos(theta))의 값을 비교하여 pushForce가 더 크면 Box는 움직이게 된다. 

그리고 Slope의 angle과 Box의 mass에 따라 이 값들이 변화하게 된다. 직접 angle과 mass를 변경해가며 변화하는 값들을 확인해보는 것도 좋을 것이다.

 

 

반응형