由misslivirose在2016年10月4日发布
由于360度视频和计算机生成的交互内容之间的界限很模糊,我发现自己经常被问的一件事就是——怎样在一个unity的场景中添加一个360度的视频回放。这个快速教程将通过一个便捷方式在unity游戏引擎中向场景里添加360度的、2D视频内容(例如:这种类型的视频由Gear 360或者Ricoh Theta camera理光360度全景摄像数码相机摄制)
准备视频文件
Unity通过引用Movie Texture 类支持视屏回放,并且允许你通过QuickTime去导入文件类型为 .mov, .mpg, .mpeg, .mp4, .avi, and .asf的文件。如果你还没有安装,你可以在窗口中获取QuickTime 来导入你的360度视频文件至你项目的Assets文件夹。我使用一个我在Gear 360中拍摄并上传到YouTube的简单视频,这个视频以 .mp4的文件类型在我的S6 Edge手机上的Gear 360 app上被缝合。你也想使用视频编辑工具来水平镜像你的视频片段,就像我们的shader会翻转视频那样,这是一个最简单的解决方案。当你有了你的缝合视频片段,是unity支持的视频文件格式,并且已经被镜像了,你就可以通过using Assets > Import New Asset将视频导入你的unity工程。
创建我们播放视频的球体
创建视频球体需要三个步骤,为了能够支持视频播放我们需要将他们组合起来。默认情况下,unity将指派我们的视频作为一个Movie Texture object,所以我们不需要在这里做任何特殊的事情。我需要做的事情是: 1、创建一个球体环绕我们的相机,这个球体将作为我们视频播放的表面。 2、为我们的 movie texture创建一个新的材质,使用自定义shader来改变球体内部视频的播放。 3、为球体写一个脚本来播放movie texture。
当你创建球体,给它一个较大的scale (我使用的是20,20,20)再放置它,便于中心点始终是我们的相机。如果你现在运行你的应用,你会发现unity在默认状态下不会渲染球体的内表面,我们需要在我们创建的新材质上通过修改它的shader来解决这个问题。
在Assets 文件夹里,我们右击并且创建新文件夹:
1、Assets > Create > Shader > Standard Surface Shader,命名为“InvertNorm” 2、Assets > Create > C# Script, 命名为“PlayVideo.cs” 3、Assets > Create > Material, 命名为“VideoMat”
双击InvertNorm shader文件在你的脚本编辑器里打开它(我使用的是Visual Studio编辑器,在这里是可以免费获取的)然后用这个代码来代替它: - Shader "Flip Normals" {
- Properties{
- _MainTex("Base (RGB)", 2D) = "white" {}
- }
- SubShader{
-
- Tags{ "RenderType" = "Opaque" }
-
- Cull Front
-
- CGPROGRAM
-
- #pragma surface surf Lambert vertex:vert
- sampler2D _MainTex;
-
- struct Input {
- float2 uv_MainTex;
- float4 color : COLOR;
- };
-
-
- void vert(inout appdata_full v)
- {
- v.normal.xyz = v.normal * -1;
- }
-
- void surf(Input IN, inout SurfaceOutput o) {
- fixed3 result = tex2D(_MainTex, IN.uv_MainTex);
- o.Albedo = result.rgb;
- o.Alpha = 1;
- }
-
- ENDCG
-
- }
-
- Fallback "Diffuse"
- }
点击此处复制文本至于3D模型,一个材质的默认行为是会把它放置在mesh物体的外部渲染,这将取决于物体的法线贴图—— 垂直方向上的平面几何结构。关于以上的脚本我们要做的就是告诉物体我们想要反转那些法线,便于代替外表面,与我们的几何结构相反,texture 应该朝向内部。
保存我们的shader文件,然后双击PlayVideo.cs 来打开脚本。通常带有video texture的视频会自动播放,但当我们添加我们的自定义shader在材质上后,它将重载这部分,我们还需要触发我们视频的自动播放。将下面两条代码添加进PlayVideo.cs脚本中,使它看起来像这样:
- using UnityEngine;
- using System.Collections;
-
- public class PlayVideoOnLoad : MonoBehaviour {
- public MovieTexture _movie;
- // Use this for initialization
- void Start () {
- _movie.Play();
- }
-
- // Update is called once per frame
- void Update () {
-
- }
- }
点击此处复制文本这将使我们的视频自动播放,你还可以随时调用_movie.Play() ,例如你在应用场景中与一个特殊物体进行交互时。既然这样,我们还需要指定我们在检视面板中要播放什么视频内容。
保存你的脚本文件,然后回到unity。在Asset菜单中,选择VideoMat 并且在检视面板中进行如下设置:
1、将shader从 顶部的Standard (Specular) 改为InvertNorm 2、将视频文件拖拽至Base (RGB) texture 属性点。
将你的视频材质拖拽到球体上。你应该能在内表面看见正如你所期望的360度视频视图!通过拖拽在球体上添加PlayVideo 脚本并且在unity中播放视频。你的视频播放应该自动开始并且在场景中环绕在你周围。
在场景中四处查看和与物品进行交互的能力将依赖于你的main camera物体,所以我继续在demo中使用略微修改的FPS角色控制器,但是你可以用你选择的任何相机来重现这个画面。
资源
原文作者:misslivirose |