使用Three.js + Blender构建在浏览器端显示的3D模型(4)

http://www.cnblogs.com/rsail/archive/2012/10/16/2725513.html


 第四章 使用three.js加载以图片为纹理的模型(上)

在前言中我们介绍过,我们一般不用three.js自带的三维模型创建函数去拼凑我们想要的三维模型,而是使用类似Blender一样的三维建模工具去定制三维模型,然后导出为three.js可以识别的jason格式,加载显示。通过这种方式,我们可以构建较为原始的三维模型在浏览器端显示,比如我们前面看到的马克杯模型。如果单纯依靠三维建模去逼近现实世界中的形体外观是很难的,细节的修缮将给3D建模带来巨大的工作量,同时也会导致模型的加载器计算量巨大,不仅对人还是机器都是巨大的挑战。

好在我们可以另辟蹊径,不去追求模型的精细度,而在模型的纹理上做文章,尤其当我们用真实物体的照片作为模型纹理的时候,3D模型的效果立刻就得到了极大的提高,比如这个箱体模型:

如果不考虑外表图片纹理,它只是一个简单的立方体模型。加上纹理之后,几乎和我们在一些制作精良的3D游戏中见到的箱体所差无几了。下面我们来分析它的代码:

复制代码
 1 //兼容各种浏览器的animation函数
 2 window.requestAnimFrame = (function(callback){
 3     return window.requestAnimationFrame ||
 4     window.webkitRequestAnimationFrame ||
 5     window.mozRequestAnimationFrame ||
 6     window.oRequestAnimationFrame ||
 7     window.msRequestAnimationFrame ||
 8     function(callback){
 9         window.setTimeout(callback, 1000 / 60);
10     };
11 })();
12 
13 // 实现旋转的动画函数
14 function animate(lastTime, angularSpeed, three){
15     // 动画更新时以时间为基准
16     var date = new Date();
17     var time = date.getTime();
18     var timeDiff = time - lastTime;
19     // 角度以弧度为单位
20     var angleChange = angularSpeed * timeDiff * 2 * Math.PI / 1000;
21     three.cube.rotation.y += angleChange;
22     lastTime = time;
23 
24     // 重新渲染
25     three.renderer.render(three.scene, three.camera);
26 
27     // 角度参数在第一次调用时设定
28     requestAnimFrame(function(){
29         animate(lastTime, angularSpeed, three);
30     });
31 }
32 
33 window.onload = function(){
34     var angularSpeed = 0.2;
35     var lastTime = 0;
36 
37     // 渲染器
38     var renderer = new THREE.WebGLRenderer();
39     renderer.setSize(window.innerWidth, window.innerHeight);
40     document.body.appendChild(renderer.domElement);
41 
42     // 摄像机
43     var camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 1, 1000);
44     camera.position.z = 700;
45 
46     // 场景
47     var scene = new THREE.Scene();
48 
49     // 以图片为纹理的材质,这是关键点
50     var material = new THREE.MeshLambertMaterial({
51         map: THREE.ImageUtils.loadTexture("crate.jpg")
52     });
53 
54     // 立方体模型
55     var cube = new THREE.Mesh(new THREE.CubeGeometry(300, 300, 300), material);
56     cube.overdraw = true;
57     scene.add(cube);
58 
59     // 加入环境光
60     var ambientLight = new THREE.AmbientLight(0x555555);
61     scene.add(ambientLight);
62 
63     // 加入方向光
64     var directionalLight = new THREE.DirectionalLight(0xffffff);
65     directionalLight.position.set(1, 1, 1).normalize();
66     scene.add(directionalLight);
67 
68     // 把以上创建3D模型的要素都包装成一个对象
69     var three = {
70         renderer: renderer,
71         camera: camera,
72         scene: scene,
73         cube: cube
74     };
75 
76     // 使用onload回调函数启动动画,这样能保证图片被完全加载后才开始旋转 
77     var textureImg = new Image();
78     textureImg.onload = function(){
79         animate(lastTime, angularSpeed, three, this);
80     };
81     textureImg.src = "crate.jpg";
82 };
复制代码

与之对应的html代码如下:

复制代码
 1 <!DOCTYPE HTML>
 2 <html lang="en">
 3     <head>
 4         <style>
 5             body {
 6                 margin: 0px;
 7                 overflow: hidden;
 8             }
 9         </style>
10     </head>
11     <body>
12         <script src="http://mrdoob.github.com/three.js/build/three.min.js"></script>
13         <script src="LoadCrate.js"></script>
14     </body>
15 </html>
复制代码

这个纹理图片可以在这里下载:http://www.html5canvastutorials.com/demos/webgl/html5_canvas_webgl_texture/crate.jpg

这篇文章也参考自:http://www.html5canvastutorials.com/webgl/html5-canvas-webgl-texture-with-three-js/

作为一个系列中的一篇,相信这篇文章能够让初学者有效的向前推进一步,迈向three.js自由应用的大门!

在下一篇里,我们将分析如何给一个用Blender制作的,较为复杂的模型贴图显示在浏览器端。

 另外,实践中我们发现,可以使用Chrome浏览器加载本地的WebGL模型中的素材,只需要在启动Chrome的时候加上一下参数:--allow-file-access-from-files --disable-web-security

