unity 陶瓷质感_一种基于Unity3D的虚拟陶瓷设计方法与流程

本发明涉及虚拟现实领域,特别涉及一种基于Unity3D的虚拟陶瓷设计方法。

背景技术:

陶艺工艺制作环境要求严格:不仅在拉坯成型需要利用旋转机器,在烧制过程则需要窑炉锻造,如何将陶瓷制作工艺与虚拟现实开发完美结合在一起,就成为了一个值得探讨的问题。

虚拟现实技术是仿真技术的一个重要方向。它利用电脑模拟产生一个三维空间的虚拟世界,为用户提供关于视觉等感官模拟,令其产生身临其境的感觉和体验,可以及时、没有限制地观察三维空间内的事物。

将陶瓷制作虚拟化,最重要的三点就是:陶瓷的结构设计、陶瓷的形态变换以及手势识别。目前,国内外已经有许多针对陶瓷制作手势识别的进展,其中普渡大学的Vinayak和Karthik Ramani就针对多种手势动作与陶瓷形态曲线的敛合进行了深入的研究,并实现了很好的效果。纵观整个市场,完整的虚拟现实陶瓷制作体验游戏仍未出现,也不曾有体验游戏将虚拟现实和Leap Motion相结合,同时运用在陶瓷制作上。

技术实现要素:

本发明提供一种基于Unity3D的虚拟陶瓷设计方法,将陶瓷制作工艺与虚拟现实开发完美结合在一起,使用户能在虚拟现实环境中,通过Leap Motion体感交互,设计动态化的陶瓷网格模型,并实现自定义网格模型的动态保存和加载。

一种基于Unity3D的虚拟陶瓷设计方法,包括以下步骤:

步骤1,在Unity中集成VR、Leap Motion的开发环境;

步骤2,将虚拟现实场景分成远景和近景两个部分;

步骤3,设计动态变化的陶瓷结构;

步骤4,定义陶瓷网格属性的计算方法;

步骤5,定义高斯函数参数,通过该函数控制陶瓷网格半径和高度变化,实现在虚拟环境中的动态变化;

步骤6,对陶瓷材质进行渲染;

步骤7,实现对陶瓷网格数据的动态保存和加载;

步骤8,功能集成。

作为优选,步骤2中,所述的远景采用实拍照片合成,所述的近景采用3D建模软件进行模型构建。

作为优选,步骤3中,所述的陶瓷结构定义为:

Pn,m:={(hi,Ri,ri)|Ri=R(hi),ri=r(hi),h1<…<hn∈R}

其中,hi表示圆环截面Ci的高度,hi∈[h1,hn],(h1,hn∈R),R表示实数集合,Ri表示圆环截面外半径,ri表示圆环截面内半径,内外半径被连续闭区间[h1,hn]中的光滑函数ri:R→R,Ri:R→R定义,n为陶瓷的圆形截面环个数,m为每个圆形截面环上的顶点数,vi,j表示圆环截面Ci内环的第j个顶点,Vi,j表示圆环截面Ci外环的第j个顶点。

步骤4的具体过程为,将自定义网格顶点分布形式分为内外侧面、顶部内外侧面交接处和内外底面,根据这三种情况,对网格的顶点、三角形序列、顶点的法向量、UV坐标进行重新计算定义。

计算时,对网格的内外侧面和内外侧面衔接处做统一处理,将内外侧面、内外侧面衔接处网格整体展开,作为普通的长方形网格面(圆柱体展开为长方形)。其中,每个顶点的法向量值为顶点周边不同的三角形面片的法向量的平均值。

计算UV坐标时,将网格内外侧面以及内外侧面衔接处的贴图在U方向上进行水平镜像,使贴图在首尾相连时不会出现分割线。

步骤5中,所述定义高斯函数参数具体为,用高斯分布与陶瓷轮廓的形变曲线拟合,计算出符合物理情境的参数,公式为:

其中,参数μ始终为0。

步骤6的具体过程为:将可动态变化的陶瓷网格加入到实现的虚拟场景之中,通过不断的贴图调整和参数调制,最终确定陶瓷贴图渲染方案。

