반응형
개념 정리
유니티에서는 짐벌락 문제 때문에 회전에 대한 값으로 쿼터니언을 사용
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 |
---|