作用

场景当中添加了THREE.AmbientLight光源,光源的颜色将会影响全局的每一个物体每一个面的颜色。该光源没有特别得来源方向,也不会产生阴影。
通常不会使用THREE.AmbientLight作为场景内的唯一光源,一般配合点光源或者平行光等光源使用。其作用是为了弱化阴影或给场景添加一些额外的颜色。个人感觉重要的作用是,不添加环境光源,如果点光源照射不到的面,three.js压根就不绘制照射不到的面。

注意事项

配置THREE.AmbientLight的颜色用色应该尽量保守。如果你指定的颜色过于明亮,那么你和快就会发现画面的颜色过于饱和了。

案例查看地址:http://www.wjceo.com/blog/threejs/2018-02-12/26.html

使用

(1)首先实例化一个THREE.AmbientLight对象。

var ambientLight = new THREE.AmbientLight(color); //括号内传入指定颜色

(2)将实例化的对象添加到scene场景当中。

scene.add(ambientLight);

修改实例化好的THREE.AmbientLight对象颜色

(1)在实例化THREE.AmbientLight对象的时候,可以直接传入字符串’#ffffff’或者十六位进制值 0xffffff的方式,也可以和webgl原生一样传入三个值,分别对应rgb的值(值的范围是0~1)。
(2)如果已经实例化成功了,还需要修改当前对象的值,就需要使用到THREE.Color对象,创建一个新的或者修改当前THREE.Color对象的内部属性。例子:

ambientLight.color = new THREE.Color("#eeeeee");

THREE.Color对象方法

函数名 描述
set(value) 将当前颜色设置为指定的十六进制值。这个值可以是字符串、数值或是已有的THREE.Color实例。
setHex(value) 将当前颜色设置为指定的十六进制值。
setRGB(r,g,b) 根据提供的RGB值设置颜色,参数范围从0到1
setHSL(h,s,l) 根据提供的HSL值设置颜色。参数范围从0到1
setStyle(style) 根据css设置颜色的方式来设置颜色。例如使用”rgb(255,0,0)”、”#fff”、”red”
copy(color) 从提供的颜色对象复制颜色值到当前对象
copyGammaToLinear(color) 通常在内部使用,用THREE.Color提供的示例设置对象的颜色。颜色由伽马色彩空间转换到线性色彩空间得来的。伽马色彩空间也使用RGB颜色,但是会使用指数系数而不是线性系数
copyLinearToGamma(color) 通常在内部使用。用THREE.Color提供的示例设置对象的颜色,颜色通常是有线性色彩空间转换到伽马色彩空间得来的
convertGammaToLinear() 将当前颜色从伽马色彩空间转换到线性色彩空间
convertLinearToGamma() 将当前颜色从线性色彩空间转换到干嘛色彩空间
getHex() 以十六进制值形式从颜色对象中获取颜色值
getHexString() 以十六进制字符串形式从颜色对象中获取颜色值
getStyle() 以css值得形式从颜色对象中获取颜色值
getHSL(optionalTarget) 以HSL值得形式从颜色对象中获取颜色值。如果提供了optionTarget对象,Three.js将吧h、s和l属性设置到该对象
offsetHSL(h,s,l) 将提供的h、s和l值添加到当前颜色的h、s和l值上
add(color) 将r、g和b值添加到当前颜色
addColors(color1,color2) 通常在内部使用,将color1和color2相加,再将得到的值设置到当前颜色
addScalar(s) 通常在内部使用,在当前颜色RGB分量上添加值,谨记参数范围从0到1
multiply(color) 通常在内部使用,将当前颜色的RGB值与THREE.Color对象的RGB值相乘
multiplyScalar(s) 通常在内部使用,将当前颜色RGB值与提供的RGB值相乘,谨记参数范围从0到1
lerp(color,alpha) 通常在内部使用,找出介于对象的颜色和提供的颜色之间的颜色,alpha属性定义了当前颜色与提供的颜色的差距
equals(color) 如果THREE.Color对象实例提供的颜色的RGB值与当前颜色相等,则返回true
formArray(array) 与setRGB方法具有相同的功能,只是RGB值是通过数字数组的方式作为参数传入
toArray() 返回三个元素的数组:[r,g,b]
clone() 复制当前颜色

