前言

上一篇文章中介绍了如何创建三维对象及加载皮肤,本文为大家介绍如何为场景添加光源。

一、 原理分析

光在任何地方都是非常重要的,无论在哪里都说是要发光发热,光和热也是分不开的。光线分为点光源和线光源,所谓点光源和线光源也是个相对的概念,站在地球上我们可以认为太阳光是线光源,其实从更大的尺度来看太阳光也是个点光源,只是我们站在地球上来看光线基本上是平行的了,所以可以认为是线光源。所有问题,站在不同的角度来看就会发生变化。

光线还有另外几个概念,环境光(ambient light)、漫反射光(diffuse light)、镜面反射光(specular light)。所谓环境光是指入射光均匀地从周围环境入射至景物表面并等量地向各个方向反射出去,通常物体表面还会受到从周围环境来的反射光(地面、天空、墙壁等)的照射,这些统称为环境光。漫反射光表示特定光源在景物表面的反射光中那些向空间各方向均匀反射出去的光。镜面反射光为朝一定方向的反射光,如点光源照射一个金属球时会在表面形成一块特定亮的区域,它是光源在金属球面上产生的镜面反射光,镜面反射光与物体的光滑程度有关系。

对于3D也是一样,我这几年搞的比较多的是地理信息系统,那么为什么还要学习3D以及之前的大数据等技术呢?首先我对学习充满了无限热情,碰到新技术就想学一下,当然这不见得是个好事情,因为一个人不可能把什么都学会,必须要有所取舍,否则就会像我一样导致什么都略懂但都不精通。其次任何知识都是有用的,不知道哪天就会用到,比如Hadoop集群,刚开始感觉很高大上就学了一点,后面果然需要使用这种分布式计算技术来处理遥感影像,于是Geotrellis很快就上手了,关于3D我认为也是同样如此,这个说不定就会在将来的工作中用到,比如倾斜摄影以及点云等等技术。

骚年们,让我们开始今天的学习吧。

二、 创建光源

首先,我们必须清楚,光源是加在整个场景中的而不是某个对象,就像太阳光打到地球上,是整个环境都有了光,而不是说只是某个对象有了光。对待PhiloGL也是一样,直接从场景中获取光线设置信息,并对其进行设置。

2.1 场景配置

所以在onLoad事件中添加如下代码:

var scene = app.scene
var lightConfig = scene.config.lights;
lightConfig.enable = true;

lightConfig就是对整个场景光源设置的变量。首先设置其enbale属性为true,表示使用光源。上面分析的几种光源均可以添加或者不添加在特定场景中,并可以任意设置其光源位置及颜色分量等。

2.2 线光源

设置lightConfig属性的directional的direction和color属性。

lightConfig.directional.direction = {
x: +light.x,
y: +light.y,
z: +light.z
};
lightConfig.directional.color = {
r: +light.r,
g: +light.g,
b: +light.b
};

其中direction表示光线方向,color表示光线颜色。

  • 坐标系

此处需要补充一个之前早已涉及但被我忽略的问题——坐标系。坐标系是任何图形学的基础,居然遗漏了此问题。

WEbGL同样采用笛卡尔左手坐标系,其Z轴正向为从屏幕指向用户的方向,X轴正向为从屏幕中央指向屏幕右侧的方向,Y轴正向为从屏幕中央指向屏幕上侧的方向。

此处light是我定义的变量,存储了光线的上述信息,注意此处变量前的+,此符号在js中的意义为将其他类型的数据转换为number,此处因为可以直接定义成number类型,所以不写也可。

此处还有一个问题,经过我实际测试,线光源的x、y、z为反向,即真正光线的向量方向为(-x,-y,-z)。当然此处可能是由于我对坐标系理解有误或者实验有误,如果如此,欢迎批评指正。

2.3 点光源

点光源直接设置lightConfig的points属性。

lightConfig.points = {
diffuse: { // 散射光
r: +light.dr,
g: +light.dg,
b: +light.db
},
specular: { // 反射光
r: +light.sr,
g: +light.sg,
b: +light.sb
},
position: {
x: +light.x,
y: +light.y,
z: +light.z
}
};

其中diffuse表示散射光,specular表示散射光,position表示点光源的位置,此处位置为实际的光源点的位置。

2.4 环境光

设置lightConfig的ambient属性。

lightConfig.ambient = {
r: +ambient.r,
g: +ambient.g,
b: +ambient.b
};

环境光不需要设置位置,无论物体处在何处以及哪一面均会被射上此光。

2.5 另外一种写法

采用上面的写法的好处在于我们可以改变光线的值或者光线的位置,其方法如同在第二篇文章中讲述的动画,直接改变light的值即可。当然如果为固定我们还可以直接写在PhiloGL的配置中,如下:

PhiloGL('test1', {
scene: {
lights: {
directional: {
color: {
r: 1, g: 1, b: 1
},
direction: {
x: 0, y: 0, z: 0
}
}
}
},
})

这是线光源的设置方法,可以看出两种方式写法实质相同。点光源写法相同。

三、 总结

本文简单介绍了如何设置光源。到这里PhiloGL的基础以及WebGL的基础我们已经基本全部掌握了,下一篇文章介绍一个案例,做一个自转的地球及围绕其公转的地球。

