Unity3D官方换装demo中网格合并研究.doc_第1页
Unity3D官方换装demo中网格合并研究.doc_第2页
Unity3D官方换装demo中网格合并研究.doc_第3页
Unity3D官方换装demo中网格合并研究.doc_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Unity3D官方换装demo中网格合并研究为了实现游戏人物外形的定制,专门研究了Unity官方换装demo 。1. 基础BuildPipeline.BuildAssetBundle 把gameobject生成包,可以用于替换和更新www.assetBundle 动态载入包SkinnedMeshRenderer 骨骼模型渲染器,美术导出的时候每个子模型都带SkinnedMeshRenderer2.基础模型生成 基础模型是从characters目录下找fbx模型(名称里面不带),如果找到(如female.fbx),则把模型下所有有 SkinnedMeshRenderer的gameobject删除,然后给模型本身加了个SkinnedMeshRenderer。 因为female是带animation的,所以这样一个基础模型就生成了,此模型带animations, 并且带一个SkinnedMeshRenderer。3.子模型包的生成 子模型包是根据前面找到的fbx模型的子模型,主要包括face, eye, shoes, top ,pants, hair几个部分,子模型包包括三个部分:一个pretab,用到的所有的material, bonenames,4.生成过程生成过程主要在两个函数:public GameObject Generate() /生成基础模型 public GameObject Generate(GameObject root) /生成root下的子模型每一个子模型包对应的类是CharacterElement,整个模型的构成过程,就是集合所有子模型SkinnedMeshRenderer的materials, mesh的CombineInstance,还有bonenames,SkinnedMeshRenderer r = root.GetComponent(); r.sharedMesh = new Mesh(); r.sharedMesh.CombineMeshes(combineInstances.ToArray(), false, false); r.bones = bones.ToArray(); r.materials = materials.ToArray();全部赋值到了基础模型的SkinnedMeshRenderer上5. SkinedMeshRender:该对象负责网格绘制。主要数据成员包括var bones : Transform 骨骼var materials : Material 材质var sharedMesh : Mesh 网格其中Mesh的主要成员是vertices : Vector3 顶点boneWeights : BoneWeight 骨骼权重boneWeights数组与vertices数组对应,表示对应下标的顶点运动受骨骼影响的权重。BoenWeight结构记录了骨骼在SkinedMeshRender.bones数组中的索引。6.网格和材质的对应关系 一张实际的网格只能施加一个材质。因此,【狗刨学习网】当render所使用的mesh包含多个实际网格(sub mesh),它对每个sub mesh所施加的材质实际上是materials数组中对应下标的材质。7. 合并网格(CombineMeshes)函数的第二个参数是设置是否将多个子网格合并成一张实际的网格。 正如前面所述,一个实际的网格只能施加一个材质, 所以只有被合并的所有网格原来使用的就是同一个材质(即共享材质)时,将它们真正合并才能正确应用材质。否则,应该将该参数置为false,表示不实际合 并这些sub mesh,而是将它们作为被合并后Mesh对象的sub mesh。四、数组对应问题:网格顶点和骨骼、sub mesh和材质之间的对应都是通过数组下标进行的,所以操作时保证新生成的个数组下标对应关系正确是非常重要的。这是例子中组合创建模型的主要函数,我将自己理解后的备注添加在里面。复制代码 / Creates a character based on the currentConfiguration recycling a / character base, this way the position and animation of the character / are not changed. / 这个函数实际上并没有将各部分的子网格合并成一张网,而只是将他们合并到 / 同一个Mesh下作为sub mesh。因为一张网格只能用一个材质,只有所有子网格 / 都共享同一个材质时,合并成一张网才能保证材质应用正确。 public GameObject Generate(GameObject root) / The SkinnedMeshRenderers that will make up a character will be / combined into one SkinnedMeshRenderers using multiple materials. / This will speed up rendering the resulting character. List combineInstances = new List(); List materials = new List(); List bones = new List(); /获得构成骨架的所有Transform Transform transforms = root.GetComponentsInChildren(); /一次处理构成身体的各部分 foreach (CharacterElement element in currentConfiguration.Values) /GetSkinnedMeshRenderer()内部Instantiat了一个由该部分肢体Assets构成的 /GameObject,并返回Unity自动为其创建SinkedMeshRender。 SkinnedMeshRenderer smr = element.GetSkinnedMeshRenderer(); /注意smr.materials中包含的材质数量和顺序与下面的sub mesh是对应的 materials.AddRange(smr.materials); for (int sub = 0; sub smr.sharedMesh.subMeshCount; sub+) CombineInstance ci = new CombineInstance(); ci.mesh = smr.sharedMesh; ci.subMeshIndex = sub; combineInstances.Add(ci); / As the SkinnedMeshRenders are stored in assetbundles that do not / contain their bones (those are stored in the characterbase assetbundles) / we need to collect references to the bones we are using / 网格点与骨骼的对应关系是通过Mesh数据结构中的BoneWeight数组来实现的。该数组 / 与网格顶点数组对应,记录了每个网格点受骨骼(骨骼记录在SinkedMeshRender的bones / 数组中,按下标索引)影响的权重。 / 而此处,示例程序提供的肢体Assets并不包含骨骼,而是返回骨骼名称。因此,推断 / GetBoneNames()返回的骨骼名称应该与实际骨骼数组的顺序相同。 foreach (string bone in element.GetBoneNames() foreach (Transform transform in transforms) /通过名字找到实际的骨骼 if ( != bone) continue; bones.Add(transform); break; Object.Destroy(smr.gameObject); / Obtain and configure the SkinnedMeshRenderer attached to / the character base. / 至此,combineInstances、bones和materials三个数组中的数据对应关系是正确的。 / 合并时,第二个参数是fals,表示保持子网格不变,只不过将它们统一到一个Mesh里 / 来管理,这样只需采用一个SkinedMeshRender绘制,效率较高。 SkinnedMeshRenderer r =

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论