반응형
[게임이론] 마찰력과 저항력에서 학습한 것들을 바탕으로 Unity에서의 예제를 구현해본다.
마찰력
아래와 같이 경사가 있는 Slope와 Box가 있고 마찰력에 의해 상자가 움직이거나 움직이지 않는 것을 바탕으로 마찰력에 대해 알아본다.
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를 변경해가며 변화하는 값들을 확인해보는 것도 좋을 것이다.
반응형