unity3D AR涂涂乐制作浅谈

AR为现在是虚拟现实较为火爆的一个技术,其中有个比较炫酷的就是AR涂涂乐的玩法,这个技术可以把扫描到的图片上的纹理 粘贴到模型上实现为模型上色的功能,但是我们需要怎么才能实现其功能呢?大体的方法是将扫描到图片保存成纹理,在将纹理保存到模型的材质球上然后实现上色的功能。

那么有什么方式可以实现这个功能呢?我在参考的EsayAR的Demo以及在网上查找的方法基本都是采用通过Shader进行图片的处理,因此在这样的条件下,若有多个模型的UV张开图就要写不同的Shader进行进行图片的处理,这样的方式并不方便。那么有没有方法可以不写Shader来实现图片上UV展开图的颜色准确粘贴到模型上呢?于是我想为什么不可以在屏幕上设置一个扫描对准框,然后将扫描框的的内容保存成纹理呢?

那么我先配置好AR的环境,这里我用EsayAR来制作AR涂涂乐的效果,这里为了方便我直接用EsayAR Coloring3D的例子来做这个效果吧!我们先去创建一个空的Gameobject将EsayAR例子中的EasyImageTargetBehaviour类拖入空的GameObject里然后我们将其改名为ImageTargetNamecard,设置好我们的识别图片红色框是图片名字,黄色框是图片放置的位置,记得要Storage属性要设置成Assets,如下图所示:

然后将模型拖入到刚刚创建的ImageTargetNamecard下这样我们就做好了识别图以及模型,摆放的模型要注意的是这个模型必须是要有纹理展开图的模型,然后作为模型的识别图的图片必须对是对应着其纹理的展开的图片,例子里面我是使用一个展开过纹理的Cube模型,其中色块的位置正是UV展开的位置,展开的纹理图片如图下图所示:

现在弄好了AR环境了,那么我们开始做扫描用的对准框吧,这里我用的是UGUI来制作对准框,这里我给对焦框设定好大小,因为我使用的识别图片是1024*1024的所以我们的对焦框也要弄成正方形的520*520就可以了,然后在弄一个按钮在对准后帮模型“上色”!做好的效果大体就如下图所示一样:

那么开始写代码吧!这里我们在模型上添加一个InterceptTexture脚本,脚本内容如下:

using System;
using UnityEngine;
using System.Collections;
using System.IO;
using EasyAR;
using Image = UnityEngine.UI.Image;public class InterceptTexture : MonoBehaviour {public Image scanTexture;public bool isrealRender = false;private Camera scanCamera;private RenderTexture renderTexture;private string pipingID;private string scanPath;private Rect scanRect;private bool isScanTexture = false;//是否开启实时渲染//ImageTargetBaseBehaviour targetBehaviour;// Use this for initializationvoid Start(){scanPath = Application.dataPath + "/StreamingAssets/Drwaing/";scanRect = new Rect(scanTexture.rectTransform.position.x - scanTexture.rectTransform.rect.width / 2, scanTexture.rectTransform.position.y - scanTexture.rectTransform.rect.height / 2,(int)scanTexture.rectTransform.rect.width, (int)scanTexture.rectTransform.rect.height);//targetBehaviour = GetComponentInParent<ImageTargetBaseBehaviour>();gameObject.layer = 31;}void Renderprepare(){if (!scanCamera){GameObject obj = new GameObject("ScanCamera");scanCamera = obj.AddComponent<Camera>();obj.transform.parent = transform.parent;scanCamera.hideFlags = HideFlags.HideAndDontSave;}scanCamera.CopyFrom(Camera.main);scanCamera.depth = 0;scanCamera.cullingMask = 31;if (!renderTexture){renderTexture = new RenderTexture(Screen.width, Screen.height, -50);}if (!isScanTexture){scanCamera.targetTexture = renderTexture;scanCamera.Render();}if(isrealRender)GetComponent<Renderer>().material.SetTexture("_MainTex", renderTexture);//RenderTexture.active = renderTexture;//StartCoroutine(ImageCreate());}void OnWillRenderObject(){Renderprepare();}void OnDestroy(){if (renderTexture)DestroyImmediate(renderTexture);if (scanCamera)DestroyImmediate(scanCamera.gameObject);}public void ScanTextureClick(){StartCoroutine(ImageCreate());}IEnumerator ImageCreate(){isScanTexture = true;if (isScanTexture){scanCamera.targetTexture = renderTexture;scanCamera.Render();}RenderTexture.active = renderTexture;Texture2D scantTexture2D = new Texture2D((int)scanRect.width, (int)scanRect.height, TextureFormat.RGB24, false);yield return new WaitForEndOfFrame();scantTexture2D.ReadPixels(scanRect, 0, 0, false);scantTexture2D.Apply();scanCamera.targetTexture = null;RenderTexture.active = null;GameObject.Destroy(renderTexture);byte[] bytes = scantTexture2D.EncodeToPNG();string savePath = scanPath + gameObject.name + ".png";File.WriteAllBytes(savePath,bytes);isScanTexture = false;isrealRender = false;        ///关闭实时渲染this.gameObject.GetComponent<Renderer>().material.SetTexture("_MainTex", scantTexture2D);Debug.Log("截图完成!");}
}

这里使用的UGUI来制作的扫描框,因此如果用NGUI的同学要自己改一下代码哟!因为公司极却摄像头,我就不做实时演示的截图了

通过对准框截图下来的图片如下:

然后看看我们的模型没贴纹理之前的样子,如下图所示:

然后是先附上贴非裁剪的正常纹理图,第二张是我们截图下来的做纹理的图片:

