THREE.JS入门教程(6)创建自己的全景图实现步骤


Posted in Javascript onJanuary 25, 2013

译序
Three.js是一个伟大的开源WebGL库,WebGL允许JavaScript操作GPU,在浏览器端实现真正意义的3D。但是目前这项技术还处在发展阶段,资料极为匮乏,爱好者学习基本要通过Demo源码和Three.js本身的源码来学习。
0.简介
全景图非常酷。使用Three.js做一个属于自己的全景图并不是那么困难。
要做一个全景图,你需要一个软件用来做一张全景图片(译者注:如果你没有那些特殊的设备)。我使用了iPhone上的Microsoft Photosynth软件来制作。
1.环境纹理
首先什么是环境纹理?在WebGL或者OpenGL中他们实际上是种特殊的立方体纹理。一个立方体纹理是对整个场景(虚拟的或现实的)的观察,场景的样子被“贴”在了立方体的内部表面。想象一下,你站在山顶,向前看,向左看,向右看,向上看,向下看,最后向后看。每一次你都看到了这个“立方体”的内部表面,你就站在这个立方体的中心。如果这个立方体足够大,就很难分辨出立方体的棱和角,而给你一种错觉:你处在一个很大的环境里面。如果你还没弄明白,那么维基百科上的cube maps条目会非常有帮助。
这很酷,但是这怎么用?我们可以像做反射和折射一样,而且事实上这两者的函数都已经内建在GLSL,WebGL的着色器语言上了。你只需要传递给着色器6张纹理图片,每张代表立方体的一个内表面,然后告诉WebGL这是个立方体纹理,然后就可以使用上面的效果了。
半轴:这个术语服务于立方体纹理。因为我们通常使用三个轴来描述三维空间:x轴、y轴、z轴,所以用于立方体纹理的图片也用轴的名称来标识了。一共六张图片,每个轴两张图片,正半轴一个,负半轴一个。
2.创建全景图片
创建全景图片的第一步就是走出户外,使用手机上的应用来照一张。我在伦敦的金融区转了一圈,然后在Gherkin照了一张。我获得了下面这张图片:
THREE.JS入门教程(6)创建自己的全景图实现步骤 
值得指出的是,这个应用将图片做成了贴到球体上的那种。这看上去不错,但是我们现在需要将它贴到一个立方体的内表面上,所以还要处理一下这张图。
3.转化到立方体上
这部分我简短介绍一下。我把刚才获得的那张照片载入到一个3D建模软件中,比如Maya或者Blender,然后将其粘贴到一个球体的内表面上。然后我创建了6个正射投影的相机,每一个都对应于一个半轴。最后我将这6个相机捕捉到的图像保存了下来。具体怎么完成比较复杂,也没必要在这里讲解,所以我写了一个Blender脚本文件,所有的一切都设置好了。

使用这个脚本文件你只需要
1.将你自己的全景图重命名为 environment.jpg;
2.将全景图和Blender脚本文件放在同一个文件夹下;
3.载入脚本文件;
4.点击右侧的 Animation 按钮;
5.等一会儿,6张图像已经创建好了。
很Cool吧?现在你可以重新命名这些图像,使之与每一个半轴相匹配。比如这样:
•0001.png → pos-z.png
•0002.png → neg-x.png
•0003.png → neg-z.png
•0004.png → pos-x.png
•0005.png → neg-y.png
•0006.png → pos-y.png
4.加入场景
现在我们已经获得了环境纹理,然后将其载入到场景中。Three.js使这变得非常简单:

// 纹理图像的url 
var urls = [ 
'path/to/pos-x.png', 
'path/to/neg-x.png', 
'path/to/pos-y.png', 
'path/to/neg-y.png', 
'path/to/pos-z.png', 
'path/to/neg-z.png' 
], 
// 打包成我们需要的对象 
cubemap = THREE.ImageUtils. 
loadTextureCube(urls); 
// 设置格式为RGB 
cubemap.format = THREE.RGBFormat;

现在只需要将cubemap指定到一个材质中去就可以了!
var material = new THREE 
.MeshLambertMaterial({ 
color: 0xffffff, 
envMap: cubemap 
});