步骤7进一步包括:首先,将自定义网格结构以“.obj”形式保存;然后,序列化自定义网格,将对象转换为字节流保存到PersistentDataPath路径下;最后,反序列化字节流,将字节流转化为自定义网格,动态加载到场景之中。

本发明通过在Unity3D引擎上,结合VR和Leap Motion创建流畅真实的虚拟环境,设计可动态化的陶瓷网格模型,实现利用感应式交互对陶瓷网格的动态修改、动态保存以及动态加载,大大增加了可玩性,使体验者有身临其境的感觉。

附图说明

图1为本发明的流程图;

图2为在Hierachy下Leap Motion的组成;

图3为Hand Pool属性的修改图;

图4为合成后的Stereographic模式照片;

图5为陶瓷层级环状网格结构图;

图6为陶瓷结构的内外侧面和内外侧面衔接处网格展开图;

图7为网格的三角形序列样例;

图8为计算顶点在展开面顶部时法向量的情况;

图9为计算顶点在展开面中部时法向量的情况;

图10为计算顶点在展开面底部时法向量的情况;

图11为材质渲染结果图;

图12为本实施例的交互逻辑图;

图13为本实施例的制作陶瓷的启动页面;

图14为本实施例制作陶瓷时陶瓷半径变化图;

图15为本实施例制作陶瓷时陶瓷高度变化图。

具体实施方式

下面结合附图对本发明的技术方案进行详细讲解。

如图1所示,一种基于Unity3D的虚拟陶瓷设计方法,包括以下步骤:

步骤1:集成VR、Leap Motion的开发环境。

从Leap Motion官网下载并安装Leap Motion SDK,同时下载Leap Motion Unity Core Assets并导入已经创建好的项目中。导入成功之后,在Hierachy中创建空对象取名为LeapMotionControl。从Leap Motion/Prefabs文件中取出预制体LeapHandController,放到LeapMotionControl下方,即成为其子对象。同时,为LeapMotion Control创建新的空对象,命名为HandModels。从LeapMotion/Prefabs/HandModelsNonHouman和LeapMotion/Prefabs/HandModels Physical中依次提取手预制体,最终得到的层级关系如图2所示。最后,修改Hierachy中LeapHandController的HandPool属性,修改如图3。

从HTC Vive官网上下载VIVE软件并安装,再到Unity3D资源库下载SteamVR Plugin资源包并导入项目资源文件中,勾选Edit>Project Settings>Player里的Virtual Reality Supported。创建的空物体命名为CameraVR,从SteamVR/Prefabs中获取[CameraRig]的预制体相机,作为其子物体。这样即便不能直接改变[CameraRig]的位置,也可以通过修改CameraVR的Transform来操作它。

步骤2,构建高性能的虚拟场景。

虚拟场景采用了“近景网格,远景图片”的形式,即用户所在点周围场景通过导入场景网格进行渲染,而远离用户所在点的场景,只需要使用经过特殊处理的照片,进行天空盒贴图。

远景图片采用现场实拍合成的方法。首先,先通过摄像机在选定的拍摄点进行现场360度无缝连拍。为了保证拼接效果良好,相邻图片之间至少要有30%的重合,得到照片集。紧接着,通过合成软件Image Composite Editor将照片拼接,图片导出模式选为stereographic,如图4所示。

将拼接成功的照片导入Unity3D制作天空盒。选中照片,将Texture Type类型修改为Advanced,将Mapping类型修改为Latitude-Longitude Layout(Cylindrical),最后根据图片质量选择适当的Max Size。

步骤3,设计可动态变化的陶瓷结构。

如图5所示,将陶瓷结构描述为包含一组在高度处,内外半径被连续闭区间[h1,hn]中的光滑函数定义的圆形截面环扫成的柱体。将陶瓷结构定义为:

Pn,m∶={(hi,Ri,ri)|Ri=R(hi),ri=r(hi),h1<…<hn∈R}

其中,hi表示圆环截面Ci的高度,hi∈[h1,hn],(h1,hn∈R),R表示实数集合,Ri表示圆环截面外半径,ri表示圆环截面内半径,内外半径被连续闭区间[h1,hn]中的光滑函数ri:R→R,Ri:R→R定义,n为陶瓷的圆形截面环个数,m为每个圆形截面环上的顶点数,vi,j表示圆环截面Ci内环的第j个顶点,Vi,j表示圆环截面Ci外环的第j个顶点。

