Unity

将mmd模型改造成游戏可用模型

最近在学习Unity3D 5.0的基于物理的渲染,说实话,这玩意比unity4里的传统光照模型好理解,而且也多了很多的贴图可用,效果也好了很多,尤其是加入了AO贴图以后,能够很好的表现模型暗部的阴影了。出于个人兴趣,就使用了mmd的模型放到unity5.0里做效果,能在unity里看到可爱的妹子,对于我来说是很开心的,这里用到了mmd4mecanim(以下简称mmd4)这个插件,实在是非常感谢作者nora先生,这个插件能非常完美的将mmd模型导入到unity中去。这里附上作者的twitter:https://twitter.com/Stereoarts 注意需要翻墙。 这个插件能将mmd模型和里面的动作转换为fbx文件,这个格式能很方便的导入3dmax,maya,c4d等3d建模软件进行修改。 接下来我稍微讲一下导入mmd模型进入unity里的步骤,其实本身就非常的方便和简洁。 1.导入mmd4插件,导入完成以后应该就会看到红箭头标出的3个文件夹了 2.找一个mmd模型,一般mmd模型格式为pmd和pmx,下载过来的mmd模型一般会是一个文件夹包含pmd或者pmx文件和一堆贴图文件,注意不要改变文件夹结构,直接将文件夹放入unity工程里,如图,这时候mmd4插件会自动对应pmx和pmd文件生成一个.MMD4Mecanim文件。 3.选中这个.MMD4Mecanim文件之后,就能在inspector窗口里看到模型使用条约,我们都勾选上并点击同意,之后就可以看到转换界面了,点击process,稍等一会儿,模型就生成了。生成的模型会在对应的pmx或者pmd的同一个文件夹下,并生成一个Materials的文件夹,里面是这个模型的所有材质。 4.将这个模型拖到场景里就能看到漂亮的mmd模型了。 5.接下来是重点,由于mmd4里的shader是完全模仿mmd效果的shader,并不是基于物理的shader,所以需要将生成出来的shader全部调为unity5里的standard,选中materials文件夹里的所有材质球,将shader改为standard。 因为没有仔细调整,所以模型会变成这个样子 mmd模型的材质命名基本都是日语的罗马音,所以懂日语的人会比较好找对应的材质球。 将材质球稍微调整之后,得到一个看上去比较正常的模型。 6.以上的效果看上去还不错,但是细节部分完全就不行了。unity可以使用lightmap来烘焙静态的物体,使得其阴影能够很好的表现出来,但是动态物体就不行了,这里就需要给动态物体添加AO贴图,在standard的shader里这个就是Occlusion贴图。接下来就需要得到一个比较好的Occlusion贴图。 7.使用3dmax打开这个fbx文件。查看该模型的uv发现,这个模型的uv非常混乱,并且使用了镜像和重叠的uv,这是因为mmd模型原本是为了做视频而做的模型,所以可能在制作的时候并没有按照游戏模型的制作标准来分uv和制作贴图,但是Occlusion贴图的烘焙又必须依靠正确的uv来烘焙,所以这里需要重新分一下模型的uv。 8.一般mmd模型会有两个网格部分,一个是脸部,一个是除脸部以外的其他部分。选择除脸以外的部分,选择可编辑网格中该部分的所有顶点,将焊接值设置为0.001,然后焊接。 焊接之后顶点应该会变少 9.选择脸以外的部分,因为焊接了顶点,可能面的平滑会出问题,选择脸以外部分网格的所有面,并自动平滑一次,选中脸以外的部分,选择导出选定对象,并导出为obj 10.将导出的obj文件导入到Zbrush 4R6中。这里准备使用zbrush 4R6里的uvmaster进行自动拆分uv。 11.在Zbrush里找到Zplugin,选择uvmaster,并使用里面的unwrap命令,稍等片刻,uvmaster将会自动把模型的uv分好 12.稍等之后在右边的tool工具栏中选择texturemap,选择create -> newfromUVcheck查看分好的uv,如果看到这样的图,则说明uv已经分好了 将模型导出成obj保存,用max将导出的obj打开并添加uvw展开修改器检查uv是否正确。现在的uv是不是好看多了。 13.将uv从3dmax中导出,回到最早obj模型的max工程中,选择身体部分的网格,添加uvw展开修改器,将贴图通道选择为2 弹出窗口中选择移动。点击加载,选择新的uv。加载之后可能会有一些显示错误,不过没关系,打开uv编辑器,随便框选几个顶点就显示正常了。 14.因为从unity导入到3dmax中会丢失模型的所有贴图,这一步要将导入的3dmax中的模型还原到unity中的正常样子,具体方法就是调整3dmax里的材质球,对应贴图就好。 15.3dmax菜单中选择 渲染–>渲染到纹理,添加渲染元素为diffusemap,渲染通道选择为2,填充设置为16,分辨率设置为2048×2048,如图 然后选择好保存位置点击渲染,渲染出来的贴图看上去感觉是有问题的,但是其实用photoshop打开或者放到unity里去之后是没有问题的 16.确保漫反射贴图正确以后打开工具->通道信息,选中贴图2并点击清除, 之后会多出一个uvw清除修改器 17.将uvw展开和uvw贴图清除修改器移动到蒙皮的下面,可编辑网格的上面 然后将这两个修改器右键–》塌陷,塌陷完以后将只留下蒙皮和可编辑网格两个修改器。 18.塌陷完以后再次添加uvw修改器,确保贴图通道为1,再次加载之前保存的uv, 这样就完成了漫反射贴图的烘焙和新uv的合并。 由于烘焙漫反射贴图会把之前的多个材质球合并为一个,接下来就是还原本来的多个材质球以便调整单个部位。 19.打开材质编辑器,点击吸管,移动到模型身上吸取材质。 20.将吸取到的材质球付给第二个新的材质球,方法选择实例。 21.最后将材质球拖到模型身上,完成材质球还原。 22.将新添加的uvw展开修改器塌陷之后就可以烘焙AO贴图了,最后把这个模型导出为fbx之后,重新放进unity中。 模型最终效果就变成这样了,是不是比最早的好很多呢

