本节书摘来自华章出版社《Unity虚拟现实开发实战》一书中的第2章,第2.2节创建简单的透视图,作者[美] 乔纳森·林诺维斯,更多章节内容可以访问云栖社区“华章计算机”公众号查看。
2.2创建简单的透视图现在我们添加几个物体到场景中来搭建这个环境,其中包括一个单位立方体、一个平面、一个红色球体和一个照片背景。2.2.1添加立方体我们添加第一个对象到场景中—一个单位大小的立方体。在Hierarchy面板中,用Create菜单选择3D Object | Cube,主菜单栏中GameObject的下拉菜单中也有同样的选项。一个默认的白色立方体就被添加到了场景中,放在了地平面的中心点(0, 0, 0)位置,没有旋转值和缩放值,你可以在Inspector面板中看到这些值。这是Reset设置值,可以在这个物体在Inspector面板中的Transform组件中找到。Transform的Reset值是Position (0,0,0),Rotation (0,0,0),Scale(1,1,1)。如果某些情况下你新添加的立方体不是这个值,可以手动设置成这些值,或者通过点击Inspector面板中Transform组件右上角的齿轮图标选择Reset来设置。这个立方体在各维度上都是一个单位,我们后面会发现,在Unity中一个单位对应世界坐标系中的1m,其局部中心点位于立方体的中心。2.2.2添加平面现在我们来添加一个平面对象到场景中。在Hierarchy面板中,点击Create菜单(或GameObject菜单),然后选择3D Object | Plane。一个默认的白色平面会被添加到场景中,放置于地平面的中心点 (0, 0, 0) 位置,(如果有必要的话可以通过点击Inspector面板中Transform组件右上角的齿轮图标选择Reset来设置成这个值),把它重命名为GroundPlane。注意当缩放比例为 (1, 1, 1) 时,Unity中的平面对象实际上相当于在X轴和Z轴上10×10个单位的长度,也就是说,GroundPlane的长宽是10×10个单位大小,其Transform组件的Scale值是1。立方体的中心点在 Position (0, 0, 0),与地平面相同。但是看起来似乎不像是这样,Scene面板可能会显示成一个把3D场景渲染到2D图片上的Perspective投影,Perspective变形使立方体看起来不在地平面的中心点,但实际上它在中心点,数一下到各边的网格线数就能看出来。另外,当在虚拟现实中查看它的时候,你实际上是站在场景中的,这个时候根本看不出变形,如下图所示:
立方体陷入了地平面之下是因为其局部原点在其几何中心—也就是相当于1×1×1的中心点 (0.5, 0.5, 0.5) ,这听起来可能很显然,但有些模型的原点并不在其几何中心上(比如在其一个角上)。一个对象的Transform组件的位置值是其局部原点在世界坐标系中的位置值。我们移动一下这个立方体:1.通过Inspector面板中把Position的Y值设置成0.5:Position (0, 0.5, 0),把立方体移动到地平面的表面以上。2.通过在Y旋转值中输入20:Rotation(0, 20, 0),让立方体绕着Y轴稍微旋转一点。注意,其旋转的方向是顺时针20°。拿出左手,比划一个竖起大拇指的手势,看看其余四个手指指向什么方向?Unity使用左手坐标系统(对于左手还是右手系统并没有标准,有些软件是左手坐标系统,有些是右手坐标系统)。Unity使用左手坐标系统,y轴向上。2.2.3添加球体和材质接下来,我们添加一个球体。从菜单中选择 GameObject | 3D Object | Sphere。像那个立方体一样,球体的半径是1.0,原点也在几何中心。(如果有必要的话可以通过点击Inspector面板中Transform组件右上角的齿轮图标选择Reset来设置默认值)。很难看到这个球体,因为它被嵌入在立方体中,我们需要移动球体的位置。这次,我们使用Scene面板的Gizmos组件移动这个球体,在Scene视图中,你可以选择使用图形化的控制方式或gizmos来改变球体的变换值,如下图所示,来自于Unity文档(http://docs.unity3d.com/Manual/PositioningGameObjects.html):
在Scene面板中,选中球体,确认Translate工具处于激活状态(左上方工具栏的图标栏中的第二个图标),使用x轴、y轴、z轴箭头来移动它,我把位置变成了(1.6,0.75,-1.75)。gizmo是一个图形化控件,用于操作某个对象或视图的参数。Gizmos中有拖拽点或操作点,可以用鼠标点击和拖动。在继续下一步之前,先按如下操作保存之前的操作:1.在主菜单中,选择File | Save Scene然后将其命名为Diorama。2.然后,选择File | Save Project,注意在Project面板中,新的场景对象已经被保存在Assets文件夹的根目录中。我们再制作一些有颜色的纹理,把纹理应用到物体上,来给场景上点颜色,步骤如下:
在Project面板中,选择Assets文件夹的根目录,再选择Create | Folder,重命名文件夹为Materials。2.选中Materials文件夹,再选择Create | Material,重命名为Red。3.在Inspector面板中,点击Albedo右边的白色矩形会打开一个Color面板,选择一种好看的红色。4.再用同样的操作制作一个蓝色的材质。5.在Hierarchy(或Scene)面板中选中Sphere。6.将红色材质从Project面板拖进Inspector面板作为球体的材质。球体将会变红。7.在Hierarchy(或Scene)面板中选中Cube。8.这次,将蓝色材质从Project面板拖进场景中作为立方体的材质,球体将会变蓝。保存场景,并且保存项目。下面是场景现在的样子(和你制作的可能不太一样,不过无所谓):
注意,我们使用的文件夹在Project/Assets/目录下,用来存放我们的材料。2.2.4改变场景视图你可以随时用各种方式改变场景视图,这取决于你的触摸板是3个键的还是2个键的,抑或只有1个键的Mac。好好看一下Unity手册,可以在 http://docs.unity3d.com/Manual/SceneViewNavigation.html 这个链接找到你需要的文档。一般来说,鼠标左或右键与Shift、Ctrl、Alt键的组合可以执行以下操作:拖动摄像机。让摄像机绕着当前中心点旋转。放大和缩小。Alt + 鼠标右键可以上、下、左、右旋转当前的视角。当选中Hand工具(在图标栏的左上方)时,鼠标右键移动视野,鼠标中键也一样。在Scene面板的右上方是Scene View 小部件,把场景视图的朝向描绘成下图这样,表示的是:比如在Perspective视图中,X轴延伸至左边,Z轴延伸至右边。
可以通过点击相应的色锥来改变视图的方向,使我们可以直接正面观察任意一个轴。点击中间的小立方体可以将Perspective视图变成Orthographic(无变形)视图,如下图所示:
在继续下一步之前,我们先把场景视图与Main Camera的方向对齐。你可能会想起我说过的默认摄像机朝向:(0, 0, 0),是向下看Z轴的正方向(从后向前)。步骤如下:1.点击Scene视图小部件中的红色X锥,把视图从Back(后向)调整为前向。2.再使用手形工具(或者鼠标中键)慢慢滑动视图。现在,当选择Main Camera组件(在Hierarchy面板中)时,可以看到Scene视图大致上与Camera Preview朝向相同。(参考下一节的屏幕截图,在我们添加照片之后可以看到场景与预览看起来差不多)。2.2.5添加照片现在,我们添加一张照片作为我们透视图的背景。在计算机图形学中,映射到物体上的图片叫作纹理。当物体在世界坐标系中以X,Y,Z表示时,纹理以U,V坐标表示(与像素一样)。我们会发现纹理和UV贴图存在缩放的问题,步骤如下:1.通过菜单GameObject | 3D Object | Plane创建一个平面,命名为PhotoPlane。2.重置这个平面的变换值。在Inspector面板中,找到Transform面板右上方的齿轮,点击图标选择Reset。3.绕着Z轴旋转90°(把Transform组件的Rotation的Z值设置成-90)。这是负90,所以它是竖直的,垂直于地平面。4.顺着Y轴方向旋转90°,这样它就面向我们了。5.将其移动到地平面的最后面,使其Position的Z=5,Y=5(想想地平面的10×10个单位)。6.使用Windows资源管理器或Mac的Finder选择任意一张计算机中的图片,粘贴到这个PhotoPlane上。(也可以用本书中的Grand Canyon.png图片。)7.在Project面板中,选择Assets文件夹的根目录,选择菜单中的Create | Folder,重命名为Textures。8.拖动图片文件到Assets/Materials文件夹中,它应该会自动以纹理对象导入。或者,也可以在Assets文件夹上点击鼠标右键,选择 Import New Asset...导入图片。选择Project面板中的图片Textures,在Inspector面板中检查其设置,如果原图为矩形,纹理会变成正方形的(比如2 048×2 048),看起来像压扁了。当把它映射到正方形的面上时也会变扁,步骤如下:1.从Project面板中拖动图片到photo plane(Scene面板中)上。哎呀!我这张图片向侧面旋转了。(你的呢?)2.选中PhotoPlane,把Transform组件的Rotation的X值设置成90°。好了,它现在竖直了,但还是扁的。我们来修复它。检查图片的原始分辨率,看它的宽高比,我的Grand Canyon图片是2 576×1 932,当你用高除宽时,为0.75。
在Unity中,设置PhotoPlane的Transform组件Scale的Z值为0.75。把Position的Y值设置为3.75。为什么是3.75?高是从10开始的。所以,我们缩放到7.5。物体的缩放比与其原始大小有关。所以,高的一半是3.75。我们想让photo plane的中心点在地平面以上3.75个单位。我们已经设置了大小和位置,但是图片看起来褪色了,这是因为场景中模糊的光影响了它。你可能想保持这种效果,尤其是当你建构复杂的光照模型和材质时,但是现在,我们要把光去掉。选中PhotoPlane,注意照片的Texture组件在Inspector面板中有默认的Shader组件的Standard,将它改成Unlit | Texture。现在我的看起来是这样了,你的应该也差不多:
看起来还不错吧,记得保存场景和项目。2.2.6给地平面着色如果想改变地平面的颜色,可以创建一个新的材质(在Project面板中),命名为Ground并拖到地平面上。然后,改变其Albedo色。建议使用滴管(图标)从photo plane中拾取一种土色。