步骤4,定义四个网格属性的计算方法。

观察陶瓷网格结构,将其结构分布,分为如下三种情况:(a)内外侧面;(b)内外侧面衔接处;(c)内外底面。计算顶点时:三种情况顶点计算方法都不同,因而需要定义三种计算方法。

之后,将内外侧面、内外侧面衔接处沿着某一垂直线切开,整体展开,效果如图6所示。灰色部分为内外侧面衔接处,上下白色部分网格分别为内外侧面。

在计算三角形序列时:将(a)、(b)两种情况合为一种情况,以顺时针的方式进行计算。如图7所示,在展开网格面里由定点1、2、3、4构成的长方形面片,其由两个三角形序列组成,分别是(1,2,3)和(1,3,4)。情况(c)中,每个三角形面片共用一个圆心,因而只需一次计算每个三角形面片即可。

在计算法向量时:在(a)、(b)两种情况合为一种情况,顶点法向量计算在图6上的展开面片上分为顶部、中部、底部。这三种情况在计算上均为求面片法向量的平均值,只是对面片的选择和数量不同。当顶点如图8在顶部时,只需计算面片1和2的法向量平均值;当顶点如图9在中部时,可以选择计算面片1、2、3、4的法向量平均值;当顶点如图10在底部时,可以选择面片1、2的法向量平均值。情况(c)中,设置内外底面的法向量分别为物体坐标Y轴朝上和Y轴朝下。

在计算UV坐标时:将(a)、(b)两种情况合为一种情况。将对应的贴图水平镜像,一张对应于展开网格图的左半边,一张衔接左半边贴图,并对应于展开网格图的右半边,使最后网格形成圆环结构时贴图不会出现分割线。情况(c)中,同样将贴图镜像,只是在处理映射关系时,将贴图的上边缘坐标都映射到圆心坐标,下边缘映射到圆环顶点坐标。

步骤5,定义控制陶瓷网格半径和高度变化的方法。

通过Leap Motion SDK获取每帧手的位置、运动速度等相关信息,计算手的运动向量和手相对于陶瓷轴心位置向量的夹角,来判断半径是变大、变小还是不变。

当某一层级的圆周被触发变化,其邻边圆周半径会随之进行平滑变化。为了保持变化的流畅和平滑,用高斯分布与陶瓷轮廓的形变曲线拟合,计算出合适的符合物理情境的参数,过程中,保证参数μ始终为0。

根据触发点的高度,可将变化情况分为三种:触发点在陶瓷顶部及以上、触发点在陶瓷中部、触发点在陶瓷底部。第一、三种情况只需要用高斯分布改变临近触发点一边的半径,而第二种情况需要改变触发点两边半径。

步骤6,材质渲染。

将可动态变化的陶瓷网格加入到实现的虚拟场景之中。通过不断的贴图调整和参数调制,最终确定陶瓷贴图渲染方案为用normal map增加黏土本身的凹凸质感,并调整材质平滑度和光泽,实现如图11的水润效果。

步骤7,实现对动态变化的陶瓷结构数据动态保存和加载。

将自定义网格结构以”.obj”形式保存。动态保存时,序列化自定义网格,将对象转换为字节流保存到PersistentDataPath路径下。动态载入时,反序列化字节流,将字节流转化为自定义网格,动态加载到场景之中。

步骤8,功能集成。

将实现功能,通过如图12的交互逻辑进行集成。最后实现的启动界面如图13所示;在设计动态化的陶瓷网格模型的过程中,陶瓷的半径变化如图14所示;陶瓷的高度变化如图15所示。陶瓷自定义结构可以实现动态保存和导入。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/334885.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 中怎么加汉字,jquery怎么向body里面增加文字

jquery如何向里面增加文字jsp代码是这样的&#xff1a;我想在页面加载时动态的将一行文字增加到里面&#xff0c;不知道为什么总是加不进去&#xff0c;js代码如下&#xff1a;$(document).ready(function(){if($("#type").val()"MESSAGE") {$(".ke-t…

MacBook 推出移动硬盘时总是提示有程序在使用它,如何解决?

如下图所示&#xff1a; 先使用命令 df -lh 在终端查看当前系统的所有硬盘&#xff0c;命令如下&#xff1a; liaowenxiongliaowenxiongdeMacBook-Air ~ % df -lh Filesystem Size Used Avail Capacity iused ifree %iused Mounted on /dev/disk1s5s1 234Gi…

m_map投影_MATLAB使用m_map工具箱演示绘制m_map logo

第二&#xff0c;新建脚本(CtrlN)&#xff0c;输入如下代码&#xff1a;close all; clear all; clcm_proj(ortho,lat,45,long,-95);m_coast(color,[0,1,0],linewidth,5);m_coast(patch,r);m_grid(linestyle,:,xticklabels,[],yticklabels,[]);patch(0.5*[-1,1,1,-1],0.25*[1,1,…

webcrypto库下载_使用WebCrypto API的电子签名

webcrypto库下载有时我们需要让用户进行电子签名。 通常&#xff0c;人们会理解为以某种方式将您的手写签名放置在屏幕上。 根据管辖范围&#xff0c;可能很好&#xff0c;或者仅存储图像可能还不够。 例如&#xff0c;在欧洲&#xff0c;有910/2014号法规 &#xff0c;该法规定…

21朵水仙花算法java,柏拉图说,如果你有两块面包,你应当用一块去换一朵水仙花。。。。。...

昨天做了一回“黑心商贩”&#xff0c;和我们的团伙一起去卖花了。街上的小情侣们很甜蜜啊&#xff0c;看男孩们眼里的宠爱和迁就还有女孩们小鸟依人的姿态&#xff0c;真是替他们幸福啊&#xff01;(我跟这儿瞎激动啥啊&#xff01;)关键是&#xff0c;正谈恋爱的小情侣们掏钱…

Linux 命令之 ps -- 显示进程状态/查看进程信息

文章目录介绍语法格式常用选项命令示例示例 1&#xff0c;查看进程的 PID、名称以及 CPU 占用率示例 2&#xff0c;查看所有的进程示例 3&#xff0c;按内存资源的使用量对进程进行排序示例 4&#xff0c;按 CPU 资源的使用量对进程进行排序示例 5&#xff0c;显示所有进程信息…

ts获取服务器数据_怎么使用Satruts2实现页面列表数据导出到Excel表格

Java codeprivate InputStream excelFile;public void setExcelFile(InputStream excelFile) {this.excelFile excelFile;}public InputStream getExcelFile() {return excelFile;}public String createExcelFile() {try {String[] headName { "昵称","电子邮…

java登录界面命令_Java命令行界面(第5部分):JewelCli

java登录界面命令细算在Java命令行处理与Apache的百科全书CLI &#xff0c; args4j &#xff0c; jbock和命令行中先前的文章&#xff0c;我把注意力转向在这个岗位使用JewelCli完成的命令行参数相似的处理Java中。 几个Java命令行处理库使用批注来定义命令行选项。 到目前为止…

matlab 三维图像配准,[转载]Matlab实现多种图像配准(转)

本文讲述如何利用Matlab Image Processing Toolbox中的图像配准工具实现线性正投影、仿射、投影、多项式、分段线性、局部加权平均配准的过程。实验平台X86 PC&#xff0c;Windows XP sp2, Matlab 7.1资源的获取matlab工具的使用方法&#xff1a;查看帮助mage Processing Toolb…

Linux 命令之 pstree -- 以树状图显示进程/查看进程信息

文章目录介绍常用选项命令示例介绍 Linux 系统中 pstree 命令的英文全称是“process tree”&#xff0c;即将所有进程以树状图显示&#xff0c;树状图将会以 pid (如果有指定) 或是以 init 这个基本进程为根 (root)&#xff0c;如果有指定使用者 id&#xff0c;则树状图会只显…

totolinkn200up怎么设置_totolinkN200R无线路由器如何设置啊,求高人指点

展开全部totolinkN200R无线路e68a84e8a2ad3231313335323631343130323136353331333337393532由器设置方法&#xff1a;【设置无线路由器方法】【家庭网络环境布线】&#xff1a;1、有猫(modem)&#xff1a;猫(modem)----路由器wan口&#xff1b;路由器lan口----电脑。2、没有猫(…

jersey 入门示例_Jersey Web Service Hello World Java示例

jersey 入门示例在Restlet之后&#xff0c; Jersey是另一个流行的开源框架&#xff0c;可以用Java创建RESTful Web服务 。 Jersey符合JAX-RS规范&#xff0c;实际上它是JAX-RS&#xff08;JSR 311&#xff09;&#xff08;http://jsr311.java.net/nonav/releases/1.1/index.htm…

php domdocument getelementbyid,PHP DOMDocument- getElementByID添加Â代替空

PHP DOMDocument-> getElementByID添加代替空(PHP DOMDocument->getElementByID adding in place of empty )我正在使用PHP的DOMDocument对象来解析一些HTML(使用cURL获取)。 当我按ID获取元素并输出它时&#xff0c;任何空的 标记都会获得一个额外的字符并变为 。代码…

Linux 命令之 whois 命令-用于查找并显示用户信息

文章目录介绍参考示例介绍 whois指令会去查找并显示指定帐号的用户相关信息&#xff0c;因为它是到Network Solutions的WHOIS数据库去查找&#xff0c;所以该帐号名称必须在上面注册方能寻获&#xff0c;且名称没有大小写的差别。 参考示例 [rootlocalhost www]# whois root…

gptuefi优势_UEFI+GPT的区别,有啥不同?写的很详细易懂

搜索相关知识时看到的好文章&#xff0c;由于百度空间挂了&#xff0c;在此注明出处作者QQ:407647406以表谢意&#xff0c;原地址戳我其实楼主早就知道UEFI&#xff0c;曾经也一直关注并试图了解&#xff0c;无奈限于当时国内有关资料匮乏&#xff0c;实在找不到什么使用有效能…

oauth2和jwt_OAuth2,JWT,Open-ID Connect和其他令人困惑的事物

oauth2和jwt免责声明 如果觉得我必须从一个重要的免责声明开始这篇文章&#xff1a; 不要太相信我要说的话。 我之所以这样说&#xff0c;是因为我们正在讨论安全性。 而且&#xff0c; 当您谈论安全性时&#xff0c;除了100&#xff05;正确的陈述外&#xff0c;还有冒任何其他…

matlab的exec程序,C++调用Matlab画图的一段程序

劳动节闲来无事&#xff0c;写了一天程序&#xff0c;just for fun.看&#xff0c;这是C调用Matlab画图的一段程序。暂时不想多解释了&#xff0c;有兴趣的话&#xff0c;看看下面的代码吧。以下几段代码由上到下&#xff0c;越来越旧。最上面的是最新更新的版本。#include#inc…

Linux 命令之 iwconfig 命令-配置无线网络接口

文章目录介绍常用选项参考文档介绍 使用iwconfig命令可以为无线接口显示或设置网络接口的参数&#xff0c;它可以用来配置无线网络接口&#xff0c;是非常好用的。 常用选项 选项说明essid设置无线网卡的ESSID(Extension Service Set ID)。通过ESSID来区分不同的无线网络&am…

java gc cms_Java垃圾收集器:G1GC何时将CMS强制退出?

java gc cms在针对JDK 9&#xff08;2017/4/4&#xff09;提出的JEP中 &#xff0c; Mark Reinhold写道JEP 291 &#xff08;“弃用并发标记扫描&#xff08;CMS&#xff09;垃圾收集器”&#xff09;是“已被放置在在讨论和审查后&#xff0c;由所有者将其定位为目标”。 如果…

ios 高德地图加载瓦片地图_IOS 高德地图 API 加载 WMS 服务

IOS 高德地图 API 加载 WMS 服务本文主要介绍通过自定义高德地图 MATileOverlay 接口&#xff0c;添加 WMS 服务到地图上。废话少说&#xff0c;先贴代码。代码自定义类 WMSTileOverlayUtil&#xff0c;继承自高德地图接口 MATileOverlay&#xff0c;主要重载函数&#xff1a;-…