Unity VR&AR Unity播放全景视频及优化极点变形twist问题

2016年是VR元年,这一年度多少少做了点东西,都是关于VR&AR的,虽然现在是冷冬期,个人认为前景还是有的,只不过会曲折前进,工业革命还分好几次呢,对吧! 好了,最近比较空闲,会整理一些VR&AR的一些经验。 这一篇会讲一下如何在Unity中播放全景视频,以及对全景视频的优化。 楼主写这篇教程一用ouclus 为例。 一、Unity播放视频 新建一个工程,写放进去一个全景视频,如果放不进去就安装个quicktime,这个具体的网上有很多前辈已经写了教程,这里我就不多说了,导入视频后显示成这样: 如果显示成白的,就是没有导入成功。 播放视频我们这里用的Unity自带的MovieTexture,条件好的话可以使用Untiy的插件AV Pro. 我们新建一个场景,场景中新建一个Sphere,命名为UntiySphere, 然后新建一个材质,这个材质的shader设置成Particles/Alpha Blended,把这个材质给到UnitySphere,然后把全景视频拖到Particle Texture上 然后新建一个脚本,叫做PlayMovie,加入下面两行代码: MovieTexture mov = (MovieTexture)GetComponent().material.mainTexture; mov.Play(); 将此脚本挂到UnitySphere上,然后将相机的Transform Reset,这个操作是把相机放到原点,坐标旋转置为0,大小设为1, 同样我们把UntiySphere的Transform也Reset,然后将大小改到3,就是把相机包含到球里面。 我们连接好Ouclus,将Untiy的PlayerSettings设置为VR Supported,ouclus,如下图所示: 然后我们运行,就可以看到播放的全景视频 戴上oculus头显可以360度自由旋转。 当然到这里你可能疑问,为啥没有声音,这里很简单,在UnitySphere上添加组件AudioSource, 然后把全景视频下的音频文件拖进去,让它自动播放: 好了播放去全景视频就是这么简单,代码只需要两行就好了。 二、全景视频的优化 但是这里我们往头顶上看的时候会发现一个问题,头顶的图片看的不是连接自然的,能看到明显的缝隙,如图: 那下面我们就来优化这个问题,有三种思路: 1.从Untiy这边解决 从Untiy这边解决就是,我们不用Untiy自带的Sphere,因为它自带的贴图uv分部不均匀,极点会产生Twist效果,我们自己使用Mesh建立一个自己的Octahedron球,就是正八面体拆分的球,然后贴图吻合,材质我们使用跟上面一致的,具体这个球的怎么建立的详见我之前写的关于球的两篇博客: Mesh画球 Mesh给球贴图 然后我们播放全景视频的代码做稍稍改动: // Use this for initialization IEnumerator Start() { //此处等待是为了保证Mesh创建球的时间,实际根据电脑性能或调整脚本执行顺序即可忽略 yield return new WaitForSeconds(1f); MovieTexture mov = (MovieTexture)GetComponent().material.mainTexture; mov.Play(); } 这样运行后的效果如图: 2.从模型发面解决 上面这种方法是基于Untiy原生的改变解决问题,如果你觉得太麻烦的话就不需要如此做,找模型制作的同事帮忙制作了一个比较规则的球,它的uv贴图展开的特别均匀,如图所示: 直接把场景中的UntiySphere替换成模型的ball,其它的一样,这样运行的结果如图: 这样也能达到一样的效果,性能上还省了我们Untiy创建球的时间,空间上这个模型也不大才69kb 与第一种比起来第二种更好,但是mesh的底层研究知道肯定比不知道好。 3.替换MeshFilter 楼主研究了下AVPRo插件里的全景视频的播放,发现它播放的不但很清楚,而且也没有twist的问题,一开始以为是它自己写的shader也能解决这个问题,于是把Untiy自带的Sphere赋予插件里的shader,发现问题依然存在,后来仔细研究一下,发现原来它替换了一个MeshFilter,它的MeshFilter是一个Octahedron的球,跟我们Mesh建立球的思路一样,但是它不是Untiy创建的,而是一个创建好了的片,这样比第二种方法的模型还要方便。 这个片如图所示: 我们把UnitySphere的MeshFilter替换成这个片运行后如图所示: 同样解决了哈,方法三比前面两种似乎更加方便呢。 工程下载地址

HTC Vive 激光线+选中边缘高亮效果

准备场景如下: 之前有详细讲解过激光线效果,不会的可以看看下面地址文章: http://blog.csdn.net/qq_15267341/article/details/53379523 本篇文章重点是讲解选中边缘高亮效果 边缘高亮的插件切记要用Highlight Glow System v5版本 需要边缘高亮效果的物体上添加ShaderGlow脚本 GlowMode:选择User Call Functions选项,因为我们要通过射线撞到了才显示 FR:徐海涛(Hunk Xu) QQ技术群:386476712

Unity3D 一些基础的3D图形学算法

原创文章如需转载请注明:转载自 脱莫柔Unity3D学习之旅 QQ群:【Unity3D(AR/VR) 334163814】【Unity3D(游戏) 119706192】 本文链接地址:Unity3D 一些基础的3D图形学算法 最近做一款一款3D“跑酷”游戏终于要上线了,很开森,忙里偷闲分享点常用的一些基础算法。 另外感兴趣的朋友可以去上网下载下来玩玩 ,游戏叫《让小编飞》,嘿嘿、 ps:最近使用中文编程~强迫症们,来咬我啊! 1..A点正前方,10米位置的坐标点 代码: public Transform A; public Transform Z; void Start () { 正前方(); Debug.Log("Distance:" + Vector3.Distance(A.transform.position, Z.transform.position)); } void 正前方() { Z.transform.position = A.transform.position + Vector3.forward * 10f; } 运行结果: 2.A点前方Y轴45°,10米位置的坐标点 直接上代码: void 斜前方() { Quaternion q = Quaternion.Euler(0, 45, 0); Z.transform.position = A.transform.position + q * Vector3.forward * 10f; } 运行结果: 3.A点到B点方向,10米位置的坐标点 柱子是B点。 这个例子用3D视角来做。 代码: void 到B方向正前方() { Vector3 方向 = (B.

Unity3d游戏开发之使用烘焙贴图教程(一)

关于灯光贴图,烘焙贴图如何在中导入及使用的基本教程。 1,当您完成uvw保存到您的模型。 uvw文件 2,创建新uvw并将其更改为通道2。加载uvw前面创建。这比给你更好的使用自动uvw结果。 3,打( 0 )打开渲染到纹理窗口。选择“使用现有的渠道“ ,更改频道,以“2 “,选择添加“ Lightingmap “。 当你看到的图像呈现是不是真正的结果。真正的图像存储在您的3dsmax的文件夹。通常它存储这样(我Documents/3dsmax/sceneassets/images )为您的型号名称看待“ LightingMap “背面。通常这样的TGA文件。本文出自 【狗刨学习网】 4,在简单的办法是“从材料选择对象“,然后复制“烤材料“到一个空槽。由于。 Fbx输出目前不支持“壳材料“ 。 5,在您指定的新出炉的材料模型,导出的FBX与推广模式。在这里,我使用厘米,嵌入的纹理,转换为可移植格式(TIFF ) 。 6,当您打开您的统一计划,并导入模式,你会看到它的只有弥漫纹理从3dsmax的出口。而且没有光影质感。我的方法是导入光影纹理3dsmax的存储在(我Documents/3dsmax/sceneassets/images ) 。然后添加到您的模型fBm特征的文件夹。 7,在此之后进行。改变你的模型材料,以1 Lightmapped材料。并添加到插槽光影质感。

unity3d从零开始(五):学习光源

1、简介 光源是每一个场景的重要组成部分。网络模型和材质纹理决定了场景的形状和质感,光源则决定了场景环境的明暗、色彩和氛围。每个场景中可以使用一个以上的光源,合理地使用光源可以创造完美的视觉效果。 2、Unity的光源类型 Unity提供了4中类型的光源,在合理设置的基础上可以模拟自然界中的任何光源。 2.1、Directional light 方向光源。该类型光源可以被放置在无穷远处,可以影响场景的一切游戏对象,类似于自然界中日光的照明效果。方向光源氏最不耗费图形处理器资源的光源类型。 2.2、Point light 点光源。该类型的光源从一个位置向四面八方发出光线,影响其范围内的所有对象,类似电灯泡的照明效果。点光源的阴影是较耗费图形处理器资源的光源类型。 2.3、Spotlight 聚光灯。该类型的光源从一点出发,在一个方向按照一个锥形的范围照射,处于锥形区域的对象会受到光线照射,类似射灯的照明效果。聚光灯是较耗费图形处理器资源的光源类型。 2.4、Area Light 区域光/面光源。该类型的光源无法应用于实时光照,仅适用于光照贴图烘培。 3、光源属性讲解 3.1 Type 光源类型。 单击Type按钮,可以选择光源的类型。 3.2 Randge 范围。该项目用于控制光线从光源对象的中心发射的距离,只有点光源和聚光灯有该参数。 3.3 Color 颜色。该项用于调节光源的颜色。 3.4 Intensity 强度。该项用于控制光源的强度,聚光灯以及点光源的默认值是1,方向光默认值是0.5。 3.5 Cookie 该项目用于为光源指定拥有alpha通道的纹理,使光线在不同的地方有不同的强度。如果光源是聚光灯或方向光,可以指定一个2D纹理。如果光源氏一个点光源,必须指定一个Cubemap(立方体纹理)。 3.6 Cookie Size 该项用于控制缩放Cookie投影。只有方向光有该参数。 3.7 Shadow Type 3.7.1 阴影类型 阴影类型。为光源选择阴影类型,可以选择No Shadows(关闭阴影)、Hard Shadows(硬阴影)以及Soft Shadows(软阴影)。需要特别指出的是,软阴影会消耗更多的系统资源。默认设置下,只有Directional light光源才可以开启阴影,Pointlight、Spotlight光源开启阴影的话会弹出提示,如下图,意为只有Directional light光源在Forward模式下才可以启用阴影。 3.7.2 开启其他类型光源的阴影 如果希望开启Point light、Spot light类型光源的阴影(只有发布成Web版或单击版才支持),可以打开菜单栏中的Edit->Project Settings->Player选项,在Inspector视图中的Per-Platform Settings项下面的Other Settings栏中,单击Rendering Path*项右侧的按钮,在弹出的列表框中选择Deferred Lighting类型。如下图: 3.7.3 渲染路径参数比较 Rendering Path* (渲染路径)有三种类型 3.7.3.1 VertexLit 顶点光照。光照效果最差,不支持阴影,一般用于配置较差的机器或受限的移动终端平台。 3.7.3.2 Forward 正向着色。能够很好的支持光源照射效果,但不支持Point light、Spot light类型光源的阴影。 3.

去除图片的阴影部分,只显示图片:

去除图片的阴影部分,只显示图片: 1.在Unity中制作背景图片,首先要建立一个材质(Material),然后把这个图片附在这个材质上。 2.在Unity中创建一个Plane,然后可以把刚刚建好的材质附在这个Panel上(也可以建立Cube来代替Plane),调整好大小就可以把这个背景图片显示在Unity中了。 3.因为图片不能直接附到Plane上,所以一定要通过材质。 4.最后一步就是设置这个Plane的Shader: 4.1.自发光:Mobile->Unlit(Supports Lightmap) 4.2.只显示图片的形状:Particles->Alpha Blended