규로로TV

유니티 360 비디오 플레이하기 본문

3D_R&D

유니티 360 비디오 플레이하기

규로로TV 2018. 8. 10. 09:57

유니티 360 비디오 플레이하기

 

#원리 – sphere360도 영상을 씌우고 그 중심에 카메라를 두어 플레이를 함.

 

[01]

360도 영상을 import한다.

 

[02]

sphere를 하나 만든다.

Scale을 늘려 어느정도 거리감이 느껴지게 셋팅.

Sphere material Unit/Texture로 바꾼다.

 

[03]

360도 영상을 sphere에 드래그 드랍을 한다.

Normal 방향을 뒤집어 주기 위해 스크립트를 추가한다.

스크립트 내용은 아래와 같고 nameReverseNormals 적어줌.

 

using UnityEngine;

using System.Collections;

 

[RequireComponent(typeof(MeshFilter))]

 

public class ReverseNormals : MonoBehaviour {

 

    void Start()

    {

        MeshFilter filter = GetComponent(typeof(MeshFilter)) as MeshFilter;

        if (filter != null)

        {

            Mesh mesh = filter.mesh;

 

            Vector3[] normals = mesh.normals;

            for (int i = 0; i < normals.Length; i++)

                normals[i] = -normals[i];

            mesh.normals = normals;

 

            for (int m = 0; m < mesh.subMeshCount; m++)

            {

                int[] triangles = mesh.GetTriangles(m);

                for (int i = 0; i < triangles.Length; i += 3)

                {

                    int temp = triangles[i + 0];

                    triangles[i + 0] = triangles[i + 1];

                    triangles[i + 1] = temp;

                }

                mesh.SetTriangles(triangles, m);

            }

        }

    }

}

 

 

 

그러면 노말이 뒤집힌다.

비디오 컨트롤러 스크립트를 추가로 달아준다.

네이밍은 VideoController 로 해준다.

 

 

using UnityEngine;

using System.Collections;

 

[RequireComponent(typeof(AudioSource))]

 

public class VideoController : MonoBehaviour

{

    // Use this for initialization

    void Start()

    {

        MovieTexture MOVIE_TEXTURE = ((MovieTexture)GetComponent<Renderer>().material.mainTexture);

              

        AudioSource movieAudio = GetComponent<AudioSource>();

        movieAudio.clip = MOVIE_TEXTURE.audioClip;

       

        MOVIE_TEXTURE.Play();

        movieAudio.Play();

       

    }

    // Update is called once per frame

    void Update()

    {

 

    }

}

 

 

마지막으로 마우스컨트롤에 따른 카메라 회전값을 연동 시키는 스크립트를 적용한다.

스크립트를 만들고 카메라에 적용한다.

스크립트 이름: MouseOrbitImproved

그리고  카메라 inspector의 스크립트의 TargetSphere를 지정한다.

 

 

using UnityEngine;

using System.Collections;

 

[AddComponentMenu("Camera-Control/Mouse Orbit with zoom")]

public class MouseOrbitImproved : MonoBehaviour {

 

    public Transform target;

    public float distance = 5.0f;

    public float xSpeed = 120.0f;

    public float ySpeed = 120.0f;

 

    public float yMinLimit = -20f;

    public float yMaxLimit = 80f;

 

    public float distanceMin = .5f;

    public float distanceMax = 15f;

 

    private Rigidbody rigidbody;

 

    float x = 0.0f;

    float y = 0.0f;

 

    // Use this for initialization

    void Start ()

    {

        Vector3 angles = transform.eulerAngles;

        x = angles.y;

        y = angles.x;

 

        rigidbody = GetComponent<Rigidbody>();

 

        // Make the rigid body not change rotation

        if (rigidbody != null)

        {

            rigidbody.freezeRotation = true;

        }

    }

 

    void LateUpdate ()

    {

        if (target)

        {

            x += Input.GetAxis("Mouse X") * xSpeed * distance * 0.02f;

            y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f;

 

            y = ClampAngle(y, yMinLimit, yMaxLimit);

 

            Quaternion rotation = Quaternion.Euler(y, x, 0);

 

            distance = Mathf.Clamp(distance - Input.GetAxis("Mouse ScrollWheel")*5, distanceMin, distanceMax);

 

            RaycastHit hit;

            if (Physics.Linecast (target.position, transform.position, out hit))

            {

                distance -=  hit.distance;

            }

            Vector3 negDistance = new Vector3(0.0f, 0.0f, -distance);

            Vector3 position = rotation * negDistance + target.position;

 

            transform.rotation = rotation;

            transform.position = position;

        }

    }

 

    public static float ClampAngle(float angle, float min, float max)

    {

        if (angle < -360F)

            angle += 360F;

        if (angle > 360F)

            angle -= 360F;

        return Mathf.Clamp(angle, min, max);

    }

}

 

스크립트를 만들기 뭐하면 폴더 안에 있는 스크립트를 그냥 사용하면 된다.


Comments