3D电影的原理

今天要在unity中借用steamVR观赏3D电影,之前没有留意过3D电影相关,完全没有思路,于是先百度了一下3D电影的原理.

很久之前看过几次3D电影,那时候比较新奇,当时中途摘下过红蓝色的3D眼镜,屏幕大概是这个效果,发虚的感觉.
现在我们知道,实际上有两台放映机以一定的偏差,模仿人的双眼,把同一片源播放了两次,而3D眼镜的作用就是让左眼看其中一个影像,右眼看另外一个影像,最终我们的大脑会帮我们自动合成3D效果.

我们就以这个原理为核心,实现Unity中用VR看3D电影

实现过程

首先我们先来看看3D电影的源文件是什么样子的.

可见这部电影的片源已经有两份了,不需要我们想办法做出人眼的偏差.
但是和我们在电影院看过的3D电影好像还有些不一样.
应该是把两份片源分别拉伸到整个屏幕那么大,重叠在一起才会有发虚的效果.
于是我们先写个shader把片源拆成两份

Shader "Custom/SpitScreen" {Properties{_MainTex("MainText", 2D) = "white" {}//主贴图_SpitPercentX("SpitPercentX",Range(0,1)) = 1//水平方向切割后保留的比例_SpitPercentY("SpitPercentY",Range(0,1)) = 1//垂直方向切割后保留的比例_SpitOffsetX("SpitOffsetX",Range(0,1)) = 0//水平方向裁剪区的偏移量_SpitOffsetY("SpitOffsetY",Range(0,1)) = 0//垂直方向裁剪区的偏移量}SubShader{LOD 200Tags{ "RenderType" = "Opaque" }CGPROGRAM#pragma surface surf Lambertsampler2D _MainTex;fixed _SpitPercentX;fixed _SpitPercentY;fixed _SpitOffsetX;fixed _SpitOffsetY;struct Input {float2 uv_MainTex;};void surf(Input IN, inout SurfaceOutput o) {float2 uv = IN.uv_MainTex;fixed4 tex = tex2D(_MainTex, float2(uv.x*_SpitPercentX + _SpitOffsetX, uv.y*_SpitPercentY + _SpitOffsetY));//解析贴图o.Albedo = tex.rgb;//计算漫反射颜色}ENDCG}FallBack "Standard"
}



我们修改参数就可以取左边或者右边的一半.(写好之后发现表面着色器自带缩放和偏移,Tiling和offset的效果和上面的代码是完全一致的)


通过这个shader我们可以把片源的两个影像拆分出来了.


接下来我们创建两个material改变参数,让两块屏幕分别显示左半部分和右半部分,然后把两个屏幕的position改成一样的


为两块屏幕设置不同的层,名字随便取,目的是让相机分别过滤掉另一个屏幕,模仿3D眼镜的原理.左眼看不见右屏幕,右眼看不见左屏幕.
然后创建两个相机,分别对应左右眼,过滤掉另一块屏幕(我把MainCamera做成了右眼相机)


至此,3D电影就改造完毕了,steamVR的SDK会识别到标记为左右眼的相机,并且把相机渲染的图像输出给头盔的左右眼.
如何在Unity中播放一段视频不在本篇讨论范围内,我个人是使用了AVpro的插件来播放视频.
至于是什么效果.编辑器里是看不到了,需要一个VR头盔才行,个人觉得和在电影院看到的3D电影是同样的效果.
最后感叹一下,还是人类的大脑NB,自动合成3D影像

Unity VR中实现播放3D电影相关推荐

  1. 扫描自己进入VR中 SLAM Scan 3D引擎将做到

    扫描自己进入VR中 SLAM Scan 3D引擎将做到 2016-03-22 10:58:09我要纠错 把17173装进手机神评论0 只需要点击拍照就可以将你的脸上传到虚拟现实世界中 瑞士软件初创公司 ...

  2. linux ubuntu3d桌面,桌面应用|如何在 Ubuntu 中播放3D电影

    亲爱的 Linux 极客们, Q: 我下载了一部高品质 3D 电影,但是当我用 VLC 播放器播放的时候,画面被分割成两个部分,我可不想这样欣赏我的高清大片. 在本教程中你将会学习如何在 Ubuntu ...

  3. 如何在 Ubuntu 中播放3D电影

    亲爱的 Linux 极客们, Q: 我下载了一部高品质 3D 电影,但是当我用 VLC 播放器播放的时候,画面被分割成两个部分,我可不想这样欣赏我的高清大片. 在本教程中你将会学习如何在 Ubuntu ...

  4. 不用去电影院 3D电影格式/播放全攻略

    在立体3D应用中,3D电影是目前最为主流.普及程度最高的娱乐方式.立体3D做为一种正在发展中的技术,尚未统一的标准常常使得用户感到迷惑,究竟哪种格式更好?对设备的要求是什么?本文将针对3D电影的格式. ...

  5. 计算机3d影视的应用,浅析CG技术在3D电影场景设计中的应用

    [摘要] 3D电影的场景设计在造型手法.空间表现上和传统电影有着相当大的区别,这得益于计算机CG技术,能够创造出完全由计算机虚拟而传统手法无法获取的形象和镜头运动,实现了科学技术和艺术的完美结合.计算 ...

  6. [乐意黎原创] 左右格式的3D电影怎么播放

    播放左右分屏显示的影片时,此时影片是属于3D格式, 了解决"左右格式的3D电影怎么看"这个问题,我们需要先来说明一下什么是左右格式. 左右格式和上下格式只是3D立体电影的一种存储方 ...

  7. Unity VR游戏开发干货教程:VR中的交互方式

    原文:http://www.gameres.com/495107.html 在VR项目中,我们需要在用户"凝视"某个物体时将其激活.在VRSamples中,我们构建了一个简单的,可 ...

  8. unity vr是加一个摄像机就行吗_《狮子王》:引入VR虚拟制作技术的真人动画电影...

    迪士尼动画电影<狮子王>自2019年7月12日上映以来,排场几近爆满,深受影迷喜爱,目前三天多的票房总计已高达四亿.其实从去年11月23日爆出预告片以后,迪士尼动画粉的胃口就已经被吊了起来 ...

  9. 【Unity VR开发窍门】如何在Unity中以VR视角捕捉游戏360度全景

    [背景] 经常看到有VR游戏中玩家可以在虚拟场景中拍照的功能,所以打算做一篇系列帖子,主要介绍三个功能,第一个功能是如何在Unity VR项目中从玩家视角捕捉游戏全景,第二个功能是如何将这个捕捉到的全 ...

最新文章

  1. python二维列表排序
  2. 重磅 | 2017年深度学习优化算法研究亮点最新综述火热出炉
  3. c语言序列sequence,Sequence
  4. Junit实现接口类测试
  5. vue中设置子组件的点击事件不影响父组件的点击事件
  6. linux 进程崩溃 wait,Linux信号机制有关问题
  7. 四.Windows I/O模型之重叠IO(overlapped)模型
  8. Spring boot入门(三):集成AdminLTE(Freemarker),结合generate代码生成器,利用DataTable和PageHelper分页...
  9. 界面设计必备,常用字体规范
  10. [docker学习笔记] 0.工具/环境
  11. Windows 8 关闭无线后无法打开WIFI的解决办法
  12. 现代信号处理——自适应滤波器(匹配滤波器)
  13. CTPN - 自然场景文本检测
  14. 架构设计 例子和实践 系统设计说明书
  15. 通过银行卡号查询银行卡信息
  16. 用python做生信_1 python生信入门
  17. MTD/QTD/YTD 去年同期 同比增长——Power BI
  18. 数学建模-自来水管道铺设问题
  19. C语言学习:除去剪切板内容的换行与回车
  20. 关于appium踩坑 selenium.common.exceptions.WebDriverException: Message: An unknown server-side error(已解决)

热门文章

  1. HTML实现页面过渡
  2. 水声功率放大器应用:潜艇水下通信方式
  3. php 7.0 readfile_php readfile下载大文件失败的解决方法
  4. window Cassandra环境搭建
  5. 张驰课堂:老板会武术,谁也挡不住!六西格玛培训的魅力
  6. C语言简单数独游戏终盘生成
  7. [一种声音]胡适致毕业生:在不健全的中国,如何不堕落
  8. Python判断经纬度点是否在城市(以广州为例)
  9. 笔记本设置蓝牙唤醒_新手最易忽略!笔记本电源选项藏着啥秘密?
  10. Java反射面试总结(二)