案例代码

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><style type="text/css">html, body {margin: 0;height: 100%;}canvas {display: block;}</style>
</head>
<body onload="draw();"></body>
<script src="build/three.js"></script>
<script src="examples/js/controls/OrbitControls.js"></script>
<script src="examples/js/libs/stats.min.js"></script>
<script src="examples/js/libs/dat.gui.min.js"></script>
<script>var renderer;function initRender() {renderer = new THREE.WebGLRenderer({antialias: true});renderer.setSize(window.innerWidth, window.innerHeight);//告诉渲染器需要阴影效果renderer.shadowMap.enabled = true;renderer.shadowMap.type = THREE.PCFSoftShadowMap; // 默认的是,没有设置的这个清晰 THREE.PCFShadowMapdocument.body.appendChild(renderer.domElement);}var camera;function initCamera() {camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000);camera.position.set(0, 40, 100);camera.lookAt(new THREE.Vector3(0, 0, 0));}var scene;function initScene() {scene = new THREE.Scene();}//初始化dat.GUI简化试验流程var gui;function initGui() {//声明一个保存需求修改的相关数据的对象gui = {ambientLight:"#111111", //环境光源pointLight:"#ffffff", //点光源lightY: 30, //灯光y轴的位置cubeX: 5, //立方体的x轴位置cubeY: 5, //立方体的x轴位置cubeZ: -5 //立方体的z轴的位置};var datGui = new dat.GUI();//将设置属性添加到gui当中,gui.add(对象,属性,最小值,最大值)datGui.addColor(gui,"ambientLight").onChange(function (e) {ambientLight.color = new THREE.Color(e);});datGui.addColor(gui,"pointLight").onChange(function (e) {pointLight.color = new THREE.Color(e);});datGui.add(gui, "lightY", 0, 100);datGui.add(gui, "cubeX", -30, 30);datGui.add(gui, "cubeY", -30, 30);datGui.add(gui, "cubeZ", -30, 30);}var ambientLight,pointLight;function initLight() {ambientLight = new THREE.AmbientLight("#111111");scene.add(ambientLight);pointLight = new THREE.PointLight("#ffffff");pointLight.position.set(15, 30, 10);//告诉平行光需要开启阴影投射pointLight.castShadow = true;scene.add(pointLight);}var cube;function initModel() {//辅助工具var helper = new THREE.AxisHelper(10);scene.add(helper);// 创建一个立方体//    v6----- v5//   /|      /|//  v1------v0|//  | |     | |//  | |v7---|-|v4//  |/      |///  v2------v3//立方体var cubeGeometry = new THREE.CubeGeometry(10,10,10);var cubeMaterial = new THREE.MeshLambertMaterial({color: 0x00ffff});cube = new THREE.Mesh(cubeGeometry, cubeMaterial);cube.position.x = 5;cube.position.y = 5;cube.position.z = -5;//告诉立方体需要投射阴影cube.castShadow = true;scene.add(cube);//底部平面var planeGeometry = new THREE.PlaneGeometry(100, 100);var planeMaterial = new THREE.MeshLambertMaterial({color: 0xaaaaaa});var plane = new THREE.Mesh(planeGeometry, planeMaterial);plane.rotation.x = -0.5 * Math.PI;plane.position.y = -0;//告诉底部平面需要接收阴影plane.receiveShadow = true;scene.add(plane);}//初始化性能插件var stats;function initStats() {stats = new Stats();document.body.appendChild(stats.dom);}//用户交互插件 鼠标左键按住旋转,右键按住平移,滚轮缩放var controls;function initControls() {controls = new THREE.OrbitControls(camera, renderer.domElement);// 如果使用animate方法时,将此函数删除//controls.addEventListener( 'change', render );// 使动画循环使用时阻尼或自转 意思是否有惯性controls.enableDamping = true;//动态阻尼系数 就是鼠标拖拽旋转灵敏度//controls.dampingFactor = 0.25;//是否可以缩放controls.enableZoom = true;//是否自动旋转controls.autoRotate = false;//设置相机距离原点的最远距离controls.minDistance = 50;//设置相机距离原点的最远距离controls.maxDistance = 200;//是否开启右键拖拽controls.enablePan = true;}function render() {renderer.render(scene, camera);}//窗口变动触发的函数function onWindowResize() {camera.aspect = window.innerWidth / window.innerHeight;camera.updateProjectionMatrix();render();renderer.setSize(window.innerWidth, window.innerHeight);}function animate() {//更新控制器render();//更新性能插件stats.update();//更新相关位置pointLight.position.y = gui.lightY;cube.position.x = gui.cubeX;cube.position.y = gui.cubeY;cube.position.z = gui.cubeZ;controls.update();requestAnimationFrame(animate);}function draw() {initGui();initRender();initScene();initCamera();initLight();initModel();initControls();initStats();animate();window.onresize = onWindowResize;}
</script>
</html>

直接引入相关的js文件,打开调节右上角的dat.GUI就可以清晰看到环境变量对物体颜色的影响。

24 Three.js的环境光源THREE.AmbientLight相关推荐

  1. 【three.js:语法】光源使用详解2-3(聚光灯 SpotLight、平行光 DirectionLight 、环境光 HemisphereLight、镜头光晕 LensFlare)

    注意点:SpotLight.target 的使用. 1.SpotLight.target= object 或者是 THREE.Object3D()才行.不能只是一个position. 2.target ...

  2. 计算机系统的搭建步骤,电脑搭建Node.js开发环境的操作教程[多图]

    电脑如何搭建Node.js开发环境?近日有用户询问怎么在Win7系统电脑上搭建Node.js开发环境,今天教程之家就给大家分享Node.js开发环境的搭建教程. 操作步骤: 1.下载Node.js官方 ...

  3. React.js 小书 Lesson5 - React.js 基本环境安装

    React.js 小书 Lesson5 - React.js 基本环境安装 本文作者:胡子大哈 本文原文:http://huziketang.com/books/react/lesson5 转载请注明 ...

  4. atitit.js浏览器环境下的全局异常捕获

    atitit.js浏览器环境下的全局异常捕获 window.onerror = function(errorMessage, scriptURI, lineNumber) { var s= JSON. ...

  5. vscode中装js解释器_h5学习记录(1)--vscode配置js开发环境

    文笔不是很好,第一次写东西,主要为了记录h5的学习过程.今天记录的是vscode配置js开发环境. 什么是VSCode Visual Studio Code (简称VS Code/VSC) 是一款于2 ...

  6. Node.js event loop 和 JS 浏览器环境下的事件循环的区别

    Node.js  event loop 和 JS 浏览器环境下的事件循环的区别: 1.线程与进程: JS 是单线程执行的,指的是一个进程里只有一个主线程,那到底什么是线程?什么是进程? 进程是 CPU ...

  7. js 执行环境 活动对象 变量对象 作用域链的理解

    看一下是知乎大神对于 js 执行环境 活动对象 变量对象 作用域链的解释 假设在全局环境下定义了函数pub()和变量pubvar: var pubvar = 1; function pub () {v ...

  8. js执行环境作用域和闭包_JavaScript中执行上下文,提升,作用域和闭包的终极指南

    js执行环境作用域和闭包 It may seem surprising, but in my opinion the most important and fundamental concept to ...

  9. 手把手教你学node之搭建node.js开发环境

    搭建node.js开发环境 本文只针对在Linux或者Mac下面.至于使用 Windows 并坚持玩新技术的同学,我坚信他们一定有着过人的.甚至是不可告人的兼容性 bug 处理能力,所以这部分同学麻烦 ...

最新文章

  1. 转:中国互联网十五年的22个创新模式
  2. .NET里面的Interop太烂了
  3. 用友BIP平台ISV伙伴快速壮大,32款融合产品与联合解决方案隆重发布
  4. SpringMVC数据库链接池,以及其他相关配置
  5. java中no1_Java程序设计实验(NO.1).doc
  6. CW3 Clarifications
  7. socket上传nsdictionary的json数据异常
  8. POJ3292 UVA11105 Semi-prime H-numbers【筛法打表】
  9. php中sisson用法,详细介绍php中session的用法
  10. SAP BPC最佳实践-BPC安装及配置的常见问题
  11. java adt下载_Android ADT 离线下载操作步骤
  12. Html模拟鼠标移动,原生js及H5模拟鼠标点击拖拽
  13. 用python把pdf文件转换为word文件
  14. AxureRP原型设计 快速开始
  15. 使用setBounds()函数设置Java布局
  16. manjaro安装微信
  17. 【其实是空空荡荡的牵挂,没有结局的怀念】
  18. 新年喜报!10人通过RHCA、60人通过RHCE!
  19. 粒子群算法的matlab动态图显示 实现(一)
  20. 京东VC后台自动批量上传主图 大聪明自动传主图 c# selenium网页自动化传图

热门文章

  1. 2019-02-13 思考:1000瓶药水,1瓶有毒,老鼠毒发24h,如何用最少的老鼠在24h内找出毒药?
  2. 【饭谈】【测试圈相亲平台开发流程】:页面样式开发心得【工匠、智者、航海家】
  3. supervisor 同时开启多个进程 numprocs 1
  4. GPU Profiling
  5. 据说,年薪百万的程序员,都是这么开悟的---笑一笑十年少
  6. 接口测试神器,它来了,它带着光环走来了
  7. 软件测试的小技巧,软件测试 - 软件测试人员的实用技巧
  8. 区块链项目ICO评估模型
  9. if(!ispostback)其用法和作用 什么时候该用?
  10. JAVA 中配置IKAnalyzer扩展词库和停止词库