前言

上一篇文章中介绍了如何响应鼠标和键盘事件,本文介绍如何加载三维对象并实现给三维对象添加一个漂亮的皮肤。

一、 原理分析

我对三维的理解为:所谓三维对象无非是多个二维对象拼接到一起,贴图就更简单了,就是将一张图片贴到对象上。so easy,那么我们就一步步来实现吧。

二、 创建立方体

2.1 立方体对象

这几天干个事,老是说数据立方体数据立方体,还是没有弄太懂什么是数据立方体,但是我完全可以弄个立方体啊。根据上面的分析知道三维与二维没有本质的区别,所以创建立方体同样是new一个Model对象,如下:

var cube = new PhiloGL.O3D.Model({
vertices: [-1, -1, 1,
1, -1, 1,
1, 1, 1,
-1, 1, 1, -1, -1, -1,
-1, 1, -1,
1, 1, -1,
1, -1, -1, -1, 1, -1,
-1, 1, 1,
1, 1, 1,
1, 1, -1, -1, -1, -1,
1, -1, -1,
1, -1, 1,
-1, -1, 1, 1, -1, -1,
1, 1, -1,
1, 1, 1,
1, -1, 1, -1, -1, -1,
-1, -1, 1,
-1, 1, 1,
-1, 1, -1], colors: [1, 0, 0, 1,
1, 0, 0, 1,
1, 0, 0, 1,
1, 0, 0, 1,
1, 1, 0, 1,
1, 1, 0, 1,
1, 1, 0, 1,
1, 1, 0, 1,
0, 1, 0, 1,
0, 1, 0, 1,
0, 1, 0, 1,
0, 1, 0, 1,
1, 0.5, 0.5, 1,
1, 0.5, 0.5, 1,
1, 0.5, 0.5, 1,
1, 0.5, 0.5, 1,
1, 0, 1, 1,
1, 0, 1, 1,
1, 0, 1, 1,
1, 0, 1, 1,
0, 0, 1, 1,
0, 0, 1, 1,
0, 0, 1, 1,
0, 0, 1, 1], indices: [0, 1, 2, 0, 2, 3,
4, 5, 6, 4, 6, 7,
8, 9, 10, 8, 10, 11,
12, 13, 14, 12, 14, 15,
16, 17, 18, 16, 18, 19,
20, 21, 22, 20, 22, 23]
});

在vertices中每三个数据构成一个点,每四个点构成一个平面,六个面拼接到一起即构成一个立方体。

colors同样如此,四个数据表达一个顶点的颜色,每四个颜色构成一个面的颜色,总共表达出了六个面的颜色。

indices我理解是顶点的序列,印象中在计算机图形学中面都是由三角形来表达的,WebGL也不例外,每个面都是由多个三角形拼接成的,长方形是由两个三角形拼成,此处的顶点序列就表达出了面的构成顺序,即三角形的拼接顺序,这个顺序不能出错,否则会造成面不完整。当然,我对这块也不是很熟悉,如果有更专业的解释,欢迎留言。

2.2 显示

有了cube对象之后下一步就是把它显示出来。之前文章中讲述的是通过gl.drawArrays的方式来加载对象,本文讲述另外一种方法。

首先将对象加载到场景中:

scene = app.scene;

scene.add(cube);

最后对此对象进行各种position、rotation之后将其在场景中显示出来。

scene.render();

与之前不同的是此处我们不需要再设置GLSL变量等,查看PhiloGL可知,其中已经包含了一个vs和fs,并且对其进行了自动设置,所以无需在外部再进行设置。

2.3 Cube对象

PhiloGL还写好了一系列的特殊对象类,如Cube、Sphere、IcoSphere、Cone、Cylinder、Plane等。

Cube的创建方法如下:

var cube = new PhiloGL.O3D.Cube({
colors: [1, 0, 0, 1,
1, 0, 0, 1,
1, 0, 0, 1,
1, 0, 0, 1,
1, 1, 0, 1,
1, 1, 0, 1,
1, 1, 0, 1,
1, 1, 0, 1,
0, 1, 0, 1,
0, 1, 0, 1,
0, 1, 0, 1,
0, 1, 0, 1,
1, 0.5, 0.5, 1,
1, 0.5, 0.5, 1,
1, 0.5, 0.5, 1,
1, 0.5, 0.5, 1,
1, 0, 1, 1,
1, 0, 1, 1,
1, 0, 1, 1,
1, 0, 1, 1,
0, 0, 1, 1,
0, 0, 1, 1,
0, 0, 1, 1,
0, 0, 1, 1]
});

此对象无需再设置vertices和indices,这些值已经在Cube中预定义好了,我们只需要设置其颜色即可。其调用等与之前定义的cube对象完全一致。

三、 贴图

3.1 为立方体添加贴图

我们直接为用Cube定义的cube对象添加贴图,其他的也基本一致。

首先,找到一副图片,没有要求,此处假设为nehe.gif。有了该图片之后即可开始添加贴图。

  • 修改cube创建代码

去除colors模块,添加textures模块

var cube = new PhiloGL.O3D.Cube({
textures: 'nehe.gif'
});
  • 修改PhiloGL创建代码

在其中添加textures模块,如下:

PhiloGL('test1', {
textures: {
src: ['nehe.gif']
},
onLoad: function (app) {
......
}
});

修改完此二者后即可在立方体上看到我们的图片。

四、 总结

本文简单介绍了如何创建立方体,如何为立方体添加贴图。随着学习的深入,我的知识也越来越感觉到不足,越来越感觉到自己的无知。吾生也有涯,而知也无涯。有崖的是我的生命,无涯的是我对知识的探索,生命不息,学习不止。下一篇文章介绍如何在三维场景中添加灯光。

最新文章

  1. C语言运算符优先级
  2. linux 下网站压力测试工具webbench
  3. 学习PHP时的一些总结(五)
  4. Android仿微信SlideView聊天列表滑动删除效果
  5. bootstrap瀑布流代码
  6. 使用MegaCli工具,在线调整raid配置
  7. MSSQl 事务的使用
  8. avalon,xmp
  9. Aras 引入外部的dll
  10. 为什么Fourier分析?
  11. xibai的PCI卡在英文系统上安装报错
  12. 一条SQL语句执行得很慢的原因有哪些?(转)
  13. CSS 小技巧(不定时更新)
  14. Ubuntu 使用命令行连接无线网
  15. Manager升职了
  16. hdu1258
  17. Android 最基础生命周期及旋转屏幕问题
  18. STL - 容器 - MultiSet
  19. 递归,回溯和DFS的区别
  20. Windows网络通信(一):socket同步编程

热门文章

  1. Eclipse: eclipse文本文件编码格式更改(GBK——UTF-8)
  2. Django实现内容缓存
  3. ACM学习之路___HDU 2066 一个人的旅行
  4. SQL Server 2016 Alwayson新增功能
  5. Python扩展方法一二事
  6. 使用 TUN 设备实现一个简单的 UDP 代理隧道
  7. Hive内置数据类型
  8. C++ Primer Plus 6 第一章
  9. hdu 4468 spy 极其精彩的一道kmp灵活运用题
  10. Paint the Grid Reloaded ZOJ - 3781 图论变形