或许只加--allow-file-access-from-files就足够了。方法如下图所示:

这样以来我们就可以随意选择自己偏爱的浏览器去调试three.js程序了。


说明文件 程序名:Web Page Blender(网页搅拌机) 功能:将网页进行搅拌 创意开始:2002/4/25 制作日期:2002/4/25 创作意图:本人刚刚开始学习ASP,但在ASP和HTML之间由于不能进行过多的跳转,因此将 HTML代码转换为ASP代码,如: <;;;table width=";;;750";;; border=";;;0";;; cellspacing=";;;0";;; cellpadding=";;;0";;; align=center>;;; <;;;tr bgcolor=";;;#CBCAD2";;;>;;; <;;;td height=";;;68";;;>;;; <;;;div align=";;;center";;;>;;;<;;;font size=";;;6";;;>;;;<;;;b>;;;<;;;font color=";;;#003399";;;>;;;数 据 查 询<;;;/font>;;;<;;;/b>;;;<;;;/font>;;;<;;;/div>;;; <;;;/td>;;; <;;;/tr>;;; <;;;/table>;;; 以上代码先进行替换,";;;替换为";;; & chr(49) & ";;; 再添加前缀s=s & ";;;和后缀";;; 转换后代码如下: s=s & ";;;<;;;table width=";;; & chr(49) & ";;;750";;; & chr(49) & ";;; border=";;; & chr(49) & ";;;0";;; & chr(49) & ";;; cellspacing=";;; & chr(49) & ";;;0";;; & chr(49) & ";;; cellpadding=";;; & chr(49) & ";;;0";;; & chr(49) & ";;; align=center>;;;";;; s=s & ";;; <;;;tr bgcolor=";;; & chr(49) & ";;;#CBCAD2";;; & chr(49) & ";;;>;;;";;; s=s & ";;; <;;;td height=";;; & chr(49) & ";;;68";;; & chr(49) & ";;;>;;;";;; s=s & ";;; <;;;div align=";;; & chr(49) & ";;;center";;; & chr(49) & ";;;>;;;<;;;font size=";;; & chr(49) & ";;;6";;; & chr(49) & ";;;>;;;<;;;b>;;;<;;;font color=";;; & chr(49) & ";;;#003399";;; & chr(49) & ";;;>;;;数 据 查 询<;;;/font>;;;<;;;/b>;;;<;;;/font>;;;<;;;/div>;;;";;; s=s & ";;; <;;;/td>;;;";;; s=s & ";;; <;;;/tr>;;;";;; s=s & ";;;<;;;/table>;;;";;; 其他说明:当然,以上仅举一例说明; 充分发挥你的想像力,把网页“搅”熟 历史记录: 2002/4/25: 1.0版,实现“格式化”的基本功能 2002/4/26: 1.1版,实现“国际版”功能(语言包在language目录下) 只要你愿意,你可以将他变成任意语言版本了 更改替换字符串列表功能:打开language目录下的语言包文件,编辑200到299之间的字串,OK! 联系作者:ameiemail@chinaren.com 凌丽软件: 《内存清洁机》1.4版 功能:清除内存中的程序 1.使内存清洁机总在最上层: 选择“上层(&T)”; 2.过滤系统的程序: 选择“过滤(&F)”; 3.强制关闭应用程序: 在右边的列表框选择应用程序,点击“关闭程序(&C)”; 4.显示/隐藏应用程序: 如上; 5.将应用程序显示在最上层/恢复: 如上; 6.显示可用内存; 7.显示“******”部分的密码: 用鼠标移到“******”上,在右下脚显示。 8.隐藏桌面: 用隐藏方式把“Program Manager”隐藏; 9.隐藏任务条: 用隐藏方式把“任务条”隐藏(在Win2000下会自动恢复); 10.自动追踪: 用鼠标指向一个窗体,列表自动追踪的该窗体; 历史记录 本程序使用 Object Pascal 编写 使用Delphi Build 5.62编译。 1.0 2001年2月 完成基本功能,根据本人写的VB版本移植而来(在功能上有削减)。 1.01 2002年1月 进一步完善,增加了显示“可用内存”、“上层显示”和查看“密码框内容”。 1.1 2002年4月8日 改善了上层显示的效率,直接使用API; 修改自动刷新的BUG; 1.2 2002年4月13日 增加“托盘”功能; 自动保存配置; 1.3 2002年4月13日 增加在启动菜单加入快捷方式; 增加自动追踪功能。 1.4 2002年4月16 增加自动缩到系统栏功能。 文件分析类(Class): 分析文本所有的邮件地址或URL,搜索智能超过市场的邮件群发软件。 WinRoute 日志分析器(软件): 网管好帮手,1.1版 在一个大的公司,为了管理方便和安全性,往往会使用代理上网,WinRoute 是一个 集成路由和防火墙的代理服务器,使用范围非常广泛,但是为了统计一下所列的各种 数据确不是很方便,为此编制本程序,让大家很好的掌握通过代理服务器上网的情况 ,为公司的管理带来便捷。 1.每日通过代理上网的计算机 2.每个计算机访问了多少网站 3.流量分析 4.网站的欢迎度 5.列出未经允许的计算机 6.使用用户词典,个性化配置
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值