공부 좀 하자/Unity

탱크(Tank)로 실험한 회전, euler, Mathf.Clamp

개발성문 2018. 4. 3. 20:22



위의 동영상은 탱크 모양의 오브젝트를 만들어서 포탑 부분 과 포신 부분의 회전하도록 하여


포탄 발사를 구현해 본 것입니다.


이번 포스팅에서는 포탑, 포신을 회전 한 것에 대해 정리해 보려고 합니다.


지난 포스팅에서 사인과 코사인, Radian에 관련해 원 운동을 공부했었는데요.


그때 잠시 설명 했었던 60분법, 영어로는 Degree 라는 명칭이었죠.


Degree는 Unity Inspector 창의 Transform Rotation 에서 사용한다는 설명도 했었죠.


여기서 다루어 보게 될 eulerAngles(오일러 각)은 Transform의 Rotation 의 x, y, z의 각도 값 3개로 표시되고, 


이를 이용에 회전을 더하게 됩니다. 


이번에 다루지는 않겠지만 이 eulerAngles(오일러 각)과 함께 Quaternion(쿼터니언) 이라는 것이 Unity에서 일반적으로 


회전에 사용합니다.


소스를 보도록 하죠.


        turret.transform.Rotate(Vector3.up * rot * rotTurret);  //포탑 회전
        gun.transform.Rotate(Vector3.right * rot * rotGun);     //포신 회전

        Vector3 ang = gun.transform.eulerAngles;

        if (ang.x > 180) ang.x -= 360;

        ang.x = Mathf.Clamp(ang.x, -60, 5);

        gun.transform.eulerAngles = ang;


포탑과 포신의 회전은 Rotate에서 회전축을 기준으로 얼마만큼의 속도록 어떤 키값을 받아 회전하는지 정해주면 됩니다.


문제는 eulerAngles(오일러 각)이네요.


eulerAngles(오일러 각)에서의 회전은 x, y, z 축을 중심으로 하는데, z 는 z 축,  x 와 y 는 y 축을 중심으로 순서대로 


회전 합니다.


소스에서 보면 gun.transform.eulerAngles로 eulerAngles의 x, y, z 값을 Vector3 의 변수에 할당 합니다.


할당된 값에서  포신의 회전 축 ang 의 x 축의 값을 변경합니다. 


여기서 주의 할 점이있는데, 


eulerAngles(오일러 각)은 각 축에 해당하는 값을 개별적으로 설정하지는 않습니다.


각각 설정한 경우에 의도하지 않은 회전과 결과를 일으킬 수 있기 때문입니다. 


때문에 위 소스에서 처럼 Vector3 의 ang 변수에 할당한 값으로 한번에 모든 값을 설정해야 합니다.


또 각도가 360도를 넘어버리면 값의 계산이 실패하기 때문에 값을 증가시키지 않는다고 합니다.


이 부분은 제가 더 공부를 해야 하겠습니다. 



위 소스에 Mathf.Clamp() 매개변수로 (현재값, 최대값, 최소값)  이 3개를 가집니다.


현제값이 최대값 보다 크면 최대값을 출력해주고, 최소값 보다 작으면 최소값을 출력합니다.


지정한 범위 내의 값만 되돌려 주는 역할을 합니다.



eulerAngles Quaternion 은 별도로 자세히 다뤄 볼 생각이지만 아직은 이해가 힘든 부분이 많이 있네요.


이번 포스팅은 여기서 마치도록 하겠습니다.