我们介绍了使用360转录技术制作无模型场景。你或许想问,真实拍摄的360照片或影片能和3D物体互动吗?答案是可以的,本文将由Unity技术经理罗志达为大家介绍,如何在360的场景中制作和3D物体的互动。

360视频的原理
一般来说,使用真实相机所拍摄出来的照片,只要在Unity中贴到圆球上,从球体的中心往外看时就会还原拍摄时的场景,这也是一般地图App里街景功能的原理。

181207acdrnhrcdndlgdnc.jpg
181207saa100z4b1wvvziw.jpg
360全景在Unity里实现的原理

因此想要还原整个物理结构,我们可以从地板重建开始。如果你知道当初的拍摄高度,一般来说就是你的身高减半个头左右。当初拍摄的位置作为0,0,0的话,往下算这个高度并放一个地板就能重建出一个虚拟地板。下面的示例是放在-1.7的位置。

181209wj7kjst1955z5i5s.jpg
虚拟地板建立

把这个地板的Mesh renderer网格渲染器关闭只剩下Collider,并放上一个主角,你就会发现地板的位置似乎对了,但主角会不受控制的走到不对的位置。

181209thk5e5ceq8j4h4fc.jpg
放上地板后的样子

遮罩功能
为了做到有遮罩的功能,我们可以把这张全景图,使用Photoshop处理几个遮罩,如下图所示。
181209c4ic6h2ugwei2115.jpg
遮罩

将这些遮罩图片分别放到不同的球体上,记住中心都必须是0,0,0。这颗球的Scale会影响到角色被遮罩的深度,所以我们可以从Runtime运行时,把角色走到该地点并调整球的大小来符合遮罩的位置需求。

你可以叠上非常多图层来模拟很多不同的遮罩距离。这些遮罩的图片都是带有Alpha的图片制作很简单,如果你想用Chroma key的方式,也可以参考上一篇文章的方法。

181210b2wzx2livsft527l.jpg
遮罩的图片

实际上当同一张图片被叠在同一个位置时,就算是深度不同,渲染之后也是没有分别的,因此你可以因按照需求来制作非常多的图层,或者使用Shader的Rneder Queue来处理渲染的前后顺序。

181210lktaci7884tl6tda.jpg
181212tcozhf8l5i3j6n7f.jpg
遮罩原理

制作碰撞结构
制作碰撞结构有二个规则需要遵守。

首先必须在当初拍摄的位置来编辑和修改。点选Main Camera之后在选功能表单的GameObject->Align View to Selected,就可以把Scene View切换到镜头的原点,也就是0,0,0。此时可以点击鼠标右键来旋转视角,但绝对不能移动镜头。

181212b2gc14c8chzcz2pz.jpg
Align View to Selected的位置

第二个规则是新增的碰撞体Y的值必须计算。由于在360照片内放置3D物体,并没有办法有实际的坐标来对齐位置,如果在制作周期中,没有把环境全都测量好,我们必须用目测的方式来重建碰撞结构。

我们只知道地板位于Y -1.7,而Unity的坐标是以物体中心为主,因此我们可以新增一个Cube,这个Cube的高度是1,因此我们把它的一半与地板坐标相加就是-1.2 作为它的Y值,这样就相当于Cube会完全的贴合在地板上,这等同加上一个Rigidbody组件,让它贴齐地板是一样的。

181213mls3x9xq3lhls9hf.jpg
建立碰撞体的注意事项

181214wkuyh1l91mmz19lt.jpg
放置Collider的方法

一旦全部的高台使用这种目测的方法,制作出对应的碰撞体之后,相当于某种程度还原现场的碰撞结构,对于一开始忘了测量环境信息的开发流程,算是还有补救的余地。

181214anrj4njbno7etorn.jpg
还原的场景

阴影制作
阴影的制作和光照的反应制作和Pre-Bake 360如何使用360转录技术制作无模型场景的方法是相同的。

我们可以放一片网格在脚上跟着主角,阴影会产生在这片临时地板上,再透过Shader把阴影以外的部分去除掉,调低光源的强度让阴影带有一点半透明,就会产生不错的影子效果。

181215a7r7gz04krxmmmm1.jpg
阴影的制作

小结
针对360与3D物体互动的内容还有很多空间能够发掘,我们会在未来整理更多有用方法分享给大家! 更多Unity的技术文章分享尽在Unity官方中文论坛(UnityChina.cn) !
360, Unity, 碰撞锐亚教育

锐亚教育 锐亚科技 unity unity教程