本节书摘来自华章出版社《Unity虚拟现实开发实战》一书中的第2章,第2.5节Blender简介,作者[美] 乔纳森·林诺维斯,更多章节内容可以访问云栖社区“华章计算机”公众号查看。
2.5Blender简介
打开Blender程序,关闭欢迎界面后呈现的就是Blender编辑器了,与下面的截图差不多:
同Unity一样,Blender包括一些不重叠的窗口,可以按喜好自定义这些窗口的布局。但是,Blender的界面更复杂,从某方面来说因为它集成了若干个不同的编辑器,而这些编辑器可以同时在各自的面板中打开。
改变默认视图的大小很有用,因为上面那张图中包含5个不同的编辑器。
最明显的编辑器是那个大的3D View,我已经用红色矩形高亮显示了,在这个视图中可以察看、移动和组织Blender场景中的对象。
其余4个打开的编辑器是:
Info editor,会发现它沿着程序顶部的边缘,其中包含程序的全局菜单和信息。
Timeline editor,在程序的下底边上,用于动画。
Outliner editor,在右上方,场景中所有对象的层级视图都在这里。
Properties editor,在Outliner的右下方,是一个很有用的面板,可以察看和修改场景中对象的多个属性。
每个编辑器也可以有多个面板,我们来看看3D视图编辑器:
中间的大片区域是3D Viewport,可以察看、移动和组织Blender场景中的对象。
3D Viewport的下方是编辑器的Header,它虽然在下方我们却叫它Header。这个Header是一行菜单和工具栏,提供了很多控制编辑器的功能,包括选择器、编辑模式、变换操作和层次管理。
左边的是Tool Shelf,包括各种编辑工具,可以用于当前选中对象、放进选项卡,Tool Shelf可以通过滑动其边缘或者按T键来切换开关状态。
3D视角也有一个Properties面板,它默认可能是隐藏的,可以按N键来切换开关状态,它提供了当前选中对象的属性设置。
在接下来的介绍中,会要求你改变3D视图编辑器的Interaction Mode,变成Edit Mode和Texture Paint模式之间的值,可以在Header中选择,如下图所示:
其他编辑器也有Header面板,Info editor(程序顶部)本身就是一个Header!Outliner和Properties编辑器(右边)的Header在自身面板的顶部而不是在底部。
调整过布局后,看起来就不是那么拥挤和混乱了。
Properties编辑器有一长溜图标,像是选项卡一样,要选择面板中的其余属性。鼠标悬停在图标上(这里其他的UI部件也都一样)就会显示出一个提示语告诉你它的功能,后面的(后续章节中用到它的时候)图片中可以看到。
Blender的布局非常灵活,你甚至可以把一个面板从一个编辑器变成另外一个,每个Header的最左边是Editor Type选择器。点击它就可以看到所有选项。
除了Blender界面上可以点击东西之外,还可以用键盘快捷键执行命令,如果忘了在哪找到某个功能,可以敲空格键再输入最接近你要找的命令名称,它可能就会弹出来!
下图是Blender中的Editor Type选择器:
2.5.1立方体
现在,我们来在Blender中构建一个单位立方体。
默认的场景中可能已经有物体了,包括一个立方体、摄像机和一个光源,如同前面在Blender窗口中显示的那样。(你的初始设置可能会不同,因为它是可配置的。)
如果初始场景中没有单位立方体,那么就像下面这样创建一个:
1.删除场景中的任何东西以确保场景是空的(右键选择,X键删除)。
2.用Shift+S (打开Snap选项列表)| Cursor To Center把3D光标的原点设置成 (0, 0, 0)。
3.在左边的Tool Shelf面板中,选择Create选项卡,再在Mesh下选择Cube 以添加一个立方体。
好了,我们现在进度一样了。
注意在Blender中,参考网格延伸了x轴和y轴,z轴朝上(不像Unity,y轴朝上)。
还有,注意Blender中默认的立方体的大小是 (2, 2, 2)。
而我们需要的是一个单位立方体立在基准面的原点之上,就像这样操作吧:
1.用N键打开Properties面板。
2.选择Transform | Scale 把X,Y,Z设置成 (0.5, 0.5, 0.5)。
3.选择Transform | Location把Z设置成 0.5。
4.再按N键隐藏面板。
5.可以用鼠标滚轮来缩放。
我们还要确保当前渲染器是Blender Render(在程序窗口顶部中间的Info 编辑器中的下拉选项里)。
2.5.2UV纹理图片
接下来,我们创建一张UV纹理图片:
- 找到Edit Mode,在底部的Header栏中选择Interaction Mode选择器。
- 用全选(双击A键)确保所有表面都被选中。
- 在左边的Tool Shelf面板中,选择Shading/UVs选项卡。
- 在UV Mapping下方点击Unwrap,在下拉列表中选择Smart UV Project,接受默认值,点击OK(结果见下图,也能看到光皮的立方体长什么样)。
- 现在再用底部的Header栏把Interaction Mode变成Texture Paint模式。
- 我们还需要为我们的材质定义一个绘制槽,点击Add Paint Slot,选择Diffuse Color,命名为CubeFaces,点击OK。
我们现在开始直接在立方体上绘制,首先画前面,步骤如下: - 制作一个小一点的画刷。在左边的Tool Shelf面板中,Tools选项卡下选择Brush | Radius,然后输入8 px。
- 可能在正交视图下更容易操作。在底部菜单栏中选择View | View Persp/Ortho。
- 然后选择View | Front。
- 如果需要的话你可以用鼠标滚轮来缩放大小。
- 用你最好的书法水平用鼠标左键写上单词“Front”。
- 再在背面做同样的操作。
- 在底部的菜单栏中选择View | Back再用右键选择这一面。
- 好好写一个“Back”。
再在左、右、上、下的面上重复上面的操作,如果发生不能画的情况,确认是否选中了当前表面,试试用右键在这个面上重新选择,结果应该差不多像下面这样(同时在3D View编辑器中用正交透视和UV/Image Editor):
现在,我们保存图片,然后设置其属性,步骤如下:
- 使用3D View编辑器底部Header的最左边的选择器,把当前的Editor Type改成UV/Image Editor。
- 点击Browse Image to be linked选择器图标。(朝着+图标的左边),再在列表中选择 CubeFaces。
- 底部菜单栏的Image 菜单项现在有一个星号(Image*)表示有一张未保存的图片,点击它,选择Save As Image,保存成CubeFaces.png,使用一个Unity工程之外的文件夹。
- 在左边,在Properties编辑器的面板上,在其Header中找到一长排图标,选择Texture(倒数第三个),如果面板不够宽的话它可能会不显示,你可以用鼠标下滑来显示,如下图所示:
- 在Texture属性中,把Type变成Image or Movie。
- 在属性的Image组中,点击Browse Image to be linked选择器图标(见下图)选择CubeFaces。
- 你应该在Preview窗口中可以看到带有标签的纹理图片了。
不错!我们保存这个Blender模型吧,步骤如下: - 在顶部菜单栏中的Info编辑器中选择File,再点击Save(或按Ctrl+S)。
- 使用之前保存纹理图片的文件夹。
- 命名为UprightCube.blend,点击Save Blender File。
我们现在应该在文件夹中有两个文件了,UprightCube.blend和CubeFaces.png。我使用了一个在Unity项目根目录中叫作Blender的文件夹。注意,也可以导出成其他标准格式,比如FBX(Filmbox的简称)就可作为一种选择。
太棒了,完成这么多了。没弄懂也没关系,Blender可能比较难,但是Unity需要模型,你可以一直都从Unity的Asset Store和3D模型分享网站中下载其他人的模型。但不要做一个没用的人,学习自己做自己的模型吧。哈哈!我说真的,这是一个很好的学习起点。
2.5.3导入Unity
回到Unity,我们要导入刚才那两个文件—UprightCube.blend和CubeFaces.png,一个一个来,步骤如下:- 在Project面板中,选择Assets根目录,定位到Create | Folder,重命名这个文件夹为Models。
- 有一个简单的方法导入文件到Unity中,就是从Windows资源管理器(或Mac的Finder)窗口拖拽 .blend文件到Project面板的Assets/Models文件夹,把 .png文件拖拽到Assets/Textures文件夹中(或者也可以用主菜单栏中的Assets | Import New Assets)。
- 通过从Assets/Models文件夹,也就是刚才导入Scene视图的地方,把刚才导入的模型UprightCube拖动到场景中。
- 把它的坐标值设置成与其他对象远离,我设置的Position值是(2.6, 2.2, -3)。
- 从Assets/Textures文件夹中拖动CubeFaces纹理到Scene视图中,停在刚才添加的UprightCube上让它接收这个纹理,然后把松开纹理把放到立方体上。
这样场景应该看着像下面这样了:2.5.4观察者
立方体的背面对着我们,这是一个失误吗?其实这是正常的,因为当前视点是朝前看的,那么我们就应该看着立方体的背面。你应该没注意到,Ethan也是这样。而这个立方体看着差不多有一个单位的容积。
但是,仔细检查一下,在立方体的Inspector面板中,会发现它导入的缩放比例是我们在Blender中给的(0.5, 0.5, 0.5),另外它还有一个X轴的-90°旋转(负90),所以如果我们重置变换值,也就是比例尺为(1, 1, 1),它在我们的世界坐标系中将会是两个单位大小,而且是颠倒的(所以,别重置)。
不用回到Blender中,稍微操作一下就可以抵消这个旋转值了。
Blender的默认朝上的方向是Z轴,而Unity是Y轴。所以,导入时X轴-90°的旋转用于调整这个差异。导入的比例可以在对象的Inspector面板的Import Settings中调整。
比例问题可以通过下面的步骤修复:
1.在Project面板中,选择我们导入的UprightCube。Inspector面板会显示其Import Settings。- 把Scale Factor的值从1改成0.5。
- 点击Apply。
场景中的立方体现在可以是Scale (1, 1, 1),且可以是一个单位立方体,如我们所愿。 - 在Hierarchy中选择UprightCube,把Transform的Sacle值改成 (1, 1, 1)。
在结束上面这个过程之前,在Hierarchy面板中选择UprightCube并把它拖进Project面板的Assets文件夹中。(你可以考虑建立一个Assets/Prefabs文件夹把文件放进去。)这样就做成了一个可重复使用的预制件,包括纹理图片和所有内容。
本节中的一些重要练习(除了在Blender学习的那些之外)可以用于任何3D Unity项目,包括虚拟现实项目。正常来说,你应该会导入比立方体要复杂得多的模型,会遇到数据转换、缩放比例、朝向、UV纹理图片等相关的问题让你困惑。如果遇到了,试着把问题分解成小问题,分解成更独立的场景。做一些小的试验来了解程序是如何交换数据的,这对于你理解混杂的参数可能会有所帮助。
- 你应该在Preview窗口中可以看到带有标签的纹理图片了。