본문 바로가기

유니티 공부

유니티 3D 오브젝트 마우스로 회전시키기

반응형

개념 정리

 

유니티에서는 짐벌락 문제 때문에 회전에 대한 값으로 쿼터니언을 사용

 

1. Transform.Rotation 

 

Transform.Rotation 은 게임 오브젝트의 절대적인 회전각도를 나타낸다. vector3의 오일러 각도를 쿼터니언으로 변환해서 사용

 

transform.Rotation = Quaternion.Euler(x, y, z);

 

2. Transform.localRotation 

 

게임오브젝트의 상대적인 회전각도를 나타낸다. (부모 객체 기준으로 상대적인 각도를 나타냄)

 

transform.localRotation = Quaternion.Euler(x, y, z);

 

3. Transform.Rotate

 

게임오브젝트를 회전시키기 위한 함수, 게임오브젝트의 절대적인 회전각도로 회전하는 경우에는 Space.World 옵션을 사용

 

public class RotateExample : MonoBehaviour
{
    void Update()
    {
        // 게임 오브젝트 기준으로 회전
        transform.Rotate(new Vector3(10f, 20f, 30f) * Time.deltaTime);

        // 절대 좌표 기준으로 회전
        transform.Rotate(new Vector3(10f, 20f, 30f) * Time.deltaTime, Space.World);
    }
}

 

4. Transform.RotateAround

 

특정좌표를 기준으로 게임오브젝트를 회전시키기 위한 함수, 지구가 공전하는 것처럼 축을 기준으로 회전함

 

public class RotateAroundExample : MonoBehaviour
{
    public Transform Target;

    void Update()
    {
        transform.RotateAround(Target.position, Vector3.up, 20 * Time.deltaTime);
    }
}

 

물체를 회전시키기 위해 Rotate 함수 예시를 사용했다. 3차원 회전축을 기준으로 2차원 화면에서 좌우/상하로 터치시 물체가 회전하도록 구현했다.

 

    void Update()
    {
        if (Input.GetMouseButton(0))
        {
            transform.Rotate(0f, -Input.GetAxis("Mouse X") * speed, 0f, Space.World);
            transform.Rotate(-Input.GetAxis("Mouse Y") * speed, 0f, 0f);
        }
    }

 

하지만 이경우 좌우/ 상하일경우 물체가 회전한상태에서 터치시 정면기준으로 회전하는것이 아닌 물체의 x,y축 기준으로 회전이 발생하여 원하는 물체의 회전이 나오지 않는다. 그렇기에 물체를 기준점으로 카메라를 회전시키도록 구현했다.

 

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

public class CamController : MonoBehaviour
{

    public GameObject item; //바라볼 플레이어 오브젝트
    public float xmove = 0; //x축 누적 이동량
    public float ymove = 0;//y축 누적 이동량
    public float distance = 3; //카메라와 플레이어의 거리


    void Start()
    {
        //카메라 위치를 특정위치로 지정한다.
        Vector3 Distance = new Vector3(0.0f, 0.0f, distance);
        transform.position = item.transform.position - Distance;
    }

    void Update()
    {
        //마우스 움직임에 따른 카메라 회전
        if(Input.GetMouseButton(0))
        {
            xmove += Input.GetAxis("Mouse X"); //마우스 이동 좌표 (가로축)
            ymove -= Input.GetAxis("Mouse Y");//마우스 이동 좌표 (세로축)
            transform.rotation = Quaternion.Euler(ymove, xmove, 0); //x축을 기준으로 회전하는것은 상하로 카메라가 회전하는것을 의미, y축을 기준으로 회전하는 것은 좌우로 카메라가 회전하는것을 의미
            Vector3 reverseDistance = new Vector3(0.0f, 0.0f, distance);//이동량에 따른 z축 방향의 벡터를 구한다.

            transform.position = item.transform.position - transform.rotation * reverseDistance; //터치를 올리면 물체 위치와 반대로 카메라가 회전해야 그 위치를 볼수 있음
        }
    }
}

 

 

반응형

'유니티 공부' 카테고리의 다른 글

삼각함수를 활용한 원 좌표 구하기  (0) 2023.03.07