版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/a1780531/article/details/90933558

  游戏引擎通常并不具备专业的建模功能,所以通常情况下模型都是在专业的三维软件中进行设计,然后再通过特定格式的文件导入到游戏引擎中进行游戏开发。Unity支持多种外部导入的模型格式,如FBX、3ds、dxf和obj等。
  本文中介绍的FBX文件是Autodesk公司出品的一款用于跨平台的免费三维创作与交换格式的软件,通过FBX用户能访问大多数三维供应商的三维文件。FBX文件支持所有主要的三维数据元素以及二维、音频和视频媒体元素,是当今主流的文件格式。通过在3ds Max中将模型导出为FBX格式文件,再将文件导入到Unity中,就能够对模型进行进一步的游戏设计。在导出导入FBX文件的过程中不少用户会发现模型的尺寸会发生变化,“明明在3ds Max中的设计尺寸为1米,导入到Unity却扩大了一百倍”。究其原因,是因为二者单位转换的问题,弄明白二者之间的关系,就能节省很多开发时间。本文中采用Unity2018.3.0与3ds Max2012进行示范演示。
  第一种情形:
  (1)在3ds Max2012中将系统单位设置“1单位 = 1m”,如图1所示。(设置系统单位的方式:在菜单栏中选择“自定义”-“单位设置”-“系统单位设置”)

图1 系统单位设置

  (2)在编辑区创建一个边长为2米的正方体,如图2所示。

图2 边长为2米的正方体

  (3)点击3ds Max左上角的图标,选择“导出”-“导出”,命名为“testCube.FBX”,这样一个最基础的FBX文件就创建完成。
  (4)将FBX文件导入到Unity场景中。在Unity项目中新建文件夹,命名为“Prefab”,将上一步生成的FBX文件放置到该文件夹下,并将模型拖至场景中,为了后续便于区分,给该正方体添加黄色材质。如图3所示。

(5)为了验证3ds Max与Unity之间模型的尺寸关系,我们需要知道Unity中模型的实际尺寸。Unity中默认单位为米。通过以下脚本获取模型的尺寸

using System.Collections;
using System.Collections.Generic;
using UnityEngine; public class GetSize : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
Vector3 theSize = GetObjectSize();
print(theSize);
} // Update is called once per frame Vector3 GetObjectSize()
{
Vector3 realSize = Vector3.zero;
Mesh mesh = GetComponent<MeshFilter>().mesh;
if(mesh == null)
{
return realSize;
}
Vector3 meshSize = mesh.bounds.size;
Vector3 scale = transform.lossyScale;
realSize = new Vector3(meshSize.x * scale.x, meshSize.y * scale.y, meshSize.z * scale.z);
return realSize;
}
}

将脚本挂载到测试正方体中,运行程序,在控制台输出窗口就会显示尺寸,如图4所示。

图4 控制台输出尺寸

可以看出模型在Unity中的尺寸为2m x 2m x 2m,与我们在3ds Max中的尺寸一致,并且注意到图3右侧Inspector面板中Transform一栏中的Scale的三个值全为1。
  第二种情形
  (1)将第一种情形中3ds Max中的系统单位设置为"1单位=1cm",同样绘制边长为2m的正方体。在导出FBX文件时仍然选择场景单位转化为“米”,注意到此时比例因子变成0.01,如图5所示。

图5 设置场景单位

(2)将导出的FBX文件导入到Unity场景中,如图6中红色立方体所示。通过脚本获取立方体尺寸大小。

从图中可以看出,立方体的尺寸依旧为2m x 2m x 2m,但是Inspector面板中Transform一栏中的Scale的三个值全为0.01。这也就可以看出,因为在3ds Max导出设置时比例因子为0.01,这也就使得Scale变为0.01。
  第三种情形
  (1)3ds Max中的系统单位设置为"1单位=1m",同样绘制边长为2m的立方体。在导出FBX文件时仍然选择场景单位转化为“厘米”,注意到此时比例因子变成100,如图7所示。

(2)将导出的FBX文件导入到Unity场景中,如图8中浅蓝色立方体所示。通过脚本获取立方体尺寸大小,物体尺寸仍为2m x 2m x 2m。但是Inspector面板中Transform一栏中的Scale的三个值全为100。这也就可以看出,因为在3ds Max导出设置时比例因子为100,这也就使得Scale变为100。

第四种情形
  (1)在Unity的project面板单击第三种情形中创建的正方体,会在相应位置显示该模型的Inspector面板,可以注意到Convert Units属性是默认选中的,我们现在取消选中,如图8所示。

(2)再将该立方体拖放到场景中,会发现立方体会扩大很多倍,使用脚本获取尺寸,大小为200m x 200m x 200m,如图10所示。

为什么会发生这种情况呢? 因为我们在3ds Max模型的单位为米,而导出设置时场景单位为厘米,这样模型大小就可以表示为200厘米 x 200厘米 x 200厘米。因为在默认条件下,Convert Units选项是被选中的,而且选项中有指出"1 cm(File) to 0.01m(Unity)",这样最终转到Unity中就是2米 x 2米 x 2米,可以理解为“带单位转换”。但是如果取消Convert Units选项,Unity就不会识别FBX文件中模型的单位是多少,而只是默认识别为200单位 x 200单位 x 200单位 。之前讲过Unity中默认的单位为"1单位=1米",这样导入到场景中就会变成200米 x 200米 x 200米,“可以理解为不带单位转换”。

  总结
  经过上述几个情形的举例,我们已经能够大致了解Unity与3ds Max之间的单位关系。3ds Max中的比例因子参数就是对应了Unity的Transform中的Scale属性。而场景单位就是对应于Unity中的单位,为与Unity单位一致,场景单位最好设置为米。将模型导入到Unity之后要注意观察其Convert Units选项,通常情况下,为了保证3ds Max与Unity中的模型尺寸一致,需要将该选项选中。

