'unity 카메라 추적'에 해당되는 글 1건

3D 처리에서 카메라가 주인공 캐릭터를 따라가게 하는 방법.

 

(1) 카메라가 주인공의 등을 쫒아가게 하는 방법

 

이 방법은 player를 카메라가 직접 쫒아간다. 카메라가 추적하는 루틴은 우선 추적할 대상인 target의 위치로부터 뒤쪽으로 dist만큼 물러서서 height만큼 높이를 올려주고 카메라를 target과 같은 각도로 회전시킨다.

 

 


만약 카메라의 위치를 계산하는 로직을 Update 함수에서 구현했다면 Player의 움직임이 완료되기 전에 카메라가 이동하면 떨림 현상이 발생한다. 따라서 카메라의 위치 계산은 이동 및 회전을 마친후에 실행해야 한다. 따라서 LateUpdate 함수에서 실행한다.


 



주요함수는..


1. Mathf.LerpAngle(a : float, b:float, t: float) : float


2. Quaternion.Euler(euler : Vector3) : Quaternion


Mathf.LerpAngle은 t시간 동안 a부터 b까지 변경되는 각도를 반환한다. 부드러운 회전을 구현할 때 사용하는 함수로 세 번째 인자에 사용된 dampRotate 변수 값을 조정하면 회전하는 감도를 조절할 수 있다.


유니티에서는 모든 객체의 회전을 쿼터니언을 이용해 처리한다.

transform.rotation = Quaternion.Eular(0,30,0);



나의생각!  즉 위코드에서는 player가 update문을 이용해 이동했을 때 lastupdate에서 mathf.lerpangle을 통해 카메라와 플레이어와의 y축 앵글각의 차이를 계산하고 카메라의 포지션을 플레이어의 등을 정확히 바라보게 하기위하여, Vector3.forward 값에 y축 앵글각의 차이를 곱하여 빼준다. 이렇게 방향벡터에 앵글각을 곱하면 벡터의 방향이 자동으로 플레이어의 등을 바라보게 바뀌기 때문이아닐까?



(2) unity 사이트를 뒤져보다가 발견한.. 예제에서 3D이지만 3인칭 시점을 유지하여 카메라 앵글을 유지하는 방법.(지금 프로젝트 적용)



이 코드에서 transform.position 는 


private Transform tr; 변수로 tr = GetComponet<Transform>();으로 받아왔던 현재 object에대한 Transform 로직을 변수를 선언하지 않고 바로 transform.position으로 접근한 것으로 보인다. 이렇게 해도 작동하는 이유는 스크립트를 어차피 3d object에 child로 넣기때문이 아닐까?  


또한 Vector3.Lerp 함수가 있는데 이는 링크 http://hyunity3d.tistory.com/257을 참조했다.


using UnityEngine;

using System.Collections;

 

public class LerpTest : MonoBehaviour {

    //시작위치 위치

    public Transform startMarker;

    public Transform endMarker;

 

    public float speed = 10.0F;

    private float startTime;

    private float journeyLength;

    void Start()

    {

        startTime = Time.time;

        journeyLength = Vector3.Distance(startMarker.position, endMarker.position);//시작과끝 위치 거리

    }

    void Update()

    {

        //두점 사이의 거리가 10일때

        float distCovered = (Time.time - startTime) * speed; //속력 v = m/s 1초에 10움직임 한프레임당 1움직인다고하면

        float fracJourney = distCovered / journeyLength;// 속력 / 길이 = m/s / m = 1/s 시간 fracJourney = 0.1f

        transform.position = Vector3.Lerp(startMarker.position, endMarker.position, fracJourney); //

    }

}


유니티 함수 Lerp에 대해서 알아봅시다.


Lerp는 두 벡터 사이에 시간에 따른 위치를 구하는 함수입니다.

만약 startMarker position 은 (-5,0,0 )이고 endMarker 은 (5,0,0) 일때

위의 fracJourney 가 0.5초 일때 정확히 0,0,0 을 반환하게 되며, 0.1초 일때는 두점 사이의 거리가 10이므로 1,0,0 값을 반환 하게 됩니다.

fracJourncey 가 1.0f 일때나 그 이상일때는 endMarker 의 위치(5,0,0)를 반환합니다.

만약 0.0f이거나 그 이하일때는 startMarker의 위치(-5,0,0)를 반환하게 됩니다.




즉 아래코드를 분석하면, 

Start()에서 플레이어에 대한 현재 카메라의 상대위치를 구하고 


FixedUpdate()에서 

플레이어 위치변경 후 카메라가 위치해야할 위치를 구한 후,

현재 카메라위치에서 Lerp 함수를 써서 smooting하게 움직이는 효과를 썼다고 볼 수 있다.

만약 transform.postion = targetCampos; 라고 정의하면 smooting하게 움직이지 않을 것 이다.

 


 


블로그 이미지

종환 Revolutionist-JongHwan

github.com/alciakng 항상 겸손하자.

댓글을 달아 주세요