EasyAR4.0使用說明(Unity3D)三----平面圖像跟蹤擴展:視頻播放,塗塗樂

播放視頻

平面圖像識別以後播放視頻也是一種經常被用到的增強現實的表現方式。通常是截取視頻第一幀的圖片作爲識別圖片,識別以後播放視頻。這樣就給人一個圖片動起來的錯覺。

  • 在場景中設置Main Camera的Clear Flags屬性爲Solid Color。
  • 將EasyAR/Prefabs/Composites目錄下的EasyAR_ImageTracker-1預製件拖到場景中。
  • 將EasyAR/Prefabs/Primitives目錄下的ImageTarget預製件拖到場景中。
  • 設置“ImageTarget”的識別圖片。

播放視頻

  • 選中一個“ImageTarget”,點擊鼠標右鍵,在彈出菜單中選擇3D Object--Plane,爲“ImageTarget”對象添加一個平面作爲其子游戲對象。
  • 設置Plane遊戲對象的角度爲“90,0,180”,並修改其Scale屬性將其大小設置的和視頻圖片大小一樣。

播放視頻

  • 選中Plane遊戲對象,點擊菜單Component--Video--Video Player,爲其添加一個視頻播放組件。
  • 將一段視頻拖到目錄EasyAR4Learn/Videos下,導入爲資源,並將其拖動到Video Player組件的Video Clip屬性中爲其賦值。

播放視頻

運行效果:

播放視頻

視頻不僅可以在平面上播放,也可以在其他形狀的3D物體上播放。

在另外一個“ImageTarget”對象下,添加一個方塊作爲視頻播放的遊戲對象,設置方塊的大小和角度,添加Video Player組件並設置組件的Video Clip屬性。

播放視頻

運行效果:

當識別出圖片以後,就可以看見一個方塊,在方塊的表面在播放視頻。

播放視頻

塗塗樂

導入資源

從官方示例導入小熊模型。

播放視頻

從官方示例中導入【Coloring3D】着色器。

播放視頻

從官方示例中導入【Sample_TextureSample】材質。同時設置材質對應的着色器是【Sample/Coloring3D】。

播放視頻

導入腳本。這個腳本是用官方示例腳本改寫的,區別只是去掉了對按鈕的綁定。

播放視頻

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using easyar;

public class Coloring3D : MonoBehaviour
{
    public CameraImageRenderer CameraRenderer;
    private Material material;
    private ImageTargetController imageTarget;
    private RenderTexture renderTexture;
    private Optional<bool> freezed;
    private RenderTexture freezedTexture;

    void Awake()
    {
        material = GetComponent<MeshRenderer>().material;
        imageTarget = GetComponentInParent<ImageTargetController>();
        CameraRenderer.RequestTargetTexture((camera, texture) =>
         {
             renderTexture = texture;
         });
        imageTarget.TargetFound += () =>
       {
           if (freezed.OnNone)
           {
               freezed = false;
           }
       };
    }

    public void Freeze()
    {
        freezed = true;
        if (freezedTexture)
        {
            Destroy(freezedTexture);
        }
        if (renderTexture)
        {
            freezedTexture = new RenderTexture(renderTexture.width, renderTexture.height, 0);
            Graphics.Blit(renderTexture, freezedTexture);
        }
        material.SetTexture("_MainTex", freezedTexture);
    }

    public void Thaw()
    {
        if (freezedTexture)
        {
            Destroy(freezedTexture);
        }
    }