5.小结
就这样了,实现一个全景图很酷,尤其是你可以将你自己的地方制作为WebGL全景图。和往常一样,我打包了这次教程的源码
Javascript 相关文章推荐
js/html光标定位的实现代码
Sep 23 Javascript
window.location.href的用法(动态输出跳转)
Aug 09 Javascript
Ionic如何创建APP项目
Jun 03 Javascript
AngularJS指令用法详解
Nov 02 Javascript
Vue单页面应用保证F5强刷不清空数据的解决方案
Jan 31 Javascript
Node.js中你不可不精的Stream(流)
Jun 08 Javascript
angularjs 的数据绑定实现原理
Jul 02 Javascript
webstrom Debug 调试vue项目的方法步骤
Jul 17 Javascript
React 实现拖拽功能的示例代码
Jan 06 Javascript
微信小程序Flex布局用法深入浅出分析
Apr 25 Javascript
详解微信小程序胶囊按钮返回|首页自定义导航栏功能
Jun 14 Javascript
js实现图片跟随鼠标移动效果
Oct 16 Javascript
使用JavaScript动态设置样式实现代码(2)
Jan 25 #Javascript
使用JavaScript动态设置样式实现代码及演示动画
Jan 25 #Javascript
jQuery获取Select选择的Text和Value(详细汇总)
Jan 25 #Javascript
javascript面向对象包装类Class封装类库剖析
Jan 24 #Javascript
js iframe跨域访问(同主域/非同主域)分别深入介绍
Jan 24 #Javascript
js中页面的重新加载(当前页面/上级页面)及frame或iframe元素引用介绍
Jan 24 #Javascript
ajax处理php返回json数据的实例代码
Jan 24 #Javascript
You might like
PHP4实际应用经验篇(9)
2006/10/09 PHP
用php实现的获取网页中的图片并保存到本地的代码
2010/01/05 PHP
用php的ob_start来生成静态页面的方法分析
2011/03/09 PHP
php微信开发之百度天气预报
2016/11/18 PHP
ThinkPHP删除栏目(实现批量删除栏目)
2017/06/21 PHP
PHP中rename()函数的妙用讲解
2019/02/28 PHP
10个实用的脚本代码工具
2010/05/04 Javascript
javascript 窗口加载蒙板 内嵌网页内容
2010/11/19 Javascript
cument.execCommand()用法深入理解
2012/12/04 Javascript
Javascript图像处理—为矩阵添加常用方法
2012/12/27 Javascript
javascript与jquery中跳出循环的区别总结
2013/11/04 Javascript
jquery 显示*天*时*分*秒实现时间计时器
2014/05/07 Javascript
jQuery中的jQuery()方法用法分析
2014/12/27 Javascript
javascript中indexOf技术详解
2015/05/07 Javascript
AngularJS入门教程之AngularJS表达式
2016/04/18 Javascript
vue.js实现用户评论、登录、注册、及修改信息功能
2020/05/30 Javascript
nodejs制作爬虫实现批量下载图片
2017/05/19 NodeJs
React Native react-navigation 导航使用详解
2017/12/01 Javascript
mpvue将vue项目转换为小程序
2018/09/30 Javascript
python执行子进程实现进程间通信的方法
2015/06/02 Python
pyenv命令管理多个Python版本
2017/03/26 Python
详解Python之数据序列化(json、pickle、shelve)
2017/03/30 Python
python实现pdf转换成word/txt纯文本文件
2018/06/07 Python
Python实现报警信息实时发送至邮箱功能(实例代码)
2019/11/11 Python
CSS3实现圆角、阴影、透明效果并兼容各大浏览器
2014/08/08 HTML / CSS
Html5实现如何在两个div元素之间拖放图像
2013/03/29 HTML / CSS
用HTML5实现鼠标滚轮事件放大缩小图片的功能
2015/06/25 HTML / CSS
专门经营化妆刷的美国彩妆品牌:Sigma Beauty
2017/09/11 全球购物
伦敦一家西班牙童装精品店:La Coqueta
2018/02/02 全球购物
高清安全摄像头系统:Lorex Technology
2018/07/20 全球购物
凌阳科技股份有限公司C++程序员面试题笔试题
2014/11/20 面试题
行政主管岗位职责
2013/11/18 职场文书
秋季运动会活动方案
2014/02/05 职场文书
2014年党课学习心得体会
2014/07/08 职场文书
学校工会工作总结2015
2015/05/19 职场文书
英语演讲开场白
2015/05/29 职场文书