Unity模型导入的若干问题

    最近房价涨得太快也懒得去看房了,空下来的时间看一下unity,发现unity3D-3.5版官方的AngryBots示例效果很震撼,就下了一个unity来玩玩。想把unity玩起来自然离不开model,面对3dsmax这些nb工具,作为一名服务器端程序员对此表示压力很大,无奈只能求助谷哥找一些model。

    废了九牛二虎之力后把model从3dsmax导入unity,把模型drag到一个1*1的场景里,结果如下图......

image    

    呃,我的模型呢?还好在Hierarchy里有我导入的model,双击后可以看到(给我的Peon打了一个Point light^_^):

image

 

    看来是model的scale太小了,为什么会太小了呢?3dsmax和unity的unit scale不一样?怎么设置才能达到想要的效果?本文将逐一解答这些问题。

 

 

一、比例问题的产生原因

    简而言之:在默认情况下U3D系统的一个单位(1unit)等于1米,而在3dsmax中默认的单位是inch,因此产生了上述的比例问题。下面的引用来自unity官方论坛:

    By default, the units in Unity are meters. So the default size for terrains is 1000m x 1000m, with a max height of 600m. You can change this in the Terrain->Set Resolution menu.
    The default settings for gravity, and audio dopplar also reflect the default 1 unit = 1m.
    This means that if you want to use the units as some other distance (eg, inches, feet, miles, or whatever), as well as importing models scaled to this new size, you'll also need to adjust the gravity and dopplar settings accordingly so that they produce sensible results for your new world scale.

知道了比例问题产生的原因,接下来就要想办法来解决。

 

 

二、解决办法

    解决方法有两个方面,一种是在unity中调整模型的Scale Factor;另一种是在3dsmax导出的时候按照unity的单位导出。下面分别进行介绍:

 

(1)在unity中进行调整

    模型由3dsmax按照inch的系统单位导出成FBX格式的文件,导出的模型一个单位代表一个inch。unity每个单位代表1米,而unity导入FBX模型是以厘米为最小单位的,因此需要对模型进行一定比例的放大操作。放大比例应该设为多少呢?先做一个实验:

    在max中创建一个1*1的plane,并把参数设置成:

{64C9B349-8F05-4988-BDC8-178E6F286A6D}

 

    导出fbx文件时注意把单位设置成厘米(cm):

image

 

    将fbx文件导入unity后,把Insepector面板里的Scale Factor设为1,即放大100倍。下图左侧是一个1*1的terrain(一平方米),右侧就是放大100倍后的plane。可以看出来plane的边长大概是terrain的2.5倍,也就是2.5米左右。可以来计算一下:max中一个1inch * 1inch的plane,其实也就是2.54cm * 2.54cm ——> 以cm为单位导出成fbx文件 ——> 导入unity后放大100倍,变成2.54米 * 2.54米(2.54个单位)的plane。看来这个流程应该是正确的。

{4342429F-5366-41F7-9277-43F463FC8DD8}

 

总结——在unity中调整放大比例:

    1、如果模型以厘米为单位从max中导出,则导入unity放大100倍可以得到想要的结果。

    2、如果模型以inch为单位(默认情况下)从max中导出,则导入unity后需放大254倍。1inch * 2.54 –> 2.54cm –> 乘以100倍得到结果

PS:unity的模型放大有两种方法:一种方法是修改FBXImporter中的Scale Factor数值(上文提到的Insepector面板里的Scale Factor,其值默认为0.01),将Scale Factor的数值恢复为1,但这样做据说会占用模型资源,比较消耗物理缓存;另一种方法是从Hierarchy中选中待修改物品,使用Scale同时放大x,y,z各100倍,这种设置据说耗费的资源比较少,同时还能通过使用脚本来进行这个放大操作,十分方便。

 

 

(2)在3dsmax中进行调整

    在max中进行调整就是要对模型进行整体缩放,这里有两种方法。

1、第一种方法:在max中选中模型后按R键或者在左上部的工具栏clip_image002按钮可以进行缩放,还可以在右下角找到clip_image004,进行缩放。但这种方法不会改变模型本身的绝对大小,只是改了一个缩放因子,因此不推荐使用。

2、 第二种方法是等比例缩放:全选模型 –》点右上角的工具面板clip_image002[5] -》点击“更多”clip_image004[4]

-》点击“重缩放世界单位”

clip_image006

-》点击右边的按钮clip_image008

-》按照图中的比例选择“场景”然后点击确定clip_image010 完成模型的整体放大。

 

    放大比例是1:100,max导出时要放大100倍。(注意导出FBX文件时“单位”要选择厘米)

 

 

三、比例问题总结

    unity中默认的unit scale和3dsmax的默认scale是不一致的,因此在unity中使用max制作或导出的model时一定要注意比例问题。

下图是一个128个单位(inch)的cliff,图中白色的方块是unity中一个4*4的terrain。128个单位的inch等于128*0.0254=3.2512米,从图中可以看出比例应该是正确的。

