前言

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

一、 原理分析

我对三维的理解为:所谓三维对象无非是多个二维对象拼接到一起,贴图就更简单了,就是将一张图片贴到对象上。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) {
......
}
});

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

四、 总结

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

PhiloGL学习(4)——三维对象、加载皮肤的更多相关文章

  1. Java虚拟机JVM学习02 类的加载概述

    Java虚拟机JVM学习02 类的加载概述 类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对 ...

  2. LINQ to SQL语句(17)之对象加载

    对象加载 延迟加载 在查询某对象时,实际上你只查询该对象.不会同时自动获取这个对象.这就是延迟加载. 例如,您可能需要查看客户数据和订单数据.你最初不一定需要检索与每个客户有关的所有订单数据.其优点是 ...

  3. ios网络学习------4 UIWebView的加载本地数据的三种方式

    ios网络学习------4 UIWebView的加载本地数据的三种方式 分类: IOS2014-06-27 12:56 959人阅读 评论(0) 收藏 举报 UIWebView是IOS内置的浏览器, ...

  4. MFC加载皮肤 转自:http://www.cctry.com/thread-4032-1-1.html

    VC皮肤库SkinSharp 1.0.6.6的使用: SkinSharp又称Skin#,是Windows环境下一款强大的换肤组件.SkinSharp作为换肤控件,只需要在您的程序中添加一行代码,就能让 ...

  5. thinkphp学习笔记9—自动加载

    原文:thinkphp学习笔记9-自动加载 1.命名空间自动加载 在3.2版本中不需要手动加载类库文件,可以很方便的完成自动加载. 系统可以根据类的命名空间自动定位到类库文件,例如定义了一个类Org\ ...

  6. 学习EF之贪婪加载和延迟加载(1)

    从暑假开始接触code first以来,一直感觉很好用,主要在于开发过程中以业务为中心可以随时修改数据模型生成数据库,还有一个原因就是查询起来很方便 这里找了一个以前database first的一段 ...

  7. 【requireJS源码学习02】data-main加载的实现

    前言 经过昨天的学习,我们大概了解到了requireJS的主要结构,这里先大概的回顾一下 首先从总体结构来说,require这里分为三块: ① newContext之前变量声明或者一些工具函数 ② n ...

  8. hibernate学习(6)——加载策略(优化)

    1. 检索方式 1  立即检索:立即查询,在执行查询语句时,立即查询所有的数据. 2 延迟检索:延迟查询,在执行查询语句之后,在需要时在查询.(懒加载) 2.  检查策略 1  类级别检索:当前的类的 ...

  9. Spring学习笔记(1)——资源加载

    <!-- 占坑,迟点补充底层原理 --> Spring支持4种资源的地址前缀 (1)从类路径中加载资源——classpath: classpath:和classpath:/是等价的,都是相 ...

随机推荐

  1. 32位汇编第六讲,OllyDbg逆向植物大战僵尸,快速定位阳光基址

    32位汇编第六讲,OllyDbg逆向植物大战僵尸,快速定位阳光基址 一丶基址,随机基址的理解 首先,全局变量的地址,我们都知道是固定的,是在PE文件中有保存的 但是高版本有了随机基址,那么要怎么解决这 ...

  2. 《Java从入门到放弃》JavaSE入门篇:文件操作

    Java中的文件操作还有点小复杂··· 不过没关系,我会把它讲得很简单,嘿嘿嘿!!! 在讲Java中的文件操作前,先了解一个概念--"流",比如我们把一个杯子的水倒到另一个同样大小 ...

  3. MySql Jar 包下载

    MySql JAR 包下载 我们要使用Spring 链接MySql  需要两个Jar 包   一个是C3p0   一个是MySql 的Connection Jar  包 C3p0: 进入下面的网址 h ...

  4. [UIKit学习]07.关于如何选择UIButton、UILable、UIImageView

    如何选择UIButton.UILable.UIImageView 在不添加手势的前提下,只要不涉及到点击和多状态表现就尽量不要选择UIButton

  5. 【DDD】领域驱动设计实践 —— UI层实现

    前面几篇blog主要介绍了DDD落地架构及业务建模战术,后续几篇blog会在此基础上,讲解具体的架构实现,通过完整代码demo的形式,更好地将DDD的落地方案呈现出来.本文是架构实现讲解的第一篇,主要 ...

  6. ThinkJS框架入门详细教程(一)开发环境

    一.前端标配环境 1.nodeJS正确安装,可以参考:http://www.cnblogs.com/chengxs/p/6221393.html 2.git正确安装,可以参考:http://www.c ...

  7. Check for Palindromes-FCC

    問題: 检查回文字符串 如果给定的字符串是回文,返回true,反之,返回false. 如果一个字符串忽略标点符号.大小写和空格,正着读和反着读一模一样,那么这个字符串就是palindrome(回文). ...

  8. ThinkPHP中:RBAC权限控制的实习步骤

    使用版本ThinkPHP3.1.3 第一步,建表及数据 第二步,建关联模型 第三步,控制器使用关联模型.配置文件 第四步,模板显示数据 第一步,建表及数据 在数据库中,建立一个companysvn数据 ...

  9. 小符号反映大问题,Shell中下划线_与变量的关系。

    之前写过一个根据日期和时间自动命名文件名的时候遇到一个问题. #! /bin/bash read -p "please input the filename:" filename ...

  10. 21.Linux-写USB键盘驱动(详解)

    本节目的: 根据上节写的USB鼠标驱动,来依葫芦画瓢写出键盘驱动 1.首先我们通过上节的代码中修改,来打印下键盘驱动的数据到底是怎样的 先来回忆下,我们之前写的鼠标驱动的id_table是这样: 所以 ...