유니티로 간단한 차를 만들어 봤어요.

개요


지금 유니티를 공부하고 있습니다.
학습의 목적은 ET 로봇의 시뮬레이터를 만드는 것이다.
우선'지면'을 만들어 간단한'이동물'동작을
시작하기로 했어요.
유니티를 한 번도 건드리지 않았기 때문에 할 수 있는 곳부터 조금씩 시작한다.
※ 황금연휴(2019/04/27~5/1)를 이용해 약 5일 동안 공부한 기록.

학습 절차


처음에 간단한 물건을 이동하고 유니티로 시뮬레이션한 물건의
물리적 특성 등을 조사하고 싶지만, 알아차리면 간단한 차
됐어.
다음은 이번 학습의 절차입니다.
  • 단계1: Unity의 일로하 이해
  • 설치, 프로젝트 제작, 튜토리얼 실시
  • 단계 2: 필드 작성 방법 이해
  • 지면, 도로
  • 단계 3: 물체를 움직이는 방법을 안다
  • 달리기, 굽히기, 멈추기
  • 단계 4: 휠 접착기 사용
  • 모터 토크, 제동기 토크, 회전 조작
  • 참고 서적/문장


  • 단계 1-2
  • 서적: Unity 2018 시작
  • 챕터 1~3을 정독하여 유니티의 기본 사용 방법을 이해했다.
  • 글: [UnityC# 강좌] Scene 뷰의 바로 가기 및 유용한 기능
  • 글: Unity는 왼손 좌표계입니다.
  • 유니티를 사용하면서 처음에 곤혹스러웠던 것은 3D 보기와 제작된 물건의 배치 방법이었다는 점에서 참고 가치가 있다.

  • 단계 3
  • 글: Rigidbody
  • 객체에 힘을 가하는 데 필요한 어셈블리(중요)
  • 글: 0부터 시작하는 Unity 물리 연산 ① 쓰기 물리 시뮬레이션
  • 여기서 물리 시뮬레이션의 기초를 배웠습니다 (감사합니다!!!)
  • 글: 미적분
  • 간단한 운동 방정식을 해석할 때 참고로
  • 글: Impulse!
  • 물체가 이동하는 운동 방정식을 풀었다는 결과와 시뮬레이션 결과는 어쨌든 일치하지 않는다. 이 글을 참조하면 스스로 해결할 수 있다(Impulse는 초속을 제시하는 것으로 이해한다. 물리적으로 발생할 수 있는지)
  • 글: [Unity] Rigidbody의 Drag에서 터미널 속도 얻기
  • Drag의 물리적 의미는 운동 방정식까지 잘 분석되어 참고 가치가 있습니다!(감사)
  • 단계 3: 조직 단위 입력, 첫 번째 업데이트 및 물리 연산 간의 관계
  • Update와 FixedUpdate의 차이, 그리고 시뮬레이션 시간에 대해 알기 쉬운 설명을 하였습니다.
  • 글: 객체 각도 가져오기
  • 스크립트에서 설정된 물건의 방향을 변경할 때 이상한 값을 얻었기 때문에 다양한 조사를 하여 이 글의 도움을 받았다.
  • 글: 선형 감속
  • 우리는 이동하는 물체를 어떻게 막는지 조사하고 이 글을 참고했다.
  • 글: Time
  • 유니티의 시간을 정리했기 때문에 책갈피.

  • 4단계
  • 글: Wheel Collider
  • 글: 휠 믹서
  • 글: NVIDIA PhysX SDK 3.4.0 Documentation » User's Guide >> Vehicles
  • 처음에는 단순히 물체를 굴렸지만 윤식 접착기가 있는 것을 알게 되고...유니티의 실력을 알게 되었다(무섭다).
  • 프레젠테이션


    이번 성과는 뭐니 뭐니 해도 휠 접착기로 자동차를 만든 것이다.
    아래의 구성이라면 30분 정도면 완성할 수 있다.

    또한 튜토리얼대로 진행하면 가시화되지 않고,
    나는 스스로 많은 문제를 해결했다.
    다음은 실제 모의 상황이다.
    공중에 떠 있는 물체(입방체)가 중력으로 차 위에 떨어지면
    이렇게 차에 멈춰서 차를 움직이는 모습.
    ※ 바퀴도 이동 방향에 따라 가시화

    C# 스크립트


    이번에 만든 각본은 다음과 같다.
    튜토리얼을 토대로 제작해 필요한 곳(제동기 등)을 추가했다.
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class SimpleCarController : MonoBehaviour
    {
        public List<AxleInfo> axleInfos; // 個々の車軸の情報
        public float maxMotorTorque; //ホイールに適用可能な最大トルク
        public float maxSteeringAngle; // 適用可能な最大ハンドル角度
        public float maxBrakeTorque;
    
    
    
        // 対応する視覚的なホイールを見つけます
        // Transform を正しく適用します
        public void ApplyLocalPositionToVisuals(WheelCollider collider)
        {
            if (collider.transform.childCount == 0)
            {
                return;
            }
    
            Transform visualWheel = collider.transform.GetChild(0);
    
            Vector3 position;
            Quaternion rotation;
            collider.GetWorldPose(out position, out rotation);
    
            visualWheel.transform.position = position;
            visualWheel.transform.rotation = rotation;
        }
    
        // Start is called before the first frame update
        void Start()
        {
    
        }
    
        // Update is called once per frame
        void FixedUpdate()
        {
            float motor = maxMotorTorque * Input.GetAxis("Vertical");
            float steering = maxSteeringAngle * Input.GetAxis("Horizontal");
            bool brake = Input.GetKey(KeyCode.Space);
    
            foreach (AxleInfo axleInfo in axleInfos)
            {
                if (axleInfo.steering)
                {
                    axleInfo.leftWheel.steerAngle = steering;
                    axleInfo.rightWheel.steerAngle = steering;
                }
                if (axleInfo.motor)
                {
                    axleInfo.leftWheel.motorTorque = motor;
                    axleInfo.rightWheel.motorTorque = motor;
                }
                if (brake)
                {
                    axleInfo.leftWheel.brakeTorque = maxBrakeTorque;
                    axleInfo.rightWheel.brakeTorque = maxBrakeTorque;
                }
                else
                {
                    axleInfo.leftWheel.brakeTorque = 0;
                    axleInfo.rightWheel.brakeTorque = 0;
                }
                ApplyLocalPositionToVisuals(axleInfo.leftWheel);
                ApplyLocalPositionToVisuals(axleInfo.rightWheel);
            }
        }
    }
    
    [System.Serializable]
    public class AxleInfo
    {
        public WheelCollider leftWheel;
        public WheelCollider rightWheel;
        public bool motor; //このホイールがエンジンにアタッチされているかどうか
        public bool steering; // このホイールがハンドルの角度を反映しているかどうか
        public bool brake;
    }
    

    도전하다


    이번에는 여러 가지 조사를 통해 간단한 차를 만들었는데,
    우리는 또 어떻게 바퀴 접착기의 물리적 운동 방정식을 세울 필요가 있다
    좋을지 모르겠지만.
    어렵게 간단하게 한 건 알지만,
    나는 마침 이론상의 부분을 좀 더 깊이 파고들고 싶다.

    좋은 웹페이지 즐겨찾기