因为测试的时候用手机打开识别图,导致颜色有点变了,但是大体上位置都没有错!好了测试成功了~~~运行测试的时候千万被手抖哟!不如就没办法完美的对好UV位置!~~

因为是刚刚开始接触AR不久,所以可能做的不好望大家可以多多交流~第一次在公司写技术文章,写的不好请多多包含~

--Bě9oniǎ

这里还有现在普遍的shader上色方法...

转载于:https://www.cnblogs.com/czaoth/p/5530459.html

unity3D AR涂涂乐制作浅谈相关推荐

  1. 计算机应用基础中课程表怎么制作,浅谈《计算机应用基础》课程中Word表格的制作课程教学...

    [摘 要] 本文介绍高职院校如何利用课堂教学让学生掌握计算机的基本知识,熟练地使用计算机进行Word中表格的制作.让学生通过这一基本技能学习和训练达到既学习了word中表格制作的基本方法,又开拓了让学 ...

  2. 中职院校计算机专业课件视频,中职计算机类课程微视频的设计与制作浅谈

    李刚平 [摘 要] 随着网络教学在计算机类实验课程的广泛应用,微视频课程已成为实验类教学改革的研究热点.在如今的数字化"微"时代,微视频课将成为一种新的教学模式和学习方式.阐述计算 ...

  3. 手把手教你做个AR涂涂乐

    前段时间公司有一个AR涂涂乐的项目,虽然之前接触过AR也写过小Demo,但是没有完整开发过AR项目.不过经过1个多星期的学习,现在已经把项目相关的技术都学会了,在此向互联网上那些乐于分享的程序员前辈们 ...

  4. ​手把手教你做个AR涂涂乐 ​

    前段时间公司有一个AR涂涂乐的项目,虽然之前接触过AR也写过小Demo,但是没有完整开发过AR项目.不过经过1个多星期的学习,现在已经把项目相关的技术都学会了,在此向互联网上那些乐于分享的程序员前辈们 ...

  5. EasyAR_实现AR涂涂乐

    实现AR涂涂乐 需要建模的时候 展UV 识别图 和 模型需要匹配好 官方案例 在 Assets --> Samples --> Resources --> HelloAR_Color ...

  6. unity3D 涂涂乐使用shader实现上色效果

    之前我博文里面发过一个简单的通过截图方式来实现的模型上色方法,但是那个方法不合适商用,因为你需要对的很准确才可以把贴图完美截取下来,只要你手抖了一下就会发现贴歪了.那么有没有更好的方法来实现这个效果呢 ...

  7. 涂涂乐的详细实现之四--unity3d调用EmguCV实现图片识别

    涂涂乐严格来说有两个版本,一种是前面详细介绍过的,鼠标控制画图截图发送给服务端实现模型上色:另一种是通过实物图彩笔绘图之后通过扫描仪生成图片发送给服务端来实现模型上色. 动物模型有多种,贴图有多种,在 ...

  8. EasyAR4.0使用说明(Unity3D)三----平面图像跟踪扩展:视频播放,涂涂乐

    播放视频 平面图像识别以后播放视频也是一种经常被用到的增强现实的表现方式.通常是截取视频第一帧的图片作为识别图片,识别以后播放视频.这样就给人一个图片动起来的错觉. 在场景中设置Main Camera ...

  9. Unity_6 涂涂乐案例

    前言 最近学习的东西都是一些零零散散的,看了一下笔记,了解了一个地图插件Minimap之类的:还有一些C#语法:委托.Lambda表达式.另外还有有关vuforia,EasyAR Sense,AVPr ...

最新文章

  1. 数字图像处理2:传统插值
  2. PHP7 学习笔记(六)403 Forbidden - WAMP Server 2.5
  3. Java8 EnumMap 源码分析
  4. c语言获取五子棋盘光标位置,跪求C语言五子棋悔棋部分实现
  5. 1053 住房空置率 (20 分)
  6. c#操作mysql数据库
  7. unordered_map使用自定义enum作为键值
  8. 资深系统管理员给Linux/Unix新人们的建议
  9. python File operation
  10. JavaScript之节点的创建、替换、删除、插入
  11. 检测压缩包并处理的Linux脚本(解压、批量修改文件名、导入)分析
  12. 3D动漫游戏建模很难学?教你如何使用3DMax和ZBrush制作卡通角色
  13. LitePal使用踩坑指南
  14. 站群网站八大盈利模式浅析
  15. 一加nfc门禁卡录入_一加7T手机如何开启NFC、复制门禁卡等功能
  16. Python实现抠图换背景
  17. 放弃VMware改投VirtualBox的五个理由
  18. 计算器和计算机有什么不同,计算机和计算器有区别吗?
  19. 网络(Network)
  20. PHP通过api上传图片

热门文章

  1. 马化腾对短视频志在必得?腾讯又双叒叕发布了一款短视频App
  2. 思科-实验10:路由器接口 PPP 协议封装和 PAP、CHAP 验证配置
  3. Win10、11快速切换不同桌面快捷键
  4. cs1.6服务器ip地址文件,cs1.6服务器端封禁的IP在那个文件夹里?
  5. 【GPRS IP地址】GPRS IP地址的问题
  6. 中国显示器粘合胶市场趋势报告、技术动态创新及市场预测
  7. 基于ABP的AppUser对象扩展
  8. npm安装出现npm err FetchError Invalid response body while trying to fetch httpsregistry.npmjs.orgvu
  9. 自然语言处理文本分析_通过自然语言处理释放文本分析的力量
  10. 什么是代码,源文件、编辑和编译?