    void Update()
    {
        if (freezed.OnNone || freezed.Value || imageTarget.Target == null)
        {
            return;
        }
        var halfWidth = 0.5f;
        var halfHeight = 0.5f / imageTarget.Target.aspectRatio();
        Matrix4x4 points = Matrix4x4.identity;
        Vector3 targetAnglePoint1 = imageTarget.transform.TransformPoint(new Vector3(-halfWidth, halfHeight, 0));
        Vector3 targetAnglePoint2 = imageTarget.transform.TransformPoint(new Vector3(-halfWidth, -halfHeight, 0));
        Vector3 targetAnglePoint3 = imageTarget.transform.TransformPoint(new Vector3(halfWidth, halfHeight, 0));
        Vector3 targetAnglePoint4 = imageTarget.transform.TransformPoint(new Vector3(halfWidth, -halfHeight, 0));
        points.SetRow(0, new Vector4(targetAnglePoint1.x, targetAnglePoint1.y, targetAnglePoint1.z, 1f));
        points.SetRow(1, new Vector4(targetAnglePoint2.x, targetAnglePoint2.y, targetAnglePoint2.z, 1f));
        points.SetRow(2, new Vector4(targetAnglePoint3.x, targetAnglePoint3.y, targetAnglePoint3.z, 1f));
        points.SetRow(3, new Vector4(targetAnglePoint4.x, targetAnglePoint4.y, targetAnglePoint4.z, 1f));
        material.SetMatrix("_UvPints", points);
        material.SetMatrix("_RenderingViewMatrix", Camera.main.worldToCameraMatrix);
        material.SetMatrix("_RenderingProjectMatrix", GL.GetGPUProjectionMatrix(Camera.main.projectionMatrix, false));
        material.SetTexture("_MainTex", renderTexture);
    }

    void OnDestroy()
    {
        if (freezedTexture) { Destroy(freezedTexture); }
    }
}
複製代碼

實現

  • 在場景中設置Main Camera的Clear Flags屬性爲Solid Color。
  • 將EasyAR/Prefabs/Composites目錄下的EasyAR_ImageTracker-1預製件拖到場景中。
  • 將EasyAR/Prefabs/Primitives目錄下的ImgaeTarget預製件拖到場景中。
  • 導入識別圖片並設置“ImageTarget”的識別圖片爲“coloring3d-bear.jpg”,這裏的識別圖片必須和3D模型對應,是一個特殊UV展開後的紋理貼圖。

塗塗樂

在ImageTarget遊戲對象下添加模型bear。設置模型的方向和位置。修改模型的材質爲Sample_TextureSample。

塗塗樂

將Coloring3D腳本拖到模型上成爲其組件,將RenderCamera遊戲對象拖到腳本組件的Camera Renderer屬性中爲其賦值。

塗塗樂

運行效果:

修改識別圖片中小熊的顏色,對應模型的顏色也會隨之修改。

塗塗樂

自定義實現

塗塗樂本質是將一個3D模型的UV展開圖作爲識別圖片,然後動態的將識別作爲貼圖貼到模型上。

在Unity商城裏面找一個合適的模型,不要太複雜,關鍵是,貼圖只能是一副圖片,而且需要有一些留白。這裏選取的是下面這個卡通汽車模型。在Unity商城中導入資源包。

塗塗樂

導入資源以後,在CartoonCarFree/models/Materials目錄下找到模型的貼圖。

塗塗樂

 

塗塗樂

用圖片編輯器,修改貼圖,去掉貼圖的主要顏色並把邊界線留出來。爲了提高貼圖的識別率,在空白處添加文字內容。

塗塗樂

  • 設置場景中的Main Camera的Clear Flags屬性爲Solid Color。
  • 將EasyAR/Prefabs/Composites目錄下的EasyAR_VideoCamera預製件拖到場景中。
  • 將EasyAR/Prefabs/Primitives目錄下的ImageTarget預製件拖到場景中。
  • 將修改好的貼圖命名爲“car.jpg”,拖到StreamingAssets目錄下。
  • 設置識別圖片是StreamingAssets目錄下的“car.jpg”。

塗塗樂

將FreeCar模型拖到ImageTarget遊戲對象下。設置模型的大小位置和角度到合適的情況。

塗塗樂

選中FreeCar遊戲對象,將目錄EasyAR4Learn/Materials下的Sample_TextureSample貼圖拖到Materials屬性下爲其賦值。

塗塗樂

  • 將Coloring3D腳本拖到FreeCar遊戲對象下成爲其組件。
  • 將RenderCamera遊戲對象拖到Camera Renderer屬性中爲其賦值。

塗塗樂

運行效果:

識別圖片以後,在圖片對於位置填色或繪製內容,模型對應位置也會一起變化。

塗塗樂

如果需要做一個像官方例子那樣的塗塗樂,首先需要選擇模型並重新展開UV,重新設計貼圖。

視頻版鏈接:www.bilibili.com/video/BV1ct…

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章