PhiloGL学习(5)——神说要有光,便有了光的更多相关文章

  1. PhiloGL学习(2)——骚年,让我们荡起双桨

     前言 上一篇文章中简单介绍了PhiloGL框架如何上手.GLSL语言以及简单的绘制一个方块(见PhiloGL学习(1)--场景创建及二维方块加载).本文很简单,我们一起来让这个方块动起来.  一.  ...

  2. PhiloGL学习(1)——场景创建及方块欲露还羞出水面

    前言 上一篇文章中介绍了我认识PhiloGL框架的机缘以及初步的探讨(见JS前端三维地球渲染--中国各城市航空路线展示),在此文中仅仅对此框架进行了简单介绍并初步介绍了一些该框架的知识.首先三维这个东 ...

  3. PhiloGL学习(4)——三维对象、加载皮肤

    前言 上一篇文章中介绍了如何响应鼠标和键盘事件,本文介绍如何加载三维对象并实现给三维对象添加一个漂亮的皮肤. 一. 原理分析 我对三维的理解为:所谓三维对象无非是多个二维对象拼接到一起,贴图就更简单了 ...

  4. kaggle新手如何在平台学习大神的代码

    原创:数据臭皮匠  [导读]Kaggle ,作为听说它很牛X但从未接触过的同学,可能仅仅了解这是一个参加数据挖掘比赛的网站,殊不知Kaggle也会有赛题相关的数据集, 比如我们熟知的房价预测.泰坦尼克 ...

  5. 学习大神笔记之“MyBatis学习总结(二)”

    MyBatis对表的增删改查操作         主要有两种方式:基于XML实现和基于注解实现. 完整项目结构: 工具类:MyBatisUtil-------用于获取  sqlsession pack ...

  6. PhiloGL学习(3)——程序员的法宝—键盘、鼠标

    前言 上一篇文章中介绍了如何让对象动起来,本文介绍如何让场景响应我们的鼠标和键盘以控制场景的缩放及对象的转动和移动等. 一. 原理分析 有了上一篇文章的基础,我们已经知道了如何让场景和对象动起来.本文 ...

  7. PhiloGL学习(6)——深情奉献:快乐的一家

     前言 话说上一篇文章结尾讲到这一篇要做一个地球自转以及月球公转的三维动画,提笔,不对,是提键盘开始写的时候脑海中突然出现了几年前春晚风靡的那首歌:蒙古族小丫头唱的快乐的一家.闲言莫提,进入正题.   ...

  8. 学习大神笔记之“MyBatis学习总结(三)”

    一.连接数据库的配置单独放在一个properties文件中          创建db.peoperties----保存数据库配置信息      driver=com.mysql.jdbc.Drive ...

  9. 对生成对抗网络GANs原理、实现过程、应用场景的理解(附代码),另附:深度学习大神文章列表

    https://blog.csdn.net/love666666shen/article/details/75522489 https://blog.csdn.net/yangdelong/artic ...

随机推荐

  1. maven profile切换正式环境和测试环境

    有时候,我们在开发和部署的时候,有很多配置文件数据是不一样的,比如连接mysql,连接redis,一些properties文件等等 每次部署或者开发都要改配置文件太麻烦了,这个时候,就需要用到mave ...

  2. JDBC第一篇--【介绍JDBC、使用JDBC连接数据库、简单的工具类】

    1.什么是JDBC JDBC全称为:Java Data Base Connectivity,它是可以执行SQL语句的Java API 2.为什么我们要用JDBC 市面上有非常多的数据库,本来我们是需要 ...

  3. Appium (win7系统)环境搭建----完整版

    首先感谢  http://www.cnblogs.com/puresoul/p/4696638.html  和 http://www.cnblogs.com/fnng/p/4540731.html   ...

  4. 爬虫实战:爬虫之 web 自动化终极杀手 ( 上)

    欢迎大家前往腾讯云技术社区,获取更多腾讯海量技术实践干货哦~ 作者:陈象 导语: 最近写了好几个简单的爬虫,踩了好几个深坑,在这里总结一下,给大家在编写爬虫时候能给点思路.本次爬虫内容有:静态页面的爬 ...

  5. 关于IOS的屏幕适配(iPhone)——Auto Layout和Size Classes

    Auto Layout和Size Classes搭配使用极大的方便了开发者,具体如何使用Auto Layout和Size Classes大家可以参考其他文章或者书籍,这里只提一点,在我们设置Size ...

  6. OC——多态

    书接上文,上文提到继承一个很大用途的是为了更好的实现多态,现在我们就来看看OC的多态. 多态:顾名思义就是好多种状态,以前学C#时候印象最深刻的例子是好多个类共同实现同一个接口,然后把这些类的对象都装 ...

  7. 深入理解计算机系统chapter2

    ---恢复内容开始--- 整数表示: 反码和原码都会有正零和负零 有符号整数和无符号整数之间的转换 反之 扩展一个数字的位级表示 截断操作 无符号加法的益处 补码的加法 规格化的值:E=e-bias ...

  8. Linux入门之常用命令(6)Bash命令重定向 管线命令

    命令重定向 将目前所得数据转移到其他地方 >  将输出结果导入文件 如  ls -l / >test     (1)若test文件不存在则创建 (2)若test文件存在 清空后写入 > ...

  9. 51 nod 1624 取余最长路 思路:前缀和 + STL(set)二分查找

    题目: 写这题花了我一上午时间. 下面是本人(zhangjiuding)的思考过程: 首先想到的是三行,每一行一定要走到. 大概是这样一张图 每一行长度最少为1.即第一行(i -1) >= 1, ...

  10. 基于Quartz实现简单的定时发送邮件

    一.什么是Quartz Quartz 是一个轻量级任务调度框架,只需要做些简单的配置就可以使用:它可以支持持久化的任务存储,即使是任务中断或服务重启后,仍可以继续运行.Quartz既可以做为独立的应用 ...