[초보자 대상] 유니티 2017+Vuforia에서 3D 모형~애니메이션 재생편을 보여줬어요~

18052 단어 Unity2017Unityvuforia

할 일


지난 두 차례 Vuforia의 등록 표지의 설정, 표지 검측을 진행할 때의 모형 표시
[초보자 대상] Unity 2017+Vuforia에서 3D 모형을 보여줬어요~준비편~
[초보자용] Unity 2017+Vuforia에서 3D모델~3D모델 디스플레이를 보여줬어요~
이번에는 다음과 같이 하겠습니다.
  • 태그가 발견되면 3D 모델이 나타나면서 애니메이션
  • 이 재생됩니다.
    이미지로 태그가 발견되면 3D 모델을 표시하고 설명된 애니메이션을 재생합니다.
    이런 구상.
    비디오 재생은 Unity 3D 개체의 Quad로 예약됩니다.

    컨디션


    이번 검증의 환경을 기록하다.
  • Unity 부팅 환경: 윈도우즈 7(LenovoX1 Carbon)
  • Unity 2017.3.1f1
  • Vuforia(2018/4시간점)
  • 준비 작업


    Unity 객체의 "Quad"를 사용하여 비디오를 재생할 생각
    Unity에서 Quad 구성

    모델 번호와 Quad의 위치를 조금 조정해 주세요.
    모델이 표시되면 Quad도 표시되므로 ImageTarget에 배치해야 합니다.
    ImageTarget에 넣지 않으면 처음부터 Quad만 보이기 때문에 이상해질 수 있으니 주의해야 한다.

    참고 자료

    비디오 설정


    그런 다음 Quad에 대해 Add Component에서 Video Player를 추가하여 애니메이션을 Video Clip으로 지정합니다.
    Unity의 Asset에 비디오를 끌어다 놓은 다음 지정합니다.
    애니메이션 제작이 어려울 수 있지만 이번에는 적절한 파워 포트를 만들어 오피스 익스포트 기능으로 영상을 제작했다.
    형식은 mp4 형식이다.(Office 버전에 따라 제작이 불가능할 수 있음)

    이 설정으로 카메라를 시작하면 모델이 표시되고 제대로 된 애니메이션도 재생성됩니다.

    로고를 발견할 때 영상을 시작하고 싶어요.


    동영상이 재생되었음을 눈치챈 사람이 있을지도 모르지만 다음과 같은 문제가 발생했다.
  • 카메라가 시작되는 동시에 애니메이션이 시작된다
  • 기호가 카메라에서 사라지면 표시를 이동하고 운동 이미지는 처음부터
  • 다음 설정 때문에
  • 「Play On Awake」
  • 이 설정을 했기 때문에 카메라가 작동하는 동시에 애니메이션도 시작되었다.
    하지만 이것만 빼면 카메라가 작동해 표시가 감지돼도 영상이 시작되지 않는다.
    지금부터 설정을 변경합니다.
    먼저 PlayOn Awake 검사를 취소합니다.
    "Loop"등의 설정을 좋아한다.

    사소한 일을 하려면 스크립트를 수정해야 한다.
    (원래 프로그래머가 아니었던 필자에겐 힘든 일이었는데...)
    다양한 조사를 통해 다음 스크립트가 수정되어 체크 표시를 할 때(동시에 모델이 표시됨) 애니메이션을 재생할 수 있습니다.
    ImageTarget의 "Inspector"에서 확인할 수 있는 다음 스크립트
  • 「DefaultTrackableEventHandler」
  • ('D e f aultTracbleventHandler'의'Edit Script'에서 발췌)

    수정된 스크립트
    이 스크립트는 원래 표시를 발견한 상태에서 XX를 제어하고, 표시가 취소된 상태에서 XX를 제어하는 스크립트인 것 같습니다.
    변경된 곳에'//추가처'라고 적힌 3곳
    자동으로 시작할 수 없으므로 GameObject의 "Quad"를 지정하여 비디오 재생을 시작합니다.
    로고를 잃고 녹화를 멈춘 곳.
    애초'Unity Engine. Video'가 이걸 안 넣으면 카메라 자체가 작동하지 않아서 넣었어요.
    ※ 개인조사 후 나온 방법이 기재되어 있을 뿐이니 예의에 어긋나거나 이상한 글씨일 수 있으니 언짢게 생각하지 마세요.
    (차라리 정확한 방법을 아는 사람이 있다면 꼭 공유해 주세요.)
    대개 "Quad"이름을 변경하지 않으면 복사하여 붙여넣을 수 있습니다
    DefaultTrackableEventHandler
    
    /*==============================================================================
    Copyright (c) 2017 PTC Inc. All Rights Reserved.
    
    Copyright (c) 2010-2014 Qualcomm Connected Experiences, Inc.
    All Rights Reserved.
    Confidential and Proprietary - Protected under copyright and other laws.
    ==============================================================================*/
    
    using UnityEngine;
    using Vuforia;
    // 追加箇所
    using UnityEngine.Video;
    
    /// <summary>
    ///     A custom handler that implements the ITrackableEventHandler interface.
    /// </summary>
    public class DefaultTrackableEventHandler : MonoBehaviour, ITrackableEventHandler
    {
        #region PRIVATE_MEMBER_VARIABLES
    
        protected TrackableBehaviour mTrackableBehaviour;
    
        #endregion // PRIVATE_MEMBER_VARIABLES
    
        #region UNTIY_MONOBEHAVIOUR_METHODS
    
        protected virtual void Start()
        {
            mTrackableBehaviour = GetComponent<TrackableBehaviour>();
            if (mTrackableBehaviour)
                mTrackableBehaviour.RegisterTrackableEventHandler(this);
        }
    
        #endregion // UNTIY_MONOBEHAVIOUR_METHODS
    
        #region PUBLIC_METHODS
    
        /// <summary>
        ///     Implementation of the ITrackableEventHandler function called when the
        ///     tracking state changes.
        /// </summary>
        public void OnTrackableStateChanged(
            TrackableBehaviour.Status previousStatus,
            TrackableBehaviour.Status newStatus)
        {
            if (newStatus == TrackableBehaviour.Status.DETECTED ||
                newStatus == TrackableBehaviour.Status.TRACKED ||
                newStatus == TrackableBehaviour.Status.EXTENDED_TRACKED)
            {
                Debug.Log("Trackable " + mTrackableBehaviour.TrackableName + " found");
                OnTrackingFound();
            }
            else if (previousStatus == TrackableBehaviour.Status.TRACKED &&
                     newStatus == TrackableBehaviour.Status.NOT_FOUND)
            {
                Debug.Log("Trackable " + mTrackableBehaviour.TrackableName + " lost");
                OnTrackingLost();
            }
            else
            {
                // For combo of previousStatus=UNKNOWN + newStatus=UNKNOWN|NOT_FOUND
                // Vuforia is starting, but tracking has not been lost or found yet
                // Call OnTrackingLost() to hide the augmentations
                OnTrackingLost();
            }
        }
    
        #endregion // PUBLIC_METHODS
    
        #region PRIVATE_METHODS
    
        protected virtual void OnTrackingFound()
        {
            var rendererComponents = GetComponentsInChildren<Renderer>(true);
            var colliderComponents = GetComponentsInChildren<Collider>(true);
            var canvasComponents = GetComponentsInChildren<Canvas>(true);
    
            foreach (var component in rendererComponents)
                component.enabled = true;
    
            // Enable colliders:
            foreach (var component in colliderComponents)
                component.enabled = true;
    
            // Enable canvas':
            foreach (var component in canvasComponents)
                component.enabled = true;
    
            // 追加箇所
            if (mTrackableBehaviour.gameObject.GetComponentInChildren<VideoPlayer>() != null)
            {
                GameObject.Find("Quad").GetComponent<VideoPlayer>().Play();
                // 下記の書き方でも同様のことが出来た
                // mTrackableBehaviour.gameObject.GetComponentInChildren<VideoPlayer>().Play();
            }
        }
    
    
        protected virtual void OnTrackingLost()
        {
            var rendererComponents = GetComponentsInChildren<Renderer>(true);
            var colliderComponents = GetComponentsInChildren<Collider>(true);
            var canvasComponents = GetComponentsInChildren<Canvas>(true);
    
            // Disable rendering:
            foreach (var component in rendererComponents)
                component.enabled = false;
    
            // Disable colliders:
            foreach (var component in colliderComponents)
                component.enabled = false;
    
            // Disable canvas':
            foreach (var component in canvasComponents)
                component.enabled = false;
    
            // 追加箇所
            if (mTrackableBehaviour.gameObject.GetComponentInChildren<VideoPlayer>() != null)
            {
                mTrackableBehaviour.gameObject.GetComponentInChildren<VideoPlayer>().Pause();
            }
    
        }
    
        #endregion // PRIVATE_METHODS
    }
    
    
    
    
    
    이 스크립트를 수정하면 다음과 같은 동작을 할 수 있습니다.
  • 태그 발견 후 3D 모델 디스플레이 & 애니메이션 시작
  • 플래그가 없으면 애니메이션이 일시 중지되고 3D 모델이 사라집니다
  • .
  • 태그를 다시 발견하면 3D 모델 디스플레이 & 영상의 중도부터
  • 이번에는 다음과 같은 내용으로 설정하지 않았지만, 표시에서 지운 상태에서 영상을 정지시키려면 아래의 내용으로 수정할 수 있다.
    다음에 태그를 발견하면 처음부터 애니메이션을 재생합니다.
    D e f aultTracblevent Handler(발췌문)
    
            if (mTrackableBehaviour.gameObject.GetComponentInChildren<VideoPlayer>() != null)
            {
                mTrackableBehaviour.gameObject.GetComponentInChildren<VideoPlayer>().Stop();
            }
    
    
    
    대체로 하고 싶은 동작이 됐기 때문에 일단 여기서 끝냅니다.
    다음은 지금까지 컴퓨터의 웹캠에서 놀아온 것이기 때문에 스마트폰에 구축해 같은 일을 할 수 있는지 도전해보고 싶다.

    좋은 웹페이지 즐겨찾기