PhiloGL学习(5)——神说要有光,便有了光
前言
上一篇文章中介绍了如何创建三维对象及加载皮肤,本文为大家介绍如何为场景添加光源。
一、 原理分析
光在任何地方都是非常重要的,无论在哪里都说是要发光发热,光和热也是分不开的。光线分为点光源和线光源,所谓点光源和线光源也是个相对的概念,站在地球上我们可以认为太阳光是线光源,其实从更大的尺度来看太阳光也是个点光源,只是我们站在地球上来看光线基本上是平行的了,所以可以认为是线光源。所有问题,站在不同的角度来看就会发生变化。
光线还有另外几个概念,环境光(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)——神说要有光,便有了光的更多相关文章
- PhiloGL学习(2)——骚年,让我们荡起双桨
前言 上一篇文章中简单介绍了PhiloGL框架如何上手.GLSL语言以及简单的绘制一个方块(见PhiloGL学习(1)--场景创建及二维方块加载).本文很简单,我们一起来让这个方块动起来. 一. ...
- PhiloGL学习(1)——场景创建及方块欲露还羞出水面
前言 上一篇文章中介绍了我认识PhiloGL框架的机缘以及初步的探讨(见JS前端三维地球渲染--中国各城市航空路线展示),在此文中仅仅对此框架进行了简单介绍并初步介绍了一些该框架的知识.首先三维这个东 ...
- PhiloGL学习(4)——三维对象、加载皮肤
前言 上一篇文章中介绍了如何响应鼠标和键盘事件,本文介绍如何加载三维对象并实现给三维对象添加一个漂亮的皮肤. 一. 原理分析 我对三维的理解为:所谓三维对象无非是多个二维对象拼接到一起,贴图就更简单了 ...
- kaggle新手如何在平台学习大神的代码
原创:数据臭皮匠 [导读]Kaggle ,作为听说它很牛X但从未接触过的同学,可能仅仅了解这是一个参加数据挖掘比赛的网站,殊不知Kaggle也会有赛题相关的数据集, 比如我们熟知的房价预测.泰坦尼克 ...
- 学习大神笔记之“MyBatis学习总结(二)”
MyBatis对表的增删改查操作 主要有两种方式:基于XML实现和基于注解实现. 完整项目结构: 工具类:MyBatisUtil-------用于获取 sqlsession pack ...
- PhiloGL学习(3)——程序员的法宝—键盘、鼠标
前言 上一篇文章中介绍了如何让对象动起来,本文介绍如何让场景响应我们的鼠标和键盘以控制场景的缩放及对象的转动和移动等. 一. 原理分析 有了上一篇文章的基础,我们已经知道了如何让场景和对象动起来.本文 ...
- PhiloGL学习(6)——深情奉献:快乐的一家
前言 话说上一篇文章结尾讲到这一篇要做一个地球自转以及月球公转的三维动画,提笔,不对,是提键盘开始写的时候脑海中突然出现了几年前春晚风靡的那首歌:蒙古族小丫头唱的快乐的一家.闲言莫提,进入正题. ...
- 学习大神笔记之“MyBatis学习总结(三)”
一.连接数据库的配置单独放在一个properties文件中 创建db.peoperties----保存数据库配置信息 driver=com.mysql.jdbc.Drive ...
- 对生成对抗网络GANs原理、实现过程、应用场景的理解(附代码),另附:深度学习大神文章列表
https://blog.csdn.net/love666666shen/article/details/75522489 https://blog.csdn.net/yangdelong/artic ...
随机推荐
- MySQL的数据备份以及pymysql的使用
一.MySQL的数据备份 语法: # mysqldump -h 服务器 -u用户名 -p密码 数据库名 > 备份文件.sql #示例: #单库备份 mysqldump -uroot -p123 ...
- linux系统命令<二>----du的使用方法
1> 要显示一个目录树及其每个子树的磁盘使用情况 du /home/linux 这在/home/linux目录及其每个子目录中显示了磁盘块数. 2> 要通过以1024字节为单位显示一个目录 ...
- 【译】The Accidental DBA:SQL Server Backup
最近重新翻看The Accidental DBA,将SQL Server Backup部分稍作整理,方便以后查阅.此篇是Part 1Part 2:The Accidental DBA:Troubles ...
- 升级Linux tar &&解决某用tar解压失败的tar包
今天解压个文件,出来很多这样的: /bin/tar: Ignoring unknown extended header keyword `SCHILY.dev'/bin/tar: Ignoring u ...
- 原型那些事 - JavaScript深入浅出(三)
前两次总结了JavaScript中的基本数据类型(值类型<引用类型>,引用类型<复杂值>)以及他们在内存中的存储,对内存空间有了一个简单的了解,以及第二次总结了this深入浅出 ...
- Java并发之CyclicBarrier、CountDownLatch、Phaser
在Java多线程编程中,经常会需要我们控制并发流程,等其他线程执行完毕,或者分阶段执行.Java在1.5的juc中引入了CountDownLatch和CyclicBarrier,1.7中又引入了Pha ...
- 获取sd卡的总大小和可用大小
- PHP防SQL注入攻击
PHP防SQL注入攻击 收藏 没有太多的过滤,主要是针对php和mysql的组合. 一般性的防注入,只要使用php的 addslashes 函数就可以了. 以下是一段copy来的代码: PHP代码 $ ...
- struts标签与jstl标签互换
近期在做struts切换spring mvc时发现代码中使用了大量的struts标签,对常用的struts标签做了总结,首先需要引入 <%@ taglib prefix="c" ...
- apollo实现c#与android消息推送(三)
3 实现c#消息推送服务 c#实现消息推送必须引入M2Mqtt.dll,源码 a 连接apache apollo代理服务器的代码.需要引入using uPLibrary.Networking.M2Mq ...