《three开发指南》阅读笔记——第三章

1、AmbientLight——影响整个场景的光源:

        书籍说AmbientLight颜色绑定用gui.addColor,照着敲代码没有注意,用gui.add绑定,发现改变颜色改变时也有效,不过对于ambientColor的值不是css合法的颜色取值(合法的颜色取值,如white、#333、rgb(22,33,44)、rgba(22,33,44,0.3)),绘制出来的AmbientLight的颜色是白色。对于gui.addColor会添加一个调色板用来控制ambientColor的取值:


2、PointLight——照射所有方向的光源

        按照书籍方式使用THREE.Vector3修改position的值报错:

        看报错的写position是只读,不能通过”cube.position = new THREE.Vector3(4, 5, 6)”来调整位置。可以通过”cube.position.set(new THREE.Vector3(4, 5, 6))”来调整位置。
        调整PointLight.distance的值,发现在plane的光圈大小与PointLight.intensity的值有关,当PointLight.distance增大的值超过与PointLight.intensity的值有关的一定值后,继续增大,绘制效果不变。PointLight.distance的值越小,在plane的光圈越小,当PointLight.distance的值为0时,在plane的光圈大小与PointLight.intensity的值固定后,PointLight.distance继续增大,plane的光圈不会变化时大小一致。

3、SpotLight——具有锥形效果的光源

        A、调整SpotLight.intensity的值,发现其值越大,物体的颜色越接近光源的颜色。球体的颜色是接近光源的颜色,但是立方体的颜色效果与球体不一样:

        初步猜测是两者的高度不一致,球体是运动的,观察发现当球体的y的位置最低时,球体颜色没有变化。后面猜测是两者距离光源的远近不一样,调整两者的位置,发现物体的颜色还是没有变化。

        B、调整SpotLight.distance的值,发现光源照射的范围与SpotLight.intensity的值有关,当SpotLight.distance增大的值超过与SpotLight.intensity的值有关的一定值后,继续增大,绘制效果不变。SpotLight.distance的值越小,光源照射的范围越小,当SpotLight.distance的值为0时,光源照射的范围大小与SpotLight.intensity的值固定后,SpotLight.distance继续增大,光源照射的范围不会变化时大小一致,同时如果开启阴影,此时物体阴影不会绘制。

        C、调整SpotLight.angle的值,发现当SpotLight.angle取余2 * Math.PI的值为0时,光源照射范围为0,SpotLight.angle的值越趋近于SpotLight.angle取余2 * Math.PI的值为0,光源照射范围越小。当SpotLight.angle取余Math.PI/ 2的值为0时,物体的阴影不会绘制。SpotLight.angle的绘制效果,在[0, 2*π]之间,当SpotLight.angle的值趋近于0、π、2*π时,物体的阴影绘制的越平滑,当SpotLight.angle的值趋近于π/2、3 *π/2时,物体的阴影绘制的越粗糙。

        D、调整SpotLight.exponent的值,发现绘制效果无变化。查看官网文档,发现SpotLight没有这个属性。对比书籍书籍对exponent的描述与官网,感觉decay替换该属性。发现当SpotLight.decay的值越大时,光源照射范围越小,大到一定值(示例的值调整为3左右),光源照射范围为0。

        E、调整SpotLight.shadowCameraVisible的值,发现绘制效果无变化。查看官网文档,发现SpotLight没有这个属性。根据属性名对比官网的SpotLight,感觉应该由SpotLight.shadow.camera.visible替换。更改SpotLight.shadow.camera.visible的值,发现绘制效果无变化。看书籍说存在属性不能再场景渲染后不能修改。在渲染前设置SpotLight.shadow.camera.visible的值,发现值为Boolean的任务值,绘制效果不变。

        F、调整SpotLight.onlyShadow的值,发现绘制效果无变化。查看官网文档,发现SpotLight没有这个属性。根据属性名对比官网的SpotLight,感觉没有合适的属性将其替换。

        G、SpotLight的shadowCameraNear、shadowCameraFar、shadowCameraFov属性同E部分调整为shadow.camera.X。

        H、调整SpotLight.shadow.camera.fov的值,发现绘制效果无变化。打印信息,发现SpotLight.shadow.camera.fov的实际值与设置值不一致。初步以为SpotLight.shadow.camera.fov的值会随着容器大小变化,调整后发现不会。后面以为其值对应声明camara时设置的角度值,调整后发现不是。SpotLight.shadow.camera的类型是继承Camera,想通过对SpotLight.shadow.camera赋一个新的Camera对象来更改SpotLight.shadow.camera.fov的值,尝试后发现还是不行。

        I、根据E部分调整SpotLight.shadowMapWidth为SpotLight.shadow.map.width,调整SpotLight.shadow.map.width的值,页面无内容绘制,控制台出现如下提示:

        这个提示看上去应该和THREE无关,是Vue的问题才对,但代码没有SpotLight.shadow.map.width时就不会出现这个错误。
        仔细看控制台,发现有报错:

        在控制台打印SpotLight的信息,发现确实有SpotLight.shadow.map,SpotLight.shadow.map的内容也不为空:

        用控制台直接打印SpotLight.shadow.map,发现其值确实是null。。。

        K、调整SpotLight.shadowMapHeight的值的效果同J部分。

        L、调整SpotLight.shadowBias的值,发现绘制效果无变化。查看官网文档,发现SpotLight没有这个属性。根据属性名对比官网的SpotLight,感觉应该由SpotLight.shadow.bias替换。

        M、调整SpotLight.shadowBias的值,发现绘制效果无变化。查看官网文档,发现SpotLight没有这个属性。根据属性名对比官网的SpotLight,感觉应该由SpotLight.shadow.bias替换。


3、DirectionalLight——模拟远处类似太阳的光源

        A、不同于SpotLight.intensity需要设置一个较大值才有好的光亮效果如1000,而DirectionalLight.intensity设置一个小值就有很好的光亮效果,如2。DirectionalLight.intensity的值越大,物体的颜色趋近于白色(立方体的颜色还是原本设置的颜色)。

        B、不同于SpotLight.intensity需要设置一个较大值才有好的光亮效果如1000,而DirectionalLight.intensity设置一个小值就有很好的光亮效果,如2。DirectionalLight.intensity的值越大,物体的颜色趋近于白色(立方体的颜色还是原本设置的颜色)。

        C、对于属性shadowCameraVisible同对SpotLight的shadowCameraVisible描述。

        D、对于属性shadowCameraFar和shadowCameraNear,要用DirectionalLight.shadow.camera.far和DirectionalLight.shadow.camera.near替换。调大DirectionalLight.shadow.camera.far和DirectionalLight.shadow.camera.near的差值,发现物体的阴影仍旧绘制不完整:

        相较于SpotLight.shadow.camera,DirectionalLight.shadow.camera的属性多了top、left、right和bottom,感觉这四个属性要设置正确的值才可以绘制物体完整的阴影。调整后,发现物体的阴影可以绘制完整了。

        E、对于属性shadowCameraFov,相较于SpotLight,没有DirectionalLight.shadow.camera.fov属性用于替换。

        F、对于属性shadowMapWidth、shadowMapHeight、shadowDrakness、onlyShadow和shadowBias,同前面描述SpotLight对应的属性一样。


4、半球光光源

        A、本地项目报错:

        查看官网的ImageUtils.js文件,发现没有方法loadTexture。有说用”const texture = new THREE.TextureLoader().load(‘filename.jpg’)”来替换”const texture = THREE.ImageUtils.loadTexture(‘filename.jpg’)”。
        在本地项目中,纹理读取文件,不管传入的文件路径A以什么开头,比如’/’、’./’、’../’、’../.../../’(...表示多个’../’),最终加载的文件路径为项目根目录加上传入的路径A去除前面提到的开头组合而成。即不管使用TextureLoader加载图片的文件在哪里,图片的位置在’/src/assets/image/grass.jpg’始终可以用”const texture = new THREE.TextureLoader().load(‘src/assets/image/grass.jpg’)”加载图片。

        B、调整HemisphereLight.color的值,plane和sphere的颜色都会改变。调整HemisphereLight.groundColor的值,只有sphere底部的颜色改变。

        C、调整HemisphereLight.instensity的值,感觉其向物体添加了荧光的效果,当HemisphereLight.instensity的值足够大时,物体整个是同一种颜色,如:


5、平面光光源

        A、看到书籍说要用到WebGLDeferredRenderer,去官网查了下没有找到。看网上说,WebGLDeferredRenderer被移除了且没有可替换的东西。这样AreaLight就不能按书籍上的来,去官网查找,发现没有AreaLight。官网上有一个RectAreaLight,看了下说明,感觉是用这个来替换AreaLight。

        B、根据书籍的github示例代码调整,WebGLDeferredRenderer用WebGLRenderer替换,AreaLight用RectAreaLight替换,绘制效果没有光源效果:

        看官网示例有加上RectAreaLightHelper,根据官网示例添加RectAreaLightHelper的值,绘制效果如下:

        对比之前,加了一个框。看了别人的示例,发现不需使用RectAreaLightHelper,RectAreaLight只对MeshStandardMaterial和MeshPhysicalMaterial有效果,调整plane的材质为MeshPhysicalMaterial,效果如下:

        对比书籍的效果,没有三个矩形的倒影。官网上说必需引入RectAreaLightUniformsLib,并执行RectAreaLightUniformsLib.init(),将其加上后,发现光源的倒影加上了:


6、镜头眩光

        A、本地项目报错:

        LensFlare需要导入。

        B、本地项目报错:

        定位报错在代码”lensFlare.add(textureFlare3, 60, .6, THREE.AdditiveBlending)”,看了下官网的写法为”lensFlare.addElement(new LensflareElement( textureFlare3, 60, .6))”。
        要将LensflareElement导进来,在官网查找没找到,后面发现其在lensFlare.js文件里。
        修改后发现只绘制lensflare3.png的图片,lensflare0.png没有绘制。在A部分直接使用Lensflare替换THREE.LensFlare,仔细对比官网示例,发现其new Lensflare并为传参。感觉lensflare0.png也需要通过lensFlare.addElement加入,经过尝试,lensflare0.png绘制出来了。

        C、感觉renderer.setClearColor(0x000000)和renderer.setClearColor(new THREE.Color(0x000000, 1))绘制的背景颜色是一样的,但是通过这个示例,发现二者的绘制是不同的。
        查看官网的Color,构造函数的传参数量大于1时,调用的是setRGB来设置颜色,所以本该是黑色变成了绿色。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容