(转)Unity与3ds Max的单位关系(使用FBX文件)的更多相关文章

  1. 关于用Max导出Unity3D使用的FBX文件流程注解

    原地址:http://hi.baidu.com/phpstyle/item/c167a4c0694670b10d0a7b87 关于用Max导出Unity3D使用的FBX文件流程注解(转载) (2011 ...

  2. 用Max导出Unity3D使用的FBX文件流程注解(转载)

    http://www.cnblogs.com/wantnon/p/4564522.html 从max导出FBX到Unity,以下环节需要特别注意.1,单位设置   很多人在建模,动画的时候,默认的ma ...

  3. 【Unity】3.3 用3ds Max 2015制作模型并将其导入到Unity

    分类:Unity.C#.VS2015 创建日期:2016-04-05 一.常用三维软件简介 由于游戏引擎本身的建模功能相对较弱,无论是专业性还是自由度都无法同专业的三维软件相比,所以大多数游戏中的模型 ...

  4. 3ds Max光照纹理导入Unity的教程.

    原地址:http://www.cocoachina.com/gamedev/gameengine/2010/0531/1581.html 相信这个3ds Max光照纹理导入Unity的教程对游戏设计师 ...

  5. 【Unity】3.4 将现有的3ds Max模型导入到Unity

    分类:Unity.C#.VS2015 创建日期:2016-04-05 一.简介 这一节我们用一个带有"装子弹和上膛"动画的"枪"模型,介绍在3ds Max 20 ...

  6. 3ds Max从入门到精通

    1. 软件的下载与安装 这里用的是3ds Max2009简体中文版 32位 在 Win7上运行记得打上sp2补丁,不然会有bug. 2. 3ds Max的历史 3ds Max可以用在动画和游戏,点云数 ...

  7. 3ds max学习笔记(六)-- 基本操作(建模前奏)

    1.界面设置 在3ds Max的版本的界面中,默认是较深.若需要切换至较亮的界面,步骤: 执行“自定义”菜单,选择“加载自定义用户界面方案”从弹出的界面中选择样式文件,单击“打开”即可: 注:“amg ...

  8. 3ds Max导出FBX动画模型在OSG中使用

    3ds Max做好动画模型 导出选项:包含-动画-附加选项-勾选使用场景名(这样动画名就是场景名)高级选项-单位-勾选自动(否则导出的模型很小) 导出文件名假设a.fbx使用osgconv工具旋转坐标 ...

  9. 摄像机内参相关(3ds max)

    一般的原理参考:http://ksimek.github.io/2012/08/13/introduction/ 对于3ds max建模时使用的target camera,如果想得到它的内外参,可以利 ...

随机推荐

  1. C++学习七 C++实现add(1)(2)(3)

    一.代码实现: class Yoba { public: Yoba(int n) : _n(n) {} Yoba operator() (int n) { return Yoba(_n + n); } ...

  2. JAVA字符串截取与求模

    public class splitdemo { /** * @param args */ public static void main(String[] args) { // TODO Auto- ...

  3. Javascript定时器只能执行一次

    为了说明问题,代码很短 <script> var test = function(){ console.log('a') } timer1 = setInterval(test(), 10 ...

  4. imutils.path

    from imutils import paths # 要在哪条路径下查找 path = '...' # 查找图片,得到图片路径 imagePaths = list(imutils.paths.lis ...

  5. [LOJ 2133][UOJ 131][BZOJ 4199][NOI 2015]品酒大会

    [LOJ 2133][UOJ 131][BZOJ 4199][NOI 2015]品酒大会 题意 给定一个长度为 \(n\) 的字符串 \(s\), 对于所有 \(r\in[1,n]\) 求出 \(s\ ...

  6. Python中的赋值、深拷贝与浅拷贝(内存地址)

    Python中的赋值.深拷贝与浅拷贝(内存地址) 1.python中的可变对象与不可变对象 (1) 可变对象:dict,list def dict_test(): a = {} b = a print ...

  7. 全面理解UE4委托

    UE4中的delegate(委托)常用于解耦不同对象之间的关联:委托的触发者不与监听者有直接关联,两者通过委托对象间接地建立联系 监听者通过将响应函数绑定到委托上,使得委托触发时立即收到通知,并进行相 ...

  8. 一、SqlServer查询今天的数据-多写法对比性能问题

    -- 目标:查询当天的所有数据 -- 说明:表数据行数:960w --方法一:使用格式化被查询条件与格式化当前时间比对 ),)),) --方法二:使用函数DATEDIFF 比对 --方法三:使用传统比 ...

  9. 被“org.springframework.boot.web.support.SpringBootServletInitializer;”耽搁的两天

    org.springframework.boot.web.support.SpringBootServletInitializer 改为: org.springframework.boot.conte ...

  10. 使用selenium爬虫抓取数据

    写在前面 本来这篇文章该几个月前写的,后来忙着忙着就给忘记了.ps:事多有时候反倒会耽误事.几个月前,记得群里一朋友说想用selenium去爬数据,关于爬数据,一般是模拟访问某些固定网站,将自己关注的 ...