using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class ScreenShot : MonoBehaviour
{private int ScreenWidth, ScreenHeight;private Texture2D Textureshot;  //申请变量储存屏幕截图  Texture纹理意思,Texture2D为内存中的平面纹理/图片。private Vector2 PlaneWH;   //获取面片二维方向上高和宽的长度!               private Vector3 TopLeft_pl_w, BottomLeft_pl_w, TopRight_pl_w, BottomRight_pl_w;   //记录面片的世界坐标  三维!public GameObject Earth;public GameObject EarthFrame;public GameObject Plane;   //储存面片,因为本代码附在空的GameObject“UIManger”上,不再是面片plane,所以计算面片坐标时不该写gameObject.transform.parent.position(此时的gameObject指空的UIManger,而不是我们想要的面片),所以需要public后传递plane。void Start(){ScreenWidth = Screen.width;ScreenHeight = Screen.height;   //直接在Start中声明赋值无影响。Textureshot = new Texture2D(ScreenWidth, ScreenHeight, TextureFormat.RGB24, false);  //属性定义纹理的模式用TextureFormat.RGB24颜色。//标准格式:Texture2D(int width,int height,TextureFormat format,bool mipmap)    bool mipmap,是一种分级纹理,在屏幕中显示大小不同时给予不同的纹理,此处不用。}public void ScreenShot_Button(){//我们需要的是面片在空间中的大小,但我们获取到的是面片的实际大小,它本身缩放了0.1倍,它父集缩放50倍,所以他在空间实际是扩大了5倍,所以要*5。PlaneWH = new Vector2(Plane.GetComponent<MeshFilter>().mesh.bounds.size.x, Plane.GetComponent<MeshFilter>().mesh.bounds.size.z) * 5 * 0.5f;   //空间中x、z是长宽,y是空间中的高度!//获得图片的四个点世界坐标(gameobject指的是面片,它的父集是图片)(position是图片中心的位置,所以需要加上面片x,y向长度)TopLeft_pl_w = Plane.transform.parent.position + new Vector3(-PlaneWH.x, 0, PlaneWH.y);BottomLeft_pl_w = Plane.transform.parent.position + new Vector3(-PlaneWH.x, 0, -PlaneWH.y);TopRight_pl_w = Plane.transform.parent.position + new Vector3(PlaneWH.x, 0, PlaneWH.y);BottomRight_pl_w = Plane.transform.parent.position + new Vector3(PlaneWH.x, 0, -PlaneWH.y);//将截图的四个点坐标传递给Earth shader   1f是为了凑齐shader中的4X4数组,所以new Vector4,另外shader中的数值为浮点型,所以此处加f,不加就成了整形了。Earth.GetComponent<Renderer>().material.SetVector("_Uvpoint1", new Vector4(TopLeft_pl_w.x, TopLeft_pl_w.y,TopLeft_pl_w.z, 1f));Earth.GetComponent<Renderer>().material.SetVector("_Uvpoint2", new Vector4(BottomLeft_pl_w.x, BottomLeft_pl_w.y, BottomLeft_pl_w.z, 1f));Earth.GetComponent<Renderer>().material.SetVector("_Uvpoint3", new Vector4(TopRight_pl_w.x, TopRight_pl_w.y, TopRight_pl_w.z, 1f));Earth.GetComponent<Renderer>().material.SetVector("_Uvpoint4", new Vector4(BottomRight_pl_w.x, BottomRight_pl_w.y, BottomRight_pl_w.z, 1f));//将截图的四个点坐标传递给EarthFrame shader   1f是为了凑齐shader中的4X4数组,所以new Vector4,另外shader中的数值为浮点型,所以此处加f,不加就成了整形了。EarthFrame.GetComponent<Renderer>().material.SetVector("_Uvpoint1", new Vector4(TopLeft_pl_w.x, TopLeft_pl_w.y, TopLeft_pl_w.z, 1f));EarthFrame.GetComponent<Renderer>().material.SetVector("_Uvpoint2", new Vector4(BottomLeft_pl_w.x, BottomLeft_pl_w.y, BottomLeft_pl_w.z, 1f));EarthFrame.GetComponent<Renderer>().material.SetVector("_Uvpoint3", new Vector4(TopRight_pl_w.x, TopRight_pl_w.y, TopRight_pl_w.z, 1f));EarthFrame.GetComponent<Renderer>().material.SetVector("_Uvpoint4", new Vector4(BottomRight_pl_w.x, BottomRight_pl_w.y, BottomRight_pl_w.z, 1f));Matrix4x4 P = GL.GetGPUProjectionMatrix(Camera.main.projectionMatrix, false);   //获取截图时的投影矩阵Matrix4x4 V = Camera.main.worldToCameraMatrix;    //获取截图时世界坐标到相机的矩阵Matrix4x4 VP = P * V;Earth.GetComponent<Renderer>().material.SetMatrix("_VP",VP);   //将截图的转化信息传递给Earth shader。EarthFrame.GetComponent<Renderer>().material.SetMatrix("_VP", VP);   //将截图的转化信息传递给EarthFrame shader。Textureshot.ReadPixels(new Rect(0, 0, ScreenWidth, ScreenHeight), 0, 0);//获取屏幕的像素信息//第一个0,0是获取屏幕像素的起始点//ScreenWidth, ScreenHeight是获取屏幕像素的范围//第二个0,0是填充Texture2D时起始的坐标Textureshot.Apply();//确认之前的Texture2D的修改,此时才真正应用。此时截图保存在内存中,未使用。Earth.GetComponent<Renderer>().material.mainTexture = Textureshot;//获取地球主纹理,并将 截图赋值给它。EarthFrame.GetComponent<Renderer>().material.mainTexture = Textureshot;}
}

