发明内容
本发明所要解决的技术问题在于,提供一种将实物颜色转换成3D模型贴图的方法及系统,可结合AR增强现实技术,将现实生活中的色彩信息赋予虚拟物体。
为了解决上述技术问题,本发明提供了一种将实物颜色转换成3D模型贴图的方法,包括:将UV坐标导入Unity3D平台;实时采集目标景物的屏幕图像;获取屏幕图像并判断屏幕图像是否获取成功;若获取不成功,则调整采集位置;若获取成功,则通过滤罩遮挡保留需要的目标图像,根据UV坐标将目标图像转化为纹理并赋予3D模型对象。
作为上述方案的改进,所述获取屏幕图像的方法包括:通过GrabPass通道获取屏幕图像的纹理;通过GrabPass通道获取屏幕的宽高比例;通过shader计算屏幕的UV坐标。
作为上述方案的改进,所述通过shader计算屏幕的UV坐标的方法包括:根据透视除法变换到(0,1)的viewport坐标;分别乘以屏幕宽高,得到真实屏幕的像素坐标。
作为上述方案的改进,透视除法中的透视变换矩阵P的计算如下:
其中,n为近截面距离,f为远截面距离,2r为宽度,2t为高度。
作为上述方案的改进,所述根据UV坐标将目标图像转化为纹理并赋予3D模型对象的方法包括:将目标图像转化为纹理进行存储;当targetTexture=null时,将将目标图像渲染至屏幕上。
相应地,本发明还提供了一种将实物颜色转换成3D模型贴图的系统,包括:导入模块,用于将UV坐标导入Unity3D平台;采集模块,用于实时采集目标景物的屏幕图像;处理模块,用于获取屏幕图像并判断屏幕图像是否获取成功;调整模块,用于获取不成功时,调整采集位置;贴图模块,用于获取成功时,通过滤罩遮挡保留需要的目标图像,根据UV坐标将目标图像转化为纹理并赋予3D模型对象。
作为上述方案的改进,所述处理模块包括:纹理获取单元,用于通过GrabPass通道获取屏幕图像的纹理;屏幕获取单元,用于通过GrabPass通道获取屏幕的宽高比例;坐标计算单元,用于通过shader计算屏幕的UV坐标;判断单元,用于判断屏幕图像是否获取成功。
作为上述方案的改进,所述坐标计算单元包括:第一计算单元,用于根据透视除法变换到(0,1)的viewport坐标;第二计算单元,用于分别乘以屏幕宽高,得到真实屏幕的像素坐标。
作为上述方案的改进,所述第一计算单元的透视除法中的透视变换矩阵P的计算如下:
其中,n为近截面距离,f为远截面距离,2r为宽度,2t为高度。
作为上述方案的改进,所述贴图模块包括:遮挡单元,用于通过滤罩遮挡保留需要的目标图像;存储单元,用于将目标图像转化为纹理进行存储;渲染单元,用于当targetTexture=null时,将将目标图像渲染至屏幕上。:
实施本发明,具有如下有益效果:
本发明采用虚拟模型与现实图像结合的AR增强现实技术,从现实中的物体(如涂色绘本)上读取颜色,利用摄像机拍摄功能和自有研发的算法局部取色,转化成纹理贴图,赋予给虚拟物体;将现实生活中的色彩信息赋予虚拟物体的技术实现,让人们有个前所未有的魔幻体验。具体地,本发明具有以下有益效果:
(1)对应局部截图优化代码,提升效率同时解决现有技术摄像机拍照的局限,实现了普通手机局部拍照取色的技术突破;
(2)将扫描图通过算法转为贴图,这张贴图作为模型的UV,然后贴到虚拟模型上就可以实现了;
(3)建立了虚拟物体模型与真实环境的关系为目的,可让真实环境的色彩赋予给虚拟物体的技术。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明作进一步地详细描述。仅此声明,本发明在文中出现或即将出现的上、下、左、右、前、后、内、外等方位用词,仅以本发明的附图为基准,其并不是对本发明的具体限定。
参见图1,图1显示了本发明将实物颜色转换成3D模型贴图的方法的流程图,其包括:
S101,将UV坐标导入Unity3D平台;
本发明可通过3Dmax等软件,将UV坐标导入Unity3D平台。
如图2所示,模型在制作贴图的时候都需要将模型展开到平面,在平面上模型每个顶点所对应的坐标就是纹理坐标了;而纹理贴图就是给这个平面上完颜色画完画所生成的图片。
S102,实时采集目标景物的屏幕图像;
如图3所示,被摄景物通过摄像头中的镜头,将景物的光学图像(反射光线)投射到传感器(Sensor)上,由传感器将光学图像信号转换成电信号,电信号经过一定的变换和处理后,再通过专用的接口(如今一般都是用MIPI接口,5M以下一般2lane,8M以上一般用4lane)被送到手机主板中的ISP进行处理,最终转换成手机屏幕上能够看到的图像,当拍照的时候,可以把照片经过一定的格式存储(一般JPG)在存储系统上。
S103,获取屏幕图像并判断屏幕图像是否获取成功;
需要说明的是,照片传递给shader的变量有3个:CameraImage的图片作为主纹理进行采样;_MATRIX_MVP矩阵作为ImageTarget的变换矩阵;图片和屏幕的宽高比关系进行校正。
具体地,所述获取屏幕图像的方法包括:
(1)通过GrabPass通道获取屏幕图像的纹理。Shader提供了GrabPass通道直接能够获取屏幕图像,存在_GrabTexture里,这样就不用从CameraImageAccess()中传递过来了。同时CameraImageAccess()函数中使用的Image类获取摄像机图像,不能应用于手机平台;而直接使用GrabPass通道后,可应用于手机平台,因此问题直接解决。
(2)通过GrabPass通道获取屏幕的宽高比例。通过GrabPass获取并进行采样的就是屏幕图像,而不是CameraImage,因此不需要对宽高比进行比例变换了,宽高比例关系也不需要从CameraImageAccess()中传递。
(3)通过shader计算屏幕的UV坐标。模型顶点UV坐标通过_MATRIX_MVP矩阵变换,不需要自己写语句变换到(0,1)范围,可直接采用shader自带的ComputeGrabScreenPos()函数,且包含了硬件平台的区别(比如纹理是否上下颠倒等)。
需要说明的是,ComputeScreenPos()和ComputeGrabScreenPos()的原理:这两个函数的输入参数是“模型顶点本地坐标经MVP矩阵变换后的坐标”pos,返回值是一个二维的窗口坐标o,这个窗口并非最终的屏幕,但是经过适当的变换则映射到最终的屏幕。
进一步,所述通过shader计算屏幕的UV坐标的方法包括:
(1)根据透视除法变换到(0,1)的viewport坐标;透视除法变换到(0,1)的viewport坐标,从函数源码的实际计算过程来看,不考虑offset的情况下,在外部计算o.x/o.w=(pos.x+pos.w)/2pos.w得到的就是一个点在x方向上的比例。
(2)分别乘以屏幕宽高,得到真实屏幕的像素坐标。考虑offset的变换,在外部计算o.x/o.w=(pos.x/2+pos.w/2*(1+1/w))/pos.w,再乘以屏幕宽度w,则得到的是一个点在x方向上的像素坐标+0.5,这不是进行多余两边裁剪的变换,而仅仅是往右往上分别偏移0.5个像素。最终这说明,MVP矩阵的变换一开始对应的就是屏幕坐标,而不是clip space,在进行P矩阵变换时,摄像机自动获取了屏幕空间。
具体地,透视除法中的透视变换矩阵P的计算如下:
其中,n为近截面距离,f为远截面距离,2r为宽度,2t为高度(或者是n、f、FOV、aspect ratio)。但在摄像机的Inspector面板里能找到其它三个参数,却找不到aspectratio的参数。实际上摄像机的aspect ratio大小是根据渲染对象的aspect ratio自动调整的,是通过camera.pixelWidth和camera.pixelHeight计算得到的。渲染对象可以是RenderTexture,也可以是屏幕。因此在C#程序中调用物理摄像头拍照,得到的图像是用的物理摄像头的aspect ratio;而将拍照内容渲染到屏幕上时,用的是屏幕的aspect ratio值。这样就解释了通过MVP矩阵变换后的坐标直接对应的是屏幕坐标。而物理相机是渲染到RenderTexture的图片中了,所以最终图片的分辨率是物理相机的分辨率。
S104,若获取不成功,则调整采集位置;
S105,若获取成功,则通过滤罩遮挡保留需要的目标图像,根据UV坐标将目标图像转化为纹理并赋予3D模型对象。
具体地,所述根据UV坐标将目标图像转化为纹理并赋予3D模型对象的方法包括:
(1)将目标图像转化为纹理进行存储;
(2)当targetTexture=null时,将将目标图像渲染至屏幕上。
需要说明的是,通过Camera.targetTexture:(仅Unity专业版)一般情况下camera都直接渲染到screen,但在渲染到screen之前也可以把camera渲染到一个texture里存储。当targetTexture=null时,camera再渲染到screen。配合使用的几个函数为:
(1)、OnPreCull():Culling(消隐)决定哪些物体对相机来说是可见的,OnPreCull就在这个过程之前调用。注意:脚本被附加到camera上并且使能的时候,函数才起作用。
(2)、OnPreRender():在camera开始渲染场景的第一帧之前调用(在OnPreCull之后)。
(3)、OnPostRender():在camera渲染完场景后调用。
由上可知,本发明将3D模型的UV坐标展开,展开时按照图像的规范制作,导出.fbx文件到unity引擎,.fbx的模型文件会自带UV坐标到引擎内;将用于屏幕截屏形成纹理对应的坐标标识数据把截屏图作为纹理根据UV坐标计算赋给模型对象,从而实现了将实物颜色转换成3D模型贴图的目的。
参见图4,图4显示了本发明将实物颜色转换成3D模型贴图的系统100的结构示意图,其包括:
导入模块1,用于将UV坐标导入Unity3D平台;模型在制作贴图的时候都需要将模型展开到平面,在平面上模型每个顶点所对应的坐标就是纹理坐标了;而纹理贴图就是给这个平面上完颜色画完画所生成的图片。
采集模块2,用于实时采集目标景物的屏幕图像;被摄景物通过摄像头中的镜头,将景物的光学图像(反射光线)投射到传感器(Sensor)上,由传感器将光学图像信号转换成电信号,电信号经过一定的变换和处理后,再通过专用的接口(如今一般都是用MIPI接口,5M以下一般2lane,8M以上一般用4lane)被送到手机主板中的ISP进行处理,最终转换成手机屏幕上能够看到的图像,当拍照的时候,可以把照片经过一定的格式存储(一般JPG)在存储系统上。
处理模块3,用于获取屏幕图像并判断屏幕图像是否获取成功;
调整模块4,用于获取不成功时,调整采集位置;
贴图模块5,用于获取成功时,通过滤罩遮挡保留需要的目标图像,根据UV坐标将目标图像转化为纹理并赋予3D模型对象。
如图5所示,所述处理模块3包括:
纹理获取单元31,用于通过GrabPass通道获取屏幕图像的纹理;Shader提供了GrabPass通道直接能够获取屏幕图像,存在_GrabTexture里,这样就不用从CameraImageAccess()中传递过来了。同时CameraImageAccess()函数中使用的Image类获取摄像机图像,不能应用于手机平台;而直接使用GrabPass通道后,可应用于手机平台,因此问题直接解决。
屏幕获取单元32,用于通过GrabPass通道获取屏幕的宽高比例;通过GrabPass获取并进行采样的就是屏幕图像,而不是CameraImage,因此不需要对宽高比进行比例变换了,宽高比例关系也不需要从CameraImageAccess()中传递。
坐标计算单元33,用于通过shader计算屏幕的UV坐标;模型顶点UV坐标通过_MATRIX_MVP矩阵变换,不需要自己写语句变换到(0,1)范围,可直接采用shader自带的ComputeGrabScreenPos()函数,且包含了硬件平台的区别(比如纹理是否上下颠倒等)。
判断单元34,用于判断屏幕图像是否获取成功。
如图6所示,所述坐标计算单元33包括:
第一计算单元331,用于根据透视除法变换到(0,1)的viewport坐标;透视除法变换到(0,1)的viewport坐标,从函数源码的实际计算过程来看,不考虑offset的情况下,在外部计算o.x/o.w=(pos.x+pos.w)/2pos.w得到的就是一个点在x方向上的比例。
第二计算单元332,用于分别乘以屏幕宽高,得到真实屏幕的像素坐标。考虑offset的变换,在外部计算o.x/o.w=(pos.x/2+pos.w/2*(1+1/w))/pos.w,再乘以屏幕宽度w,则得到的是一个点在x方向上的像素坐标+0.5,这不是进行多余两边裁剪的变换,而仅仅是往右往上分别偏移0.5个像素。最终这说明,MVP矩阵的变换一开始对应的就是屏幕坐标,而不是clip space,在进行P矩阵变换时,摄像机自动获取了屏幕空间。
具体地,所述第一计算单元的透视除法中的透视变换矩阵P的计算如下:
其中,n为近截面距离,f为远截面距离,2r为宽度,2t为高度(或者是n、f、FOV、aspect ratio)。但在摄像机的Inspector面板里能找到其它三个参数,却找不到aspectratio的参数。实际上摄像机的aspect ratio大小是根据渲染对象的aspect ratio自动调整的,是通过camera.pixelWidth和camera.pixelHeight计算得到的。渲染对象可以是RenderTexture,也可以是屏幕。因此在C#程序中调用物理摄像头拍照,得到的图像是用的物理摄像头的aspect ratio;而将拍照内容渲染到屏幕上时,用的是屏幕的aspect ratio值。这样就解释了通过MVP矩阵变换后的坐标直接对应的是屏幕坐标。而物理相机是渲染到RenderTexture的图片中了,所以最终图片的分辨率是物理相机的分辨率。
如图7所示,所述贴图模块5包括:
遮挡单元51,用于通过滤罩遮挡保留需要的目标图像;
存储单元52,用于将目标图像转化为纹理进行存储;
渲染单元53,用于当targetTexture=null时,将将目标图像渲染至屏幕上。
需要说明的是,通过Camera.targetTexture:(仅Unity专业版)一般情况下camera都直接渲染到screen,但在渲染到screen之前也可以把camera渲染到一个texture里存储。
由上可知,本发明采用虚拟模型与现实图像结合的AR增强现实技术,从现实中的物体(如涂色绘本)上读取颜色,利用摄像机拍摄功能和自有研发的算法局部取色,转化成纹理贴图,赋予给虚拟物体;将现实生活中的色彩信息赋予虚拟物体的技术实现,让人们有个前所未有的魔幻体验。具体地,本发明具有以下有益效果:
(1)对应局部截图优化代码,提升效率同时解决现有技术摄像机拍照的局限,实现了普通手机局部拍照取色的技术突破;
(2)将扫描图通过算法转为贴图,这张贴图作为模型的UV,然后贴到虚拟模型上就可以实现了;
(3)建立了虚拟物体模型与真实环境的关系为目的,可让真实环境的色彩赋予给虚拟物体的技术。
以上所述是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也视为本发明的保护范围。