全景图(二):在Unity3D上实现360°柱面投影

在全景图(一):使用Unity完成水晶球纹理贴图 建立的工程基础之上,做修改。


步骤:

1、把上次创建好的水晶球移走,放到一个不妨碍观察的地方。

2、创建一个圆柱体,位置设为(0,1.5,0),比例设为(2,0,5,2)。
注:比例的设置和作为纹理映射的图像的宽高比有关,Unity中默认的圆柱体是2个单位高度以及1个单位宽度。

3、在圆柱体的Inspector面板中禁用Capsule Collider组件。

4、将图片作为纹理,拖到圆柱体上。

5、在圆柱体的Inspector面板中,第4步导入的纹理材质组件上,点击菜单Shader|Custom|InwardShader。

注:这个渲染器就是让纹理渲染在其内表面,需要自己定制,写入一个渲染定义文件。这个文件在后面给出。

6、将绑定相机的空对象放置在圆柱体内,并旋转圆柱体观察不同方向视野。


渲染器定义文件

InwardShader.shader:

Shader "Custom/InwardShader" {
  Properties {
    _MainTex ("Albedo (RGB)", 2D) = "white" {}
  }
  SubShader {
    Tags { "RenderType"="Opaque" }
    LOD 200
    
    Cull Front

    CGPROGRAM
    #pragma surface surf Standard vertex:vert

    void vert(inout appdata_full v) {
      v.normal.xyz = v.normal * -1;
    }

    sampler2D _MainTex;

    struct Input {
      float2 uv_MainTex;
    };

    void surf (Input IN, inout SurfaceOutputStandard o) {
      fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
      o.Albedo = c.rgb;
    }
    ENDCG
  } 
  FallBack "Diffuse"
}

Unity shader是一个文本脚本文件,包含一些Unity渲染流水线动作的指令。我们自定义的shader命名为InwardShader。

它有一个Property面板—Albedo纹理可以在Unity的编辑器中设置。

我们把Cull模式设置成Font(选项有Back,Font和Off);单词cull的意思是“需要被移除或忽略”。这样,它将忽略前方表面的渲染。

我们还要反转每个面的法向量(v.normal.xyz=v.normal*-1)用于光照计算。

surf()采样函数由Unity的渲染器调用,应用shader中定义的属性,在这里是仅有的主要纹理图片。


给圆柱体添加旋转脚本

跟上个博客中水晶球添加旋转控制如出一辙,旋转脚本是一样的。


准备好的作为纹理的图像

这里写图片描述


全景效果

全景图(二):在Unity3D上实现360°柱面投影_第1张图片

全景图(二):在Unity3D上实现360°柱面投影_第2张图片


其它示例

全景图(二):在Unity3D上实现360°柱面投影_第3张图片
注:提供的图像并未覆盖360°,所以圆柱体表面有一条纵线。

全景图(二):在Unity3D上实现360°柱面投影_第4张图片

你可能感兴趣的:(图像处理与机器视觉,图像拼接)