EasyAR涂涂乐代码分析

来源:互联网 发布:张艺兴发布会知乎 编辑:程序博客网 时间:2024/06/05 22:39

来说一下对EasyAR sdk中自带的unity Samples中的Coloring3D这个项目的理解(例子程序可以去官网下载 最后会列出所有用到网站的网址)。

这个项目的效果就是我们常见的“涂涂乐”。

上色之后

例子程序有很多


其他的我也都看了但是还有一些没有出现预期的效果,今天就先说下Coloring3D”这个工程。

使用unity打开这个工程(官方的说法是4.6版本以上都能用),打开后目录如下:

在下图的目录中打开场景


Hierarchy视图的目录结构如下

下面我们分析下这里面的东西:

1.EasyAR_Startup 这个预设是使用EasyAR所必须的 上面挂的脚本主要有:EasyARBehaviourAugmenterBehaviourImageTrackerBehaviour。对于这三个脚本和其他例子中的脚本官方文档中已经有了很大一部分的说明,如果大家喜欢还会继续对其他例子程序的代码进行分析。

2.ImageTargetNamecard 上面只有一个脚本EasyImageTargetBehaviour

大家如果不太明白这个脚本,就先知道红圈部分指定了识别图片(毕竟这个也不是今天的重点)。

3.下面重点来了!!!!!Colotbear(不知道是我改过名字还是官方给错名字了,感觉这个名字应该是ColorBear才对啊,好好好就先这样)。Inspector视图如下:



4.

下面我们打开Coloring3DBehaviour这个脚本

先来解释下 OnwillRenderObject 这个函数 在unity官方文档中的结束大致如下:onwillrenderobject称为每个相机如果对象是可见的。这个功能是如果对象是被视为从当前相机可见扑杀处理后称为。该方法是有用的,如果你需要一个为每一个渲染对象的相机的准备步骤。这的一个例子是渲染渲染纹理的反射。每一个相机的视点都会有不同的反射,需要在原始的对象之前呈现。如果对象被剔除的一个给定的相机,这个对象会被跳过的思考。使用恰当的语境,看剧本water.cs资产->进口包- >的影响。

注意,camera.current将设置为相机,将渲染对象。此外,这被称为多次每帧。

百度翻译出来的可能也不太清楚什么意思,我说下我个人的理解吧,直接点说就是在渲染小熊之前获取图像(如果直接获取一帧图像小熊模型会遮挡贴图影响效果)其他的代码用注释的形式和大家分享吧。

 void Renderprepare()        {            if (!cam)//这里的cam暂时就叫它贴图相机,它的作用是获取一张屏幕截图(注意是整个屏幕的截图)                     //如果相机为空就new一个出来            {                GameObject go = new GameObject("__cam");                cam = go.AddComponent<Camera>();                go.transform.parent = transform.parent;                cam.hideFlags = HideFlags.HideAndDontSave;            }            cam.CopyFrom(Camera.main);//从主相机中获取一帧            cam.depth = 0;            cam.cullingMask = 31;            if (!renderTexture)            {                renderTexture = new RenderTexture(Screen.width, Screen.height, -50);//new一个贴图            }            cam.targetTexture = renderTexture;            cam.Render();            GetComponent<Renderer>().material.SetTexture("_MainTex", renderTexture);//把截图付给小熊模型        }
  void OnWillRenderObject()        {            if (!targetBehaviour || targetBehaviour.Target == null)                return;            Vector2 halfSize = targetBehaviour.Target.Size * 0.5f;            //通过识别图的中心点得到识别图的四个定点            Vector3 targetAnglePoint1 = transform.parent.TransformPoint(new Vector3(-halfSize.x, 0, halfSize.y));            Vector3 targetAnglePoint2 = transform.parent.TransformPoint(new Vector3(-halfSize.x, 0, -halfSize.y));            Vector3 targetAnglePoint3 = transform.parent.TransformPoint(new Vector3(halfSize.x, 0, halfSize.y));            Vector3 targetAnglePoint4 = transform.parent.TransformPoint(new Vector3(halfSize.x, 0, -halfSize.y));            //获取一张屏幕贴图并付给小熊            Renderprepare();            //把四个UV点设置成刚获取的屏幕截屏中识别图的四个点到此结束。可能我表达不太清楚吧,下面用图片给大家解释            GetComponent<Renderer>().material.SetVector("_Uvpoint1", new Vector4(targetAnglePoint1.x, targetAnglePoint1.y, targetAnglePoint1.z, 1f));            GetComponent<Renderer>().material.SetVector("_Uvpoint2", new Vector4(targetAnglePoint2.x, targetAnglePoint2.y, targetAnglePoint2.z, 1f));            GetComponent<Renderer>().material.SetVector("_Uvpoint3", new Vector4(targetAnglePoint3.x, targetAnglePoint3.y, targetAnglePoint3.z, 1f));            GetComponent<Renderer>().material.SetVector("_Uvpoint4", new Vector4(targetAnglePoint4.x, targetAnglePoint4.y, targetAnglePoint4.z, 1f));        }

把整个屏幕截屏设置为小熊的贴图

通过中心的红点计算出四个顶点的坐标

最后把小熊的四个UVPoint对应到四个顶点

好了到这里就结束了,如果有需要讨论的请Email我

3562134184@qq.com




2 0