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 相关文章推荐
java script编程起步(第三课)
Jan 10 Javascript
ASP.NET jQuery 实例7 通过jQuery来获取DropDownList的Text/Value属性值
Feb 03 Javascript
影响jQuery使用的14个方面
Sep 01 Javascript
举例讲解Node.js中的Writable对象
Jul 29 Javascript
jQuery实现分隔条左右拖动功能
Nov 21 Javascript
javascript读取文本节点方法小结
Dec 15 Javascript
详解node-ccap模块生成captcha验证码
Jul 01 Javascript
自定义类似于jQuery UI Selectable 的Vue指令v-selectable
Aug 23 jQuery
vue2 router 动态传参,多个参数的实例
Nov 10 Javascript
JavaScript EventEmitter 背后的秘密 完整版
Mar 29 Javascript
jQuery选择器之基本选择器用法实例分析
Feb 19 jQuery
原生JS实现分页
Apr 19 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
php array_pop()数组函数将数组最后一个单元弹出(出栈)
2011/07/12 PHP
php 字符串中的\n换行符无效、不能换行的解决方法
2014/04/02 PHP
php实现在服务器端调整图片大小的方法
2015/06/16 PHP
laravel框架模型中非静态方法也能静态调用的原理分析
2019/11/23 PHP
聊聊 PHP 8 新特性 Attributes
2020/08/19 PHP
关于IE中getElementsByClassName不能用的问题解决方法
2013/08/26 Javascript
JS清空多文本框、文本域示例代码
2014/02/24 Javascript
SuperSlide标签切换、焦点图多种组合插件
2015/03/14 Javascript
javascript高级编程之函数表达式 递归和闭包函数
2015/11/29 Javascript
浅述Javascript的外部对象
2016/12/07 Javascript
详解js中Number()、parseInt()和parseFloat()的区别
2016/12/20 Javascript
微信小程序获取用户openId的实现方法
2017/05/23 Javascript
Three.js利用性能插件stats实现性能监听的方法
2017/09/25 Javascript
Vue多种方法实现表头和首列固定的示例代码
2018/02/02 Javascript
微信小程序转发事件实现解析
2019/10/22 Javascript
微信小程序scroll-view锚点链接滚动跳转功能
2019/12/12 Javascript
Openlayers实现图形绘制
2020/09/28 Javascript
JavaScript实现网页计算器功能
2020/10/29 Javascript
[31:33]2014 DOTA2国际邀请赛中国区预选赛 TongFu VS DT 第一场
2014/05/23 DOTA
python 布尔操作实现代码
2013/03/23 Python
python将excel转换为csv的代码方法总结
2019/07/03 Python
django写用户登录判定并跳转制定页面的实例
2019/08/21 Python
python 使用while写猜年龄小游戏过程解析
2019/10/07 Python
Python环境配置实现pip加速过程解析
2020/11/27 Python
HTML5: Web 标准最巨大的飞跃
2008/10/17 HTML / CSS
MADE法国:提供原创设计师家具
2018/09/18 全球购物
电大本科自我鉴定
2014/02/05 职场文书
就业推荐表自我鉴定范文
2014/03/21 职场文书
毕业生应聘求职信
2014/07/10 职场文书
关于感恩的演讲稿500字
2014/08/26 职场文书
红领巾广播站广播稿(3篇)
2014/09/20 职场文书
2014年药房工作总结
2014/11/22 职场文书
欠条格式范本
2015/07/03 职场文书
团组织关系介绍信
2019/06/24 职场文书
MySQL优化常用的19种有效方法(推荐!)
2022/03/17 MySQL
MySql按时,天,周,月进行数据统计
2022/08/14 MySQL