본문 바로가기

유니티/스크립트

[유니티]공 이동거리 계산 프로그램

반응형

평지가 아닌 상황에서 공의 이동거리를 계산하는 프로그램을 제작하였습니다.

각도나 길이가 다른 5개의 판을 설치하고, 그 꼭대기에서 공을 굴러서 바닥에 닿는 순간

지금까지 공이 회전한 각도를 계산하여 공의 이동거리를 계산하는 프로그램입니다.

공의 지름은 1m로 설정했기에, 1바퀴 회전당 pi m씩 이동하도록 설정하였습니다.

환경 정보

중력가속도 : -9.81 m / s2

오브젝트 정보 ( 단위- 길이 : m, 각도 : 오일러 )

공 : 반지름 0.5

1번 판 - 길이 : 30, 각도 : 23

2번 판 - 길이 : 20, 각도 : 20

3번 판 - 길이 : 20, 각도 : 23

4번 판 - 길이 : 10, 각도 : 20

5번 판 - 길이 : 20, 각도 : 꼭대기에서 중간까지 23, 중간에서 바닥까지 20

먼저 측정에 사용할 공이 1바퀴 회전시 pi(m)만큼 이동하기 위한 학습을 진행하였습니다.

각장 길이가 짧은 판인 4번 판에서 진행하였고, 저항을 3.5씩 설정 결과 원하는 결과값이 나오기 시작했습니다.

4번 판에서 학습한 결과를 1~5번 판에 적용시 모두 실제 판의 크기와 비슷한 값이 출력되었습니다.

측정결과 ( 공의 위치에 따라 약간의 차이가 있습니다. )

1번 판(30m) : 29.5 ..

2번 판(20m) : 19.7..

3번 판(20m) : 19.7 ..

4번 판(10m) : 9.5 ..

5번 판(20m) : 19.6 ..

 

 


소스코드

using System.Collections;
using System.Collections.Generic;
using System;
using UnityEngine;

public class Test_MesurePlane : MonoBehaviour
{
    Transform target;
    bool isnot_touchFloor = true;
    bool finishMeasure = false;

    float totalDeltaRotation = 0;
    float preRotation;
    float measureDistance;

    void Start()
    {
        target = GetComponent<Transform>();
        preRotation = target.rotation.x - 180;
    }

    void FixedUpdate()
    {
        if (isnot_touchFloor) // 1. 공의 회전각도 계산
        {
            totalDeltaRotation += Math.Abs(Math.Abs(preRotation) - Math.Abs(target.rotation.eulerAngles.x-180));
            preRotation = target.rotation.eulerAngles.x - 180;
        }
        else if(!finishMeasure) // 2. 공이 바닥에 닿으면 측정치 출력
        {
            finishMeasure = true;
            measureDistance = (totalDeltaRotation / 360) * (float)Math.PI * target.localScale.x;
            Debug.Log(measureDistance);
        }
    }

    private void OnCollisionEnter(Collision collision)
    {
        if (collision.collider.tag == "FLOOR")
            isnot_touchFloor = false;
    }

}
반응형