【问题标题】:keep object after find tracker in vuforia with unity统一在 vuforia 中找到跟踪器后保留对象
【发布时间】:2016-09-28 20:14:18
【问题描述】:

请帮我解决这个问题 我用unity3d和vuforia编写了一个应用程序,在检测到跟踪器后播放视频,我想在摄像机中检测到后修复视频并停止跟踪,我在TrackableEventHandler.cs中编辑了onTrackingFound和onTrackingLost方法几次但我无法解决它,请帮忙我想办法解决。非常感谢我的朋友。 onTrackingFound 方法是:

private void OnTrackingFound()
{
    Renderer[] rendererComponents = GetComponentsInChildren<Renderer>();
    Collider[] colliderComponents = GetComponentsInChildren<Collider>();

    // Enable rendering:
    foreach (Renderer component in rendererComponents)
    {
        component.enabled = true;
    }

    // Enable colliders:
    foreach (Collider component in colliderComponents)
    {
        component.enabled = true;
    }

    Debug.Log("Trackable " + mTrackableBehaviour.TrackableName + " found");

    // Optionally play the video automatically when the target is found

    VideoPlaybackBehaviour video = GetComponentInChildren<VideoPlaybackBehaviour>();
    if (video != null && video.AutoPlay)
    {
        if (video.VideoPlayer.IsPlayableOnTexture())
        {
            VideoPlayerHelper.MediaState state = video.VideoPlayer.GetStatus();
            if (state == VideoPlayerHelper.MediaState.PAUSED ||
                state == VideoPlayerHelper.MediaState.READY ||
                state == VideoPlayerHelper.MediaState.STOPPED)
            {
                // Pause other videos before playing this one
                PauseOtherVideos(video);

                // Play this video on texture where it left off
                video.VideoPlayer.Play(false, video.VideoPlayer.GetCurrentPosition());
            }
            else if (state == VideoPlayerHelper.MediaState.REACHED_END)
            {
                // Pause other videos before playing this one
                PauseOtherVideos(video);

                // Play this video from the beginning
                video.VideoPlayer.Play(false, 0);
            }
        }
    }

    mHasBeenFound = true;
    mLostTracking = false;
}

onTrackingLost 方法是:

private void OnTrackingLost()
{
    Renderer[] rendererComponents = GetComponentsInChildren<Renderer>();
    Collider[] colliderComponents = GetComponentsInChildren<Collider>();

    /*
    // Disable rendering:
    foreach (Renderer component in rendererComponents)
    {
        component.enabled = false;
    }

    // Disable colliders:
    foreach (Collider component in colliderComponents)
    {
        component.enabled = false;
    }
    */
    Debug.Log("Trackable " + mTrackableBehaviour.TrackableName + " lost");

    mLostTracking = false;
    mSecondsSinceLost = 0;
}

【问题讨论】:

    标签: c# android unity3d vuforia


    【解决方案1】:

    全屏

    如果我理解正确,在检测到可跟踪对象后,您希望停止跟踪和 AR 摄像头视图,而是播放全屏视频?如果是这样,最简单的方法是在检测到可跟踪对象时(即在 OnTrackingFound 中)简单地禁用 Vuforia。然后,您还有一个全屏 Canvas 对象,该对象具有禁用的 RawImage (GameObject &gt; UI &gt; Raw Image) 作为孩子。

    • AR 相机
    • 图像目标
    • 帆布
      • RawImage (有电影素材,最初被禁用)

    RawImage 将分配一个材质,其中材质的主要反照率纹理是一个电影文件(所以是一个 Movie Texture),比如说一个 Ogg Theora .ogv 文件,我们称之为电影材质。然后,当您检测到您的可追踪时,只需启用 RawImagePlay() 电影素材。所以像:

    using UnityEngine.UI;       // for RawImage
    
    public RawImage rawImage;   // public, so remember to drag-assign in editor
    
    private void OnTrackingFound()
    {
        VuforiaBehaviour.Instance.enabled = false;             // disable Vuforia
        rawImage.gameObject.SetActive(true);                   // enable the RawImage
        ((MovieTexture)rawImage.material.mainTexture).Play();  // play the movie
    }
    

    在 3D 空间中

    如果您不想播放全屏视频,而是在通过摄像头看到的 3D 空间中可追踪的位置播放视频,您可以简单地创建一个Plane 对象(@ 987654334@) 作为你的 trackable 的孩子,让我们给它取名为 Movie。让飞机面向 AR 相机,为其分配电影材质,然后在编辑器中禁用其网格渲染器:

    • AR 相机
    • 图像目标
      • 电影(有电影素材,最初禁用了网格渲染器)

    在您的OnTrackingFound 方法中,您可以启用它的渲染器,并将其材质的引用作为MovieTexture,只需执行Play()。在 trackable 的事件处理程序上是这样的:

    private void OnTrackingFound()
    {
        Renderer[] rendererComponents = GetComponentsInChildren<Renderer>(true);
        foreach (Renderer component in rendererComponents)
            component.enabled = true;
        MovieTexture mov = (MovieTexture)transform.GetChild(0).GetComponent<Renderer>().material.mainTexture;
        if (!mov.isPlaying)
            mov.Play();
    }
    

    【讨论】:

    • 抱歉,发帖后我看到你的帖子被标记为android。 Android 不支持电影纹理。对于 Android 上的全屏播放,您可以改用 Handheld.PlayFullScreenMovie。有关Movie Texture documentation page 的更多信息。
    猜你喜欢
    • 2012-04-19
    • 2017-12-02
    • 1970-01-01
    • 2012-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多