前言

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

一、 原理分析

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

光线还有另外几个概念,环境光(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. SpringMVC第五篇【方法返回值、数据回显、idea下配置虚拟目录、文件上传】

    Controller方法返回值 Controller方法的返回值其实就几种类型,我们来总结一下-. void String ModelAndView redirect重定向 forward转发 数据回 ...

  2. 使用IntelliJ IDEA查看类的继承关系图形

    最近正好也没什么可忙的,就回过头来鼓捣过去的知识点,到Servlet部分时,以前学习的时候硬是把从上到下的继承关系和接口实现记得乱七八糟. 这次利用了IDEA的diagram,结果一目了然,也是好用到 ...

  3. mysql 存储引擎介绍1

    1.1  存储引擎的使用 数据库中的各表均被(在创建表时)指定的存储引擎来处理. 服务器可用的引擎依赖于以下因素: MySQL的版本 服务器在开发时如何被配置 启动选项 为了解当前服务器中有哪些存储引 ...

  4. Highway Networks

    一 .Highway Networks 与 Deep Networks 的关系 深层神经网络相比于浅层神经网络具有更好的效果,在很多方面都已经取得了很好的效果,特别是在图像处理方面已经取得了很大的突破 ...

  5. C++移动构造函数以及move语句简单介绍

    C++移动构造函数以及move语句简单介绍 首先看一个小例子: #include <iostream> #include <cstring> #include <cstd ...

  6. Oculus关于Internal Error:OVR53225466报错解决方法

    安装Oculus过程中可能会出现Internal Error:OVR53225466报错提示,如附件所示: 解决方法:修改hosts文件 操作方法: (1)以管理员方式打开记事本: (2)打开C:\W ...

  7. 使用SoapUI工具做get请求和post请求接口测试

    祝大家节日快乐啦. 之前写过的一篇帖子已经介绍了SoapUI工具的基本使用,所以在此不再重复讲解关于建工程.建测试套件.添加用例等操作,可查看该篇文章详解:http://www.cnblogs.com ...

  8. 关于高德地图Android开发时地图只显示一次、第二次打开不定位的解决办法

    我按照高德官方Demo改的 第一次是可以定位的,如左图 第二次就不能定位了,如右图 在onDestory中把aMap置为空即可 aMap = null; 修改完如下图: 原理是第二次打开时aMap不为 ...

  9. Python 实现的随机森林

    随机森林是一个高度灵活的机器学习方法,拥有广泛的应用前景,从市场营销到医疗保健保险. 既可以用来做市场营销模拟的建模,统计客户来源,保留和流失.也可用来预测疾病的风险和病患者的易感性. 随机森林是一个 ...

  10. 决策树模型组合之随机森林与GBDT

    版权声明: 本文由LeftNotEasy发布于http://leftnoteasy.cnblogs.com, 本文可以被全部的转载或者部分使用,但请注明出处,如果有问题,请联系wheeleast@gm ...