Unity3D 카메라 추적 제어 실현

6792 단어 Unity3D카메라
본 논문 의 사례 는 유 니 티 3D 가 카메라 에 따라 통 제 를 실현 하 는 구체 적 인 코드 를 공유 하여 여러분 께 참고 하 시기 바 랍 니 다.구체 적 인 내용 은 다음 과 같 습 니 다.
알고리즘 을 따르다
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;
 }
 }
}
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기