零基础学习three.js_第三天

250 阅读3分钟

第三天

一、点光源(PointLight),平行光(DirectionalLight)

1.点光源(PointLight)

会朝所有的方向发射光线,不能被用来创建阴影

  • color - (可选参数)) 十六进制光照颜色。 缺省值 0xffffff (白色)。 intensity - (可选参数) 光照强度。 缺省值 1。
  • distance - 这个距离表示从光源到光照强度为0的位置。 当设置为0时,光永远不会消失(距离无穷大)。缺省值 0.
  • decay - 沿着光照距离的衰退量。缺省值 1。 在 physically correct 模式中,decay = 2。
 		// 创建点光源
        var Pointlight = new THREE.PointLight(0xff0000, 1, 100);
        Pointlight.position.set(0, 0, 15);
        scene.add(Pointlight);

        // 球体
        var geometry = new THREE.SphereGeometry(0.3);
        var material = new THREE.MeshBasicMaterial({ color: 0xffff00 });
        var sphereMesh = new THREE.Mesh(geometry, material);
        sphereMesh.position.copy(Pointlight.position);
        sphereMesh.castShadow = true
        scene.add(sphereMesh);

        var ctrlObj3 = {
            pointColor: 0xffffff,
            PointIntensity: 6,
            PointDistance: 60,
            Pointdecay: 1,
        }
        //控制点光源属性
        var crlt = new dat.GUI()
        var pointLightFolder = crlt.addFolder("Pointlight")
        pointLightFolder.addColor(ctrlObj3, "pointColor").onChange(function (e) {
            {
                Pointlight.color = new THREE.Color(e)
            }
        })
        pointLightFolder.add(ctrlObj3, "PointIntensity", 0, 10).onChange(function (e) {
            {
                Pointlight.intensity = e
            }
        })
        pointLightFolder.add(ctrlObj3, "PointDistance", 0, 1000).onChange(function (e) {
            {
                Pointlight.distance = e
            }
        })
        pointLightFolder.add(ctrlObj3, "Pointdecay", 0, 10).onChange(function (e) {
            {
                Pointlight.decay = e
            }
        })

2.平行光(DirectionalLight)

相当于远光的效果,例如太阳,太阳的光线彼此平行,其光强不会随着配置的目标对象的增大而减弱。

  • color - (可选参数) 16进制表示光的颜色。 缺省值为 0xffffff (白色)。
  • intensity - (可选参数) 光照的强度。缺省值为1。
 // 创建平行光
        var directionalLight = new THREE.DirectionalLight(0xffffff, 0.5);
        scene.add(directionalLight);

二、半球光(HemisphereLight)

光源直接放置于场景之上,光照颜色从天空光线颜色颜色渐变到地面光线颜色。

HemisphereLight( skyColor : Integer, groundColor : Integer, intensity : Float )

  1. skyColor - (可选参数) 天空中发出光线的颜色。 缺省值 0xffffff。
  2. groundColor - (可选参数) 地面发出光线的颜色。 缺省值 0xffffff。
  3. intensity - (可选参数) 光照强度。 缺省值 1。
var hemisphereLight = new THREE.HemisphereLight( 0xffffbb, 0x080820, 1 );
scene.add( hemisphereLight );
var ctrlObj = {
    hemisphereLightVisible:true,
    skyColor:0xffffff,
    groundColor:0x00ff00, //地面光线颜色属性
    hemisphereIntensity:1
}
var ctrl = new dat.GUI()
var hemisphereLightFolder = ctrl.addFolder("hemisphereLightVisible");
hemisphereLightFolder.add(ctrlObj,"hemisphereLightVisible",0,1).onChange(function(e){
	hemisphereLight.visible = e
})
hemisphereLightFolder.addColor(ctrlObj,"skyColor").onChange(function(e){
	hemisphereLight.color = new THREE.Color(e)
})
hemisphereLightFolder.addColor(ctrlObj,"groundColor").onChange(function(e){
	hemisphereLight.groundColor = new THREE.Color(e)
})
hemisphereLightFolder.add(ctrlObj,"hemisphereIntensity",0,1).onChange(function(e){
	hemisphereLight.intensity = e
})

三、平面光光源(RectAreaLight)

平面光光源从一个矩形平面上均匀地发射光线。这种光源可以用来模拟像明亮的窗户或者条状灯光光源。

实际在家具建模应用中广泛应用

注意事项:

  • 不支持阴影。
  • 只支持 MeshStandardMaterial 和 MeshPhysicalMaterial 两种材质。
  • 你必须在你的场景中加入 RectAreaLightUniformsLib

RectAreaLight( color : Integer, intensity : Float, width : Float, height : Float )

  1. color - (可选参数) 十六进制数字表示的光照颜色。缺省值为 0xffffff (白色)
  2. intensity - (可选参数) 光源强度/亮度 。缺省值为 1。
  3. width - (可选参数) 光源宽度。缺省值为 10。
  4. height - (可选参数) 光源高度。缺省值为 10。
var width = 10;
var height = 10;
var intensity = 1;
var rectLight = new THREE.RectAreaLight( 0xffffff, intensity,  width, height );
rectLight.position.set( 5, 5, 0 );
rectLight.lookAt( 0, 0, 0 );
scene.add( rectLight )

rectLightHelper = new THREE.RectAreaLightHelper( rectLight );
scene.add( rectLightHelper );

四、平面几何体(PlaneGeometry)

PlaneGeometry(width : Float, height : Float, widthSegments : Integer, heightSegments : Integer)

  1. width — 平面沿着X轴的宽度。默认值是1。
  2. height — 平面沿着Y轴的高度。默认值是1。
  3. widthSegments — (可选)平面的宽度分段数,默认值是1。
  4. heightSegments — (可选)平面的高度分段数,默认值是1。
var geometry = new THREE.PlaneGeometry( 5, 20, 32 );
var material = new THREE.MeshBasicMaterial( {color: 0xffff00, side: THREE.DoubleSide} );
var plane = new THREE.Mesh( geometry, material );
scene.add( plane );

视频学习地址