本章总结:
1、
此处给地球赋值了,但地球仪支架处于透明材质的material设置中,不会显示,待增加。
2、增添:声明EarthFrame——将面片四点坐标赋值给EarthFrame shader——将投影矩阵Matrix4x4赋值给EarthFrame shader——最后截图赋值给地球仪主主纹理。实际上是先写的shader渲染方法,最后将截到的图片以此渲染方法赋值给模型。
3、因拍摄角度问题,实际渲染出来的模型底座不容易着色,待判断造成原因。

大家还有什么问题,欢迎在下方留言!

如果你有 技术的问题 或 项目开发

都可以加下方联系方式

和我聊一聊你的故事

AR涂涂乐⭐五、关于“4”的部分解决方案相关推荐

  1. EasyAR_实现AR涂涂乐

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

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

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

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

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

  4. unity3D AR涂涂乐制作浅谈

    unity3D AR涂涂乐制作浅谈 AR为现在是虚拟现实较为火爆的一个技术,其中有个比较炫酷的就是AR涂涂乐的玩法,这个技术可以把扫描到的图片上的纹理 粘贴到模型上实现为模型上色的功能,但是我们需要怎 ...

  5. Unity_6 涂涂乐案例

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

  6. 涂涂乐的详细实现之一--画笔核心功能

    涂涂乐绘图板算是我独立完成的第二个项目,从无到有算起来大概花了一个多月的时间.其中碰到了许许多多的坑,同时也补充了各种各样的知识,总之收获挺大.接下来大概分成五个部分详细介绍各部分功能的实现方法. ( ...

  7. EasyAR涂涂乐代码分析

    来说一下对EasyAR sdk中自带的unity Samples中的Coloring3D这个项目的理解(例子程序可以去官网下载 最后会列出所有用到网站的网址). 这个项目的效果就是我们常见的" ...

  8. (示例3)涂涂乐开发教程

    涂涂乐开发教程 本文将向您介绍如何使用 HiAR SDK 创建一个简单的涂涂乐应用. Step 1.基础开发及设置 请先按照"创建 Hello World"中的 Step1-Ste ...

  9. Unity 涂涂乐(不使用shader)

    一般来说他们做涂涂乐都用到shader,可惜渣渣的我不会shader,就算用了shader,我看不懂里面的原理,会让我很烦,所以就另寻他法 无意中看到unity的商店里有一个涂涂乐的免费教程 最终的实 ...

  10. 涂涂乐的详细实现之三--文件IO操作

    这篇内容旨在详细介绍我在完成涂涂乐这个项目中用到的关于文件存储命名等的思路和操作. (一)截图操作 截图的基本思路:在绘图区域确定一个矩形,创建一个Texture2D获取这部分像素并生成图片存储在文件 ...

最新文章

  1. IOI2011 BZOJ2600 ricehub
  2. 【学术笔记】探索大脑静息态活动中的动态信息
  3. sql server numeric 可存几位小数_想成为优秀SQL高手?你就差这些细节
  4. intellij远程调试_IntelliJ中的远程调试Wildfly应用程序
  5. 接口测试--测试工具apipost脚本大全
  6. 在线编程 - PyPool小站启动记
  7. MAC正确简单安装brew
  8. 2010nbsp;贱语大全!
  9. c语言二级java难吗_计算机二级考JAVA还是C?
  10. 比管理时间重要 1000 倍的,是管理精力
  11. idea中加入插入当前系统日期快捷键
  12. 计算机网络:第四章 网络层
  13. 小程序marker callout 遇到的坑
  14. Ubuntu安装lightdm重启后黑屏
  15. dcs系统opc服务器设置,如何配置紫金桥软件与DCS的OPC进行通讯
  16. 对话三星张代君:Bixby到底与Siri有什么不同?
  17. CSS第三章:8.设置元素圆角、椭圆角效果
  18. 两年后,我仍然想念耳机端口
  19. 中国计算机学会推荐中文科技期刊目录(2019年)
  20. SpringBoot + Excel 读写技术与实际问题解决

热门文章

  1. 关于BeanUtils.populate
  2. contiki学习笔记(五)ctimer和etimer
  3. C. Qualification Rounds(状压思维)
  4. 百度搜索结果的URL参数 搜索框提示词搜索方式(rsv_sug2)
  5. PCB工程文件默认打开方式变成了SoildWorks,怎么改成AD默认打开
  6. Unity 制作简单的任务动画
  7. 移动通信核心网技术总结(一)语音与上网业务的实现
  8. Linux下使用Netfilter框架编写内核模块(统计协议层ping特定地址丢包数)
  9. SqlDbx连接Mysql中文乱码
  10. c语言考试排座位系统源程序,c语言_排考场座位问题:.doc