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 initialization
void 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上色方法...

unity3D AR涂涂乐制作浅谈的更多相关文章

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

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

  2. AR涂涂乐

    <1> 涂涂乐着色 https://blog.csdn.net/begonia__z/article/details/51282932 http://www.manew.com/blog- ...

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

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

  4. 【微信小程序项目实践总结】30分钟从陌生到熟悉 web app 、native app、hybrid app比较 30分钟ES6从陌生到熟悉 【原创】浅谈内存泄露 HTML5 五子棋 - JS/Canvas 游戏 meta 详解,html5 meta 标签日常设置 C#中回滚TransactionScope的使用方法和原理

    [微信小程序项目实践总结]30分钟从陌生到熟悉 前言 我们之前对小程序做了基本学习: 1. 微信小程序开发07-列表页面怎么做 2. 微信小程序开发06-一个业务页面的完成 3. 微信小程序开发05- ...

  5. 虚拟化构建二分图(BZOJ2080 题解+浅谈几道双栈排序思想的题)

    虚拟化构建二分图 ------BZOJ2080 题解+浅谈几道双栈排序思想的题 本题的题解在最下面↓↓↓ 不得不说,第一次接触类似于双栈排序的这种题,是在BZOJ的五月月赛上. [BZOJ4881][ ...

  6. 浅谈Unity的渲染优化(1): 性能分析和瓶颈判断(上篇)

    http://www.taidous.com/article-667-1.html 前言 首先,这个系列文章做个大致的介绍,题目"浅谈Unity",因为公司和国内大部分3D手游开发 ...

  7. 浅谈WebService的版本兼容性设计

    在现在大型的项目或者软件开发中,一般都会有很多种终端, PC端比如Winform.WebForm,移动端,比如各种Native客户端(iOS, Android, WP),Html5等,我们要满足以上所 ...

  8. 浅谈Hybrid技术的设计与实现第三弹——落地篇

    前言 接上文:(阅读本文前,建议阅读前两篇文章先) 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 根据之前的介绍,大家对前端与Native的交互应该有一些简单的认识了,很多 ...

  9. Android应用安全开发之浅谈加密算法的坑

      <Android应用安全开发之浅谈加密算法的坑> 作者:阿里移动安全@伊樵,@舟海 阿里聚安全,一站式解决应用开发安全问题     Android开发中,难免会遇到需要加解密一些数据内 ...

随机推荐

  1. linux 命令缩写

    su super user apt advanced packaging tool ifconfig interface configuration so shared object fsp frac ...

  2. Selenium自动化测试第二天(上)

    如有任何学习问题,可以添加作者微信:lockingfree 目录 Selenium自动化测试基础 Selenium自动化测试第一天(上) Selenium自动化测试第一天(下) Selenium自动化 ...

  3. 【CentOS】安装Docker教程

    前提条件 Docker 运行在 CentOS 7 上,要求系统为64位.系统内核版本为 3.10 以上. Docker 运行在 CentOS-6.5 或更高的版本的 CentOS 上,要求系统为64位 ...

  4. GitHub 多人协作开发 三种方式:

    GitHub 多人协作开发 三种方式: 一.Fork 方式 网上介绍比较多的方式(比较大型的开源项目,比如cocos2d-x) 开发者 fork 自己生成一个独立的分支,跟主分支完全独立,pull代码 ...

  5. openstack-r版(rocky)搭建基于centos7.4 的openstack swift对象存储服务 一

    openstack-r版(rocky)搭建基于centos7.4 的openstack swift对象存储服务 一 openstack-r版(rocky)搭建基于centos7.4 的openstac ...

  6. Testing Harbor REST API on Swagger

    先贴官方地址,我的做法差不多 https://github.com/goharbor/harbor/blob/master/docs/configure_swagger.md 1.下载对应资源 wge ...

  7. jpa的@Query中"?"占位符的使用小坑

    今天使用@Query自定义查询语句,出现了一个错误: java.lang.IllegalArgumentException: Parameter with that position [1] did ...

  8. 美国警察iPhone数据线挡住歹徒子弹获救

    泡泡网手机频道11月1日 现在手机的功能越来越丰富,不仅可以接打电话.收发短信.玩游戏聊天,关键时刻还能救命.前天HTC手机再次忠心护主,让许多同学对HTC赞赏有加.而现在又有人捡了一条命,不过这次救 ...

  9. css 元素水平垂直方向居中

    html部分 <div class="parent"> <div class="child"> - -居中- - </div> ...

  10. 王者荣耀交流协会 - 第7次Scrum会议(第二周)

    1.例会照片 照片由王超(本人)拍摄,组内成员刘耀泽,高远博,王磊,王玉玲,王超,任思佳,袁玥全部到齐. 2.时间跨度: 2017年10月26日 17:05 — 17:47 ,总计42分钟. 3.地 ...