unity, 3dmax制作的morph(blendshape)导入unity中使用注意事项

2023-10-24 12:50

本文主要是介绍unity, 3dmax制作的morph(blendshape)导入unity中使用注意事项,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在实现《乱纪元大冒险》(见:http://www.cnblogs.com/wantnon/p/4857072.html)中由于质子展开失败形成的变形几何体和眼睛。几何体经过一系列形变最后变成眼睛。这个显然是应该用morph(blendshape)来做了,恰好unity5是支持blendshape的。

例如上图中 正四面体 通过progressive morph依次变形为立方体、球体、眼球。

我的建模过程,首先创建那个 4段x4段x4段 的立方体,然后复制成三份,依次修改为 正四面体、球体 和 眼球。

将立方体修改为球体最容易,直接使用spherify(球化)修改器 即可,但要注意还需要修改一下平滑组,使球体法线变成完全圆滑的。

将球体修改为眼球的方法是先将眼球压细,然后再对各截面进行单独压缩。

将立方体修改为正四面体是最麻烦的,需要建两个正三角形面片,架设成如下样子:

其中一个水平放置,另一个与它成arccos(1/3)=70.5287793度角放置。

用上面这个支架比着,在线框模式下对立方体各截面进行缩放。最后得到重心正好与世界原点对其的正四面体。

另外注意当立方体一条边缩成正四面体一个顶点时,不要缩得太过火,真的把它缩成一个点就不好了,只要缩成一个远看像个点,但近看又是一条边就好了。

最后检查:

1,正四面体的Move值是否是(0,0,0)。

2,正四面体、立方体、球体、眼球 的Scale值是否全为(100,100,100),Rotate值是否全为(0,0,0)。

假如一个物体不满足scale值为(100,100,100),比如是(50,50,50),那一定要改成(100,100,100),但是改完之后发现物体变大了一倍,那怎么办?办法是进入顶点层级,选中所有顶点并进行scale,使缩小一倍。同理,Move和Rotate也都是这么搞。总之就是记住一点,永远不要在模型级别使用旋转、平移 和 缩放,而要在顶点级别去使用。为啥呢?因为morph只按顶点局部坐标进行混合,不会理采模型级别的整体变换。

为正四面体添加morpher修改器,可以看到许多变形通道,由于我现在只需要一个变形过程,即 正四面体->立方体->球体->眼球,所以只使用一个通道就够了。我们在通道0中依次把 立方体、球体、眼球 添加进去,它们会出现在下面的Progressive Morph的Target List中。然后调整通道0的值,就可以观察到变形过程:当值为0时是正四面体,当值为100/3时是立方体,当值为100/3*2时是球体,当值为100时为眼球。

由于我在unity里想用程序去控制morph进程,所以这里只是创建了morph,没有K动画。在unity里gameObject.GetComponent<SkinnedMeshRenderer> ().SetBlendShapeWeight (通道ID, blendShapeWeight)就可以对变形进度进行设置了,这里的通道ID和blendShapeWeight跟3dmax中的通道ID和通道值是完全对应的。

法线问题:

将带morph的模型通过fbx导入到unity之后,在默认设置下,变形过程中法线是不更新的。这会导致形状变对了但是光照效果不对。

解决办法如下:

(引自:http://docs.unity3d.com/Manual/class-Mesh.html)

 

There are two ways to import BlendShapes with normals:
1 Set Normals import mode to Calculate, this way same logic will be used for calculating normals on a mesh and BlendShapes.
2 Export smoothing groups information to the source file. This way, Unity will calculate normals from smoothing groups for mesh and BlendShapes.
If you want tangents on your BlendShapes then set Tangents import mode to Calculate.

 

我只试了第一种方法,即在unity的Import Settings中将Normals改成Calculate,这样可能性能会有所影响,而且未必能忠实地做到与3dmax中的法线效果一致,但对于我目前这个需求来说已经够了,所以就没再试第二种方法。

 

转载于:https://www.cnblogs.com/wantnon/p/4925860.html

这篇关于unity, 3dmax制作的morph(blendshape)导入unity中使用注意事项的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/275267

相关文章

使用Python构建智能BAT文件生成器的完美解决方案

《使用Python构建智能BAT文件生成器的完美解决方案》这篇文章主要为大家详细介绍了如何使用wxPython构建一个智能的BAT文件生成器,它不仅能够为Python脚本生成启动脚本,还提供了完整的文... 目录引言运行效果图项目背景与需求分析核心需求技术选型核心功能实现1. 数据库设计2. 界面布局设计3

使用IDEA部署Docker应用指南分享

《使用IDEA部署Docker应用指南分享》本文介绍了使用IDEA部署Docker应用的四步流程:创建Dockerfile、配置IDEADocker连接、设置运行调试环境、构建运行镜像,并强调需准备本... 目录一、创建 dockerfile 配置文件二、配置 IDEA 的 Docker 连接三、配置 Do

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.

python使用try函数详解

《python使用try函数详解》Pythontry语句用于异常处理,支持捕获特定/多种异常、else/final子句确保资源释放,结合with语句自动清理,可自定义异常及嵌套结构,灵活应对错误场景... 目录try 函数的基本语法捕获特定异常捕获多个异常使用 else 子句使用 finally 子句捕获所

C++11右值引用与Lambda表达式的使用

《C++11右值引用与Lambda表达式的使用》C++11引入右值引用,实现移动语义提升性能,支持资源转移与完美转发;同时引入Lambda表达式,简化匿名函数定义,通过捕获列表和参数列表灵活处理变量... 目录C++11新特性右值引用和移动语义左值 / 右值常见的左值和右值移动语义移动构造函数移动复制运算符

Python对接支付宝支付之使用AliPay实现的详细操作指南

《Python对接支付宝支付之使用AliPay实现的详细操作指南》支付宝没有提供PythonSDK,但是强大的github就有提供python-alipay-sdk,封装里很多复杂操作,使用这个我们就... 目录一、引言二、准备工作2.1 支付宝开放平台入驻与应用创建2.2 密钥生成与配置2.3 安装ali

C#中lock关键字的使用小结

《C#中lock关键字的使用小结》在C#中,lock关键字用于确保当一个线程位于给定实例的代码块中时,其他线程无法访问同一实例的该代码块,下面就来介绍一下lock关键字的使用... 目录使用方式工作原理注意事项示例代码为什么不能lock值类型在C#中,lock关键字用于确保当一个线程位于给定实例的代码块中时

MySQL 强制使用特定索引的操作

《MySQL强制使用特定索引的操作》MySQL可通过FORCEINDEX、USEINDEX等语法强制查询使用特定索引,但优化器可能不采纳,需结合EXPLAIN分析执行计划,避免性能下降,注意版本差异... 目录1. 使用FORCE INDEX语法2. 使用USE INDEX语法3. 使用IGNORE IND

C# $字符串插值的使用

《C#$字符串插值的使用》本文介绍了C#中的字符串插值功能,详细介绍了使用$符号的实现方式,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录$ 字符使用方式创建内插字符串包含不同的数据类型控制内插表达式的格式控制内插表达式的对齐方式内插表达式中使用转义序列内插表达式中使用

flask库中sessions.py的使用小结

《flask库中sessions.py的使用小结》在Flask中Session是一种用于在不同请求之间存储用户数据的机制,Session默认是基于客户端Cookie的,但数据会经过加密签名,防止篡改,... 目录1. Flask Session 的基本使用(1) 启用 Session(2) 存储和读取 Se