image

 

 

四、Unity3d和3dMax美工部分总结

     本小节的内容全部转载自参考文献[1]

    3dsmax2010安装插件,输出FBX的类型导入Unity3D中。默认情况下,3dsmax8可以和U3D软件直接融合,自动转换为FBX物体。

1.面数控制
    在MAX软件中制作单一Game Object物体的面数不能超过65000个三角形,即32500个多边形Poly,如果超过这个数量的物体不会显示出来,这就需要我们合理分布多边形和模型数量。打开MAX场景,选择File/Properties/Summary Info可以打开文件属性记录。其中Faces可以看到每个物体的实际数量,模型面数要少,个体数量不能超过65000个Faces面。
    有特殊效果的模型需要单独制作,物体命名要统一(SanLou_YanHuiTing_JingZi或者SanlouYanhuitingJingzi),但不能出现重复,否则整合模型会被覆盖,给后期工作造成不必要的麻烦。

2.建模控制
    Unity3D软件支持Line渲染和编辑之后所产生的模型。大部分模型都依靠Polygon进行制作。在模型表面可以承认多出四边形的面,但不渲染交错的面。默认情况下,U3D引擎是不承认双面材质的,除非使用植物材质球Nature类型。所以在制作窗户、护栏等物体,如果想在两面都能看到模型,那需要制作出厚度,或者复制两个面翻转其中一个的Normal法线。

3.文件的放置
    模型可以继承MAX的材质,但是文件的设置要按照以下形式进行放在项目的Assets文件夹内,新创建一个Object文件夹。并在其中创建Materials和Texture文件夹(分别自动存放材质球和贴图)。模型物体并列保存在Object文件夹内。这个规律模式不要打乱,否则会破坏整个系统逻辑。

4.材质数量控制
    物体材质要赋予默认的标准材质standard,特殊材质需要特殊调节(玻璃,镜面等),透明材质需要给双面。如果一个物体给与一个材质球,那么Unity3D对于材质数量和贴图数量没有任何的限制。
    如果一个物体给与多个材质球,我们需要用Multi/SubObject来实现,但是这种罗列的材质球的数量没有严格的控制,但尽量保持在10以内,过多的数量会导致一些错误。
    如果不使用Multi/SubObject材质球,也可以选择一些面,然后给与一个材质球。这样系统会自动将其转换成Multi/SubObject材质。
    综合而言Unity3D软件对于材质的兼容还是很好的。

5.物体的质感
Diffuse、Diffuse Bumped、Bumped Specular,这三种类型为常用类型,其中Bumped需要增加Normal法线贴图来实现凹凸。
Decal
    这种材质为贴花材质,即相当于Mask类型,可以再Decal(RGBA)贴与一个带有Alpha通道的图像,形成和原图像相叠加的效果。
Diffuse Detail
    这种材质可以创造出污迹和划痕的效果,即相当于Blend混合材质。
Reflective
    其中各种类型可以创造出金属反射效果,需要增加Cubmap贴图。
Transparent
    其中各种类型可以创造出透明的效果,需要增加具有Alpha的通道贴图。
    注意:如果要做玻璃贴图,Alpha如果全是灰色或黑色(即要求全透明),那么Alpha就会失效,如果要全透明,材质Alpha其中必须至少有1像素为白色。
Nature
    其中Soft Occlusion Leaves类型主要应用于片状的树叶材质。

6.关于复制
    场景中的灯光布局,重复的模型物体都可以使用系统Prefab进行关联复制,这样可以改变一个参数的同时将所有关联物体属性改变。

7.山脉控制
    在创建山脉之后,选择Terrain/Set Resolution可以设置山脉的大小和属性。
    需要注意的是,默认情况下Terrain Width和Terrain Height为1000米。如果设置这个数值太小,那么绘制草的时候会产生偏移,因为草的尺寸必须减少到0.1的单位。
    也就是说,山脉在处理0.1单位的时候会产生0.01的偏差,如果模型太小,这种偏差是显而易见的,所以建议用户不要让模型过小。

8.光晕控制
    光晕又称为Lens Flare即灯光光效。可以选择一个GameObject物体给与Component/Rendering/Lens Flare,并在Flare中增加一个Standard Assets/Light Flares/50mm Zoom项目。这样在运行之后就会产生光晕。但有时候如果光晕太远太高却看不到。一种办法是将光晕离近,另一种办法是将所有摄影机Camera的Far clip plane的数值增加。

9.摄影机控制
    如果场景中有多架摄影机,那么如何确定第一打开时间所显示的摄影机,就需要设置Camera属性中的Depth数值,数值越大的摄影机越优先显示。

 

 

References:

[1]http://ilaoxu.com/unity3d-and-3dmax-art-section-summarizes.html

posted @ 2012-08-01 01:00  ychellboy  阅读(57249)  评论(8编辑  收藏  举报