热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Unity中的人物服装更换系统优化与实现

在Unity中,人物服装更换系统的优化与实现涉及多个关键技术点。本文重点探讨了SkinnedMeshRenderer组件的作用及其优化方法。SkinnedMeshRenderer负责角色模型的网格渲染,通过合理配置其属性,如材质和骨骼权重,可以显著提升服装更换的效率和效果。此外,文章还介绍了如何利用Unity的动画系统和脚本编程,实现动态的服装更换功能,以提高用户体验和游戏性能。

http://www.cnblogs.com/mcwind/archive/2011/02/18/1957453.html  原理

一、 SkinedMeshRender:该对象负责网格绘制。主要数据成员包括

var bones : Transform[] 骨骼

var materials : Material[] 材质

var sharedMesh : Mesh 网格


其中Mesh的主要成员是

vertices : Vector3[] 顶点

boneWeights : BoneWeight[] 骨骼权重

boneWeights数组与vertices数组对应,表示对应下标的顶点运动受骨骼影响的权重。BoenWeight结构记录了骨骼在SkinedMeshRender.bones数组中的索引。 

二、网格和材质的对应关系

      一张实际的网格只能施加一个材质。因此,当render所使用的mesh包含多个实际网格(sub mesh),它对每个sub mesh所施加的材质实际上是materials数组中对应下标的材质。


三、合并网格(CombineMeshes)函数的第二个参数是设置是否将多个子网格合并成一张实际的网格。

        正如前面所述,一个实际的网格只能施加一个材质,所以只有被合并的所有网格原来使用的就是同一个材质(即共享材质)时,将它们真正合并才能正确应用材质。否则,应该将该参数置为false,表示不实际合并这些submesh,而是将它们作为被合并后Mesh对象的sub mesh


四、数组对应问题:

        网格顶点和骨骼、sub mesh和材质之间的对应都是通过数组下标进行的,所以操作时保证新生成的个数组下标对应关系正确是非常重要的。


http://www.cnblogs.com/oldman/articles/2395518.html  操作

2.基础模型生成
基础模型是从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上





在复杂的模型中,我们可以查找子组件的SkinnedMeshRenderer,然后进行操作就可以了。想换哪里就替换哪里的SkinnedMeshRenderer的信息,更新对应的骨骼列表和组合一下网格就行了。
List combineInstances = new List();CombineInstance ci = new CombineInstance();
ci.mesh = SrcSkinMeshRender.sharedMesh;
combineInstances.Add(ci);
还有一个想法是这样的,源资源中是否需要骨头。我发现重组骨头结构的时候其实只是读取了骨头的列表信息,所以我觉得可以写成一个配置信息,直接读取配置信息来重组

来源: > 

对一个人物模型里的个别模块换装,可分为:材质更换,模型更换和骨架更换。


就像下面这段程序那样。

在得到人物SkinnedMeshRenderer后,它的模型进行更换,对其骨架进行更换,最后对其材质球进行更换。



蒙皮绑定到骨架



http://www.cnblogs.com/mcwind/archive/2011/02/18/1957453.html



http://www.manew.com/4136.html








来自为知笔记(Wiz)


推荐阅读
  • Java集合框架特性详解与开发实践笔记
    Java集合框架特性详解与开发实践笔记 ... [详细]
  • C++ STL 常见函数应用详解与实例解析
    本文详细解析了 C++ STL 中常见函数的应用,并通过具体实例进行说明。特别地,文章对迭代器(iterator)的概念进行了深入探讨,将其视为一种将迭代操作抽象化的工具,便于在不同容器间进行元素访问和操作。此外,还介绍了迭代器的基本类型、使用方法及其在算法中的应用,为读者提供了丰富的实践指导。 ... [详细]
  • 在基于.NET框架的分层架构实践中,为了实现各层之间的松散耦合,本文详细探讨了依赖注入(DI)和控制反转(IoC)容器的设计与实现。通过合理的依赖管理和对象创建,确保了各层之间的单向调用关系,从而提高了系统的可维护性和扩展性。此外,文章还介绍了几种常见的IoC容器实现方式及其应用场景,为开发者提供了实用的参考。 ... [详细]
  • Node.js 教程第五讲:深入解析 EventEmitter(事件监听与发射机制)
    本文将深入探讨 Node.js 中的 EventEmitter 模块,详细介绍其在事件监听与发射机制中的应用。内容涵盖事件驱动的基本概念、如何在 Node.js 中注册和触发自定义事件,以及 EventEmitter 的核心 API 和使用方法。通过本教程,读者将能够全面理解并熟练运用 EventEmitter 进行高效的事件处理。 ... [详细]
  • 我正在使用 Ruby on Rails 构建个人网站。总体而言,RoR 是一个非常出色的工具,它提供了丰富的功能和灵活性,使得创建自定义页面变得既高效又便捷。通过利用其强大的框架和模块化设计,我可以轻松实现复杂的功能,同时保持代码的整洁和可维护性。此外,Rails 的社区支持也非常强大,为开发过程中遇到的问题提供了丰富的资源和解决方案。 ... [详细]
  • 在Unity3D中,获取游戏对象有多种实用技巧和方法。除了常见的序列化变量拖拽方式外,还可以使用 `GameObject.Find()` 方法通过对象名称或路径来直接获取游戏对象。此外,`Transform.Find()` 和 `GameObject.FindWithTag()` 也是常用的手段,分别适用于通过层级结构和标签来查找游戏对象。这些方法各有优劣,开发者可以根据具体需求选择最合适的方式。 ... [详细]
  • jQuery Flot 数据可视化插件:高效绘制图表的专业工具
    jQuery Flot 是一款高效的数据可视化插件,专为绘制各种图表而设计。该工具支持丰富的图表类型和自定义选项,适用于多种应用场景。用户可以通过其官方网站获取示例代码和下载资源,以便快速上手和使用。 ... [详细]
  • 作为140字符的开创者,Twitter看似简单却异常复杂。其简洁之处在于仅用140个字符就能实现信息的高效传播,甚至在多次全球性事件中超越传统媒体的速度。然而,为了支持2亿用户的高效使用,其背后的技术架构和系统设计则极为复杂,涉及高并发处理、数据存储和实时传输等多个技术挑战。 ... [详细]
  • HBase在金融大数据迁移中的应用与挑战
    随着最后一台设备的下线,标志着超过10PB的HBase数据迁移项目顺利完成。目前,新的集群已在新机房稳定运行超过两个月,监控数据显示,新集群的查询响应时间显著降低,系统稳定性大幅提升。此外,数据消费的波动也变得更加平滑,整体性能得到了显著优化。 ... [详细]
  • 利用Apache构建高效稳定的Web服务器环境
    本文详细介绍了如何利用Apache构建高效稳定的Web服务器环境。首先,概述了Apache服务器的基本概念及其安装步骤,并深入探讨了相关配置文件的设置方法。接着,通过具体的实验环境示例,展示了服务端(域名:zhangpp63.cn,IP地址:192.168.1.63)和客户端的配置过程,确保读者能够全面理解并实际应用这些技术。此外,还提供了一些优化建议,以提高服务器的性能和稳定性。 ... [详细]
  • 如何在Spark数据排序过程中有效避免内存溢出(OOM)问题
    本文深入探讨了在使用Spark进行数据排序时如何有效预防内存溢出(OOM)问题。通过具体的代码示例,详细阐述了优化策略和技术手段,为读者在实际工作中遇到类似问题提供了宝贵的参考和指导。 ... [详细]
  • 为了在Fragment中直接调用Activity的方法,可以通过定义一个接口并让Activity实现该接口来实现。具体步骤包括:首先在Fragment中声明一个接口,并在Activity中实现该接口。接着,在Fragment中通过类型转换检查Activity是否实现了该接口,如果实现了则调用相应的方法。这种方法不仅提高了代码的解耦性,还增强了模块间的通信效率。此外,还可以通过ViewModel或LiveData等现代Android架构组件进一步优化这一过程,以实现更加高效和可靠的通信机制。 ... [详细]
  • PHP中元素的计量单位是什么? ... [详细]
  • 智能制造数据综合分析与应用解决方案
    在智能制造领域,生产数据通过先进的采集设备收集,并利用时序数据库或关系型数据库进行高效存储。这些数据经过处理后,通过可视化数据大屏呈现,为生产车间、生产控制中心以及管理层提供实时、精准的信息支持,助力不同应用场景下的决策优化和效率提升。 ... [详细]
  • 在《孙鑫VC++讲座笔记第三讲》中,深入探讨了MFC应用程序的架构,并详细解析了SDI程序的流程图。AfxWinMain()函数位于WINMAIN.CPP文件中,其主要职责包括调用AfxWinInit()进行框架初始化,以及通过pApp->InitApplication()执行应用内部的初始化过程。此外,还详细分析了各个关键函数的作用及其在程序启动过程中的具体功能。 ... [详细]
author-avatar
夜-依晨_920
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有