2016년 10월 3일 월요일

FPS 카메라 만들기

처음에 생각없이 그냥 마우스 움직임을 가져와서 X축, Y축 회전을 시키면 될 것 같지만

이렇게 하면 아마 Y축은 잘 돌아가도 X축 회전을 시작하는 순간
우리가 보기에 축들이 틀어지는 것처럼 보일 것이다.

사실 왜 이런지는 생각해보면 간단한데
사람이 위아래를 볼 때 고개(카메라)만 움직이지 몸 전체가 드러눕진 않는 것과 같다.

따라서 쉽게 구현하는 데엔 한 오브젝트 내에서 X축, Y축 회전을 다 하는 것보단
오브젝트 밑에 child로 카메라를 달아놓고 두 개의 움직임을 분리하는 게 낫다.

(TPS에서도 비슷한 현상이 있는데 aim의 방향에 따라 캐릭터가 몸을 트는 경우
avatar masking을 쓰게 될텐데 거기서도 하체는 base layer,
상체는 다른 레이어를 써서 섞으면 상체는 움직이지만 하체는 고정되어 있을 것이다.)


using UnityEngine;
using System.Collections;

public class FPSTest : MonoBehaviour {
    public float xSensitivity = 1.0f;
    public float ySensitivity = 1.0f;

    public Camera cam;

    // Use this for initialization
    void Start() {

    }

    // Update is called once per frame
    void Update() {

        //회전하고 싶은 축과 입력축이 반대인 것에 유의
        float yRot = Input.GetAxis("Mouse X") * xSensitivity;
        float xRot = Input.GetAxis("Mouse Y") * ySensitivity;

        //오브젝트(기준이 되는 축을 유지해야 됨)와 카메라 회전을 분리해야 됨
        //쿼터니안은 곱해야 누적됨
        this.transform.localRotation *= Quaternion.Euler(0, yRot, 0);
        cam.transform.localRotation *= Quaternion.Euler(-xRot, 0, 0);//부호 주의
    }
}

댓글 3개: