本发明涉及虚拟现实领域,特别涉及一种基于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所示。陶瓷自定义结构可以实现动态保存和导入。