Unity3D 카메라 추적 제어 실현
알고리즘 을 따르다
3D 카메라 의 통 제 를 실현 하려 면 먼저 카메라 가 물 체 를 따라 이동 하 는 것 을 실현 하 는 것 이다.
카 메 라 를 물체 에 따라 이동 시 키 려 면 일정한 각도 에서 카메라 와 물체 의 위치 관 계 를 알 아야 한다.
먼저 카메라 와 물체 간 의 거리 distance 를 설정 하고 카메라 와 xz 평면 각 도 는 roll 입 니 다.
따라서 삼각 관계 에 따라 xz 평면 에 비 친 거리 d 는 distancecos(rool)이 고 카메라 높이 는 distancesin(roll)이다.
아래 그림
이제 카메라 의 높이 를 확인 할 수 있 습 니 다.즉,y 축의 좌표 카메라 의 y 축 좌 표 는 Camera.Main.y=물체.y+height 여야 합 니 다.
xz 평면 에서 카메라 와 물체 의 거 리 를 d(위 에서 말 한 그 d,distance 가 xz 평면 에 비 친 길이)로 설정 하고 카메라 의 회전 각 도 는 rot 이다.아래 그림 에서 볼 수 있 듯 이 카메라 와 물체 의 연결선 과 x 축의 각 도 는 rot-180 이다.삼각함수 에 따라 x 축의 위 치 는 d*sin(rot)이 고 z 축의 위 치 는 d*cos(rot)이다.
그 러 니까 시작 할 때 distance 와 rot 와 roll 을 지정 하면 따라 갈 수 있 습 니 다.따라 가 는 코드 는 다음 과 같 습 니 다.
public class CameraFollow : MonoBehaviour
{
//
public float distance = 15;
//
public float rot = 0;
// 30d
public float roll = 30f * Mathf.PI * 2 / 360;
//
public GameObject target;
private void Start()
{
target = GameObject.Find("Black Track");
}
private void LateUpdate()
{
if (target == null)
return;
if (Camera.main == null)
return;
//
Vector3 targetPos = target.transform.position;
//
Vector3 cameraPos;
float d = distance * Mathf.Cos(roll);
float height = distance * Mathf.Sin(roll);
cameraPos.x = targetPos.x + d * Mathf.Cos(rot);
cameraPos.z = targetPos.z + d * Mathf.Sin(rot);
cameraPos.y = targetPos.y + height;
Camera.main.transform.position = cameraPos;
Camera.main.transform.LookAt(target.transform);
}
}
따라 갈 때 우 리 는 따라 갈 물체 아래 에 하나의 물 체 를 놓 아 camera Point 라 고 명명 하여 카메라 가 이 물 체 를 조준 하여 카메라 의 시각 을 편리 하 게 변경 할 수 있다.그래서 물체 밑 에 cameraPoint 의 하위 물 체 를 추가 합 니 다.
코드 추가
//
public void SetTarget(GameObject target)
{
if (target.transform.Find("cameraPoint") != null)
this.target = target.transform.Find("cameraPoint").gameObject;
else
this.target = target;
}
정확 한 물체 가 camera Point 의 서브 물체 로 유명 하 다 면 카 메 라 는 camera Point 서브 물 체 를 조준 한다.가로 와 세로 회전 카메라
마우스 가 왼쪽으로 이동 할 때 카 메 라 는 좌회전 하고 마우스 가 오른쪽으로 이동 할 때 카 메 라 는 우회전 한다.
Unity 의 입력 축 인 Mouse X 와 Mouse Y 는 마우스 의 이동 증 가 를 나타 내 는데,즉 마우스 가 왼쪽으로 이동 할 때 Input.GetAxis('Mouse X')의 값 이 커지 고 오른쪽으로 줄 어드 는 것 이다.회전 각도 rot 를 마우스 X 와 정비례 관계 로 만 들 면 마 우 스 를 통 해 카메라 의 각 도 를 제어 할 수 있다.
코드 는 다음 과 같다.
//
public float rotSpeed=0.1f;
//
public void Rotate()
{
float w = Input.GetAxis("Mouse X") * rotSpeed;
rot -= w;
}
같은 이치 로 수직 회전 에 대해 우 리 는 범 위 를 설정 해 야 하기 때문에 코드 는 다음 과 같다.
//
public float maxRoll = 70f * Mathf.PI * 2 / 360;
public float minRoll = 0f * Mathf.PI * 2 / 360;
//
private float rollSpeed = 0.1f;
//
public void Roll()
{
float w = Input.GetAxis("Mouse Y") * rollSpeed;
roll -= w;
if (roll > maxRoll)
roll = maxRoll;
if (roll < minRoll)
roll = minRoll;
}
롤러 거리 조절마우스 롤러 를 통 해 카메라 와 물체 사이 의 거 리 를 조절 하 다.
코드 는 다음 과 같다.
//
public float maxDistance = 22f;
public float minDistance = 5f;
//
public float zoomSpeed = 0.2f;
//
public void Zoom()
{
if(Input.GetAxis("Mouse ScrollWheel") >0)
{
if (distance > minDistance)
distance -= zoomSpeed;
}
else if (Input.GetAxis("Mouse ScrollWheel") < 0)
{
if (distance < maxDistance)
distance += zoomSpeed;
}
}
모든 코드
public class CameraFollow : MonoBehaviour
{
//
public float distance = 15;
//
public float rot = 0;
// 30d
public float roll = 30f * Mathf.PI * 2 / 360;
//
public GameObject target;
//
public float rotSpeed=0.1f;
//
public float maxRoll = 70f * Mathf.PI * 2 / 360;
public float minRoll = 0f * Mathf.PI * 2 / 360;
//
private float rollSpeed = 0.1f;
//
public float maxDistance = 22f;
public float minDistance = 5f;
//
public float zoomSpeed = 0.2f;
private void Start()
{
target = GameObject.Find("Black Track");
SetTarget(target);
}
private void LateUpdate()
{
if (target == null)
return;
if (Camera.main == null)
return;
//
Rotate();
//
Roll();
//
Zoom();
//
Vector3 targetPos = target.transform.position;
//
Vector3 cameraPos;
float d = distance * Mathf.Cos(roll);
float height = distance * Mathf.Sin(roll);
cameraPos.x = targetPos.x + d * Mathf.Cos(rot);
cameraPos.z = targetPos.z + d * Mathf.Sin(rot);
cameraPos.y = targetPos.y + height;
Camera.main.transform.position = cameraPos;
Camera.main.transform.LookAt(target.transform);
}
//
public void SetTarget(GameObject target)
{
if (target.transform.Find("cameraPoint") != null)
this.target = target.transform.Find("cameraPoint").gameObject;
else
this.target = target;
}
//
public void Rotate()
{
float w = Input.GetAxis("Mouse X") * rotSpeed;
rot -= w;
}
//
public void Roll()
{
float w = Input.GetAxis("Mouse Y") * rollSpeed;
roll -= w;
if (roll > maxRoll)
roll = maxRoll;
if (roll < minRoll)
roll = minRoll;
}
//
public void Zoom()
{
if(Input.GetAxis("Mouse ScrollWheel") >0)
{
if (distance > minDistance)
distance -= zoomSpeed;
}
else if (Input.GetAxis("Mouse ScrollWheel") < 0)
{
if (distance < maxDistance)
distance += zoomSpeed;
}
}
}
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Unity 공부 일지~블렌드 셰이프 조작 방법 그 ①게임을 만들고 싶다 ~라고 생각하고 마지막 날부터 Unity를 만지기 시작했습니다 HITOMI2236입니다. 이번 블렌드 셰이프에 대해 조사했으므로 여기에 기록하려고 합니다. 개인용 메모입니다만, 만약 같은 곳에서 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.