首页 > 其他分享 >《Learn Three.js》学习(3)光源

《Learn Three.js》学习(3)光源

时间:2024-11-30 11:00:00浏览次数:9  
标签:scene THREE Three add Learn new shadow js spotLight

前言:

WebGL本身不支持光源,不使用three.js,则需使用着色程序来模拟光源。

学习大纲:

Three.js中的光源

特定光源的使用时机

如何调整和配置所有光源的行为

如何创建镜头光晕

光源表 

基础光源:THRER.AmbientLight、THERE.PointLight、THERE.SpotLight

特殊光源和效果:THERE.HemisphereLight、THERE.AreaLight和LensFlare 

基础光源 

THREE.AmbientLight-环境光

特点:1、颜色运用至全局;2、光源无特定来源方向;3、不产生光照阴影 4、将所有物体无论形状渲染成一种颜色(故不能使用为唯一光照)

注意:使用环境光用色需保守些,不然画面颜色会过于饱和。

 

  var ambientLight = new THREE.AmbientLight("#606008");
  scene.add(ambientLight);

  // 添加控制变量
  var controls = new function(){
    this.intensity = ambientLight.intensity;
    this.ambientColor = ambientLight.color.getStyle();
    this.disableSpotlight = false;
  }
  var gui = new GUI();

  // 添加环境光强度控制
  gui.add(controls,'intensity').onChange(function(e){
    ambientLight.color = new THREE.Color(controls.ambientColor);
    ambientLight.intensity = controls.intensity;
  });
  // 添加环境光颜色控制
  gui.addColor(controls,'ambientColor').onChange(function(e){
    ambientLight.color = new THREE.Color(controls.ambientColor);
    ambientLight.intensity = controls.intensity;
  });
  // 添加开关控制是否显示聚光灯
  gui.add(controls,'disableSpotlight').onChange(function(e){
    spotLight.visible = !e;
  });

THREE.SpotLight-聚光灯

特点:1、锥型光源 2、具有角度和方向 

   // 聚光灯
    const spotLight = new THREE.SpotLight("#ffffff");
    spotLight.position.set(-40, 60, -10);
    spotLight.castShadow = true;
    spotLight.shadow.camera.near = 1;
    spotLight.shadow.camera.far = 100;
    spotLight.shadow.camera.fov = 120; // 设置阴影相机的视场角
    spotLight.angle = 0.4
    spotLight.intensity = 5; // 聚光灯强度
    spotLight.target = cube; // 设置聚光灯的目标
    spotLight.distance = 0; // 距离
    spotLight.decay = 0.06; // 衰减
    scene.add(spotLight);

 

当开启shadow enable时,可以调整其shadow属性

说明:spotLight可以指定某一确定物体,可以为scene中存在的也可以根据目标空间点选取创建;

    // 创建空间对象
    var target = new THREE.Object3D();
    // target.position.set(5, 0, 0);
    target.position = new THREE.Vector3(5, 0, 0);
    scene.add(target);

可以用其属性angle定义光锥角度,distance定义光锥长度,penumbra设置光强从光锥中心向边缘递减的速度。

THERE.SpotLight对象设置castShadow为true生成阴影;

scene中渲染THERE.Mesh对象要确保投射阴影对象设置castShadow属性,为要显示阴影的对象设置receiveShadow属性。 

        var helper = new THREE.SpotLightHelper(spotLight);
        scene.add(helper);
        var debugCamera = new THREE.CameraHelper(spotLight.shadow.camera);
        scene.add(debugCamera);

        // 创建鼠标控制器
        let mouseControls = new OrbitControls(camera, renderer.domElement);
        // 监听控制器,每次拖动后重新渲染画面
        mouseControls.addEventListener('change', function(){
          renderer.render(scene, camera);
        });
        render();

        function render() {
            stats.update();
            helper.update();

 注意:

如果在场景中使用薄对象,在渲染阴影时可能出现奇怪的渲染失真,可用bias属性轻微偏移来修复;

如果想使阴影更加柔和,使用THREE.WebGLRenderer设置为PCFShadowMap

THREE.PointLight-点光源

单点发光照射所有方向

属性:

power和decay属性对于模拟现实世界十分有效。

distance决定了光强度减为0前的距离。

也可使用THREE.CameraHelper 及THREE.PointLightHelper来展示光线

 // 平行光
var directionalLight = new THREE.DirectionalLight("#ffffff", 0.1);
directionalLight.castShadow = true;
directionalLight.shadow.camera.near = 2;
directionalLight.shadow.camera.far = 100;
directionalLight.shadow.camera.left = -50;
directionalLight.shadow.camera.right = 50;
directionalLight.shadow.camera.top = 50;
directionalLight.shadow.camera.bottom = -50;
directionalLight.position.set(30, 10, -50);
scene.add(directionalLight);

THERE.DirectionalLight-平行光 

特点:所有光线相互平行-eg:太阳光

// 点光源
var pointColor = "#ccffcc";
var pointLight = new THREE.PointLight(pointColor);
pointLight.distance = 100;
scene.add(pointLight);

特殊光源和效果

THREE.HemisphereLight-半球光光源

户外更自然的光照,更多模拟大气散射和地面以及其他物体的反射

const light = new THREE.HemisphereLight( 0xffffbb, 0x080820, 1 ); scene.add( light );

THREE.RectAreaLight-区域光光源

从很大的区域发射光线,而不是单个点

不在标准库而在扩展库中,需要导入RectAreaLightUniformLib.js

const width = 10;
const height = 10;
const intensity = 1;
const rectLight = new THREE.RectAreaLight( 0xffffff, intensity,  width, height );
rectLight.position.set( 5, 5, 0 );
rectLight.lookAt( 0, 0, 0 );
scene.add( rectLight )

const rectLightHelper = new RectAreaLightHelper( rectLight );
rectLight.add( rectLightHelper );

LensFlare - 镜头光晕

import { Lensflare } from 'three/addons/objects/Lensflare.js';

 blending混合,混合模式决定我们将如何将他们混合在一起,默认混合方式为THREE.AddtiveBlending

color 光晕的颜色。

opacity 不透明度,0完全透明。

如下使用add方法添加,还可以添加color颜色和opacity透明度。

// 光晕
var textureFlare3 = new THREE.ImageUtils.loadTexture('./assets/lensflare0_alpha.png');
lensFare.add(textureFlare3,60,0.6,THREE.AdditiveBlending);
lensFare.add(textureFlare3,70,0.7,THREE.AdditiveBlending);
lensFare.add(textureFlare3,80,0.7,THREE.AdditiveBlending);

转换:

主要讲一下笔者将html的three应用转成vue3,反之亦然。

1、注意自己的导入方法名,html中的new dat.GUI ,但vue3中为

import { GUI } from 'three/examples/jsm/libs/lil-gui.module.min.js';

使用时直接new GUI便可添加图形化调试器

2、注意html可以直接操作dom,vue不可以,所以实例化一个全局变量,来为其原型链上挂载元素

html

// 将渲染器添加到dom
document.getElementById('webgl-output').appendChild(renderer.domElement);

vue

const webglOutput = ref(null);
webglOutput.value.appendChild(renderer.domElement);

3、注意上述的全局变量是否是响应式数据ref,记得添加value,再使用方法appendChildren。 

标签:scene,THREE,Three,add,Learn,new,shadow,js,spotLight
From: https://blog.csdn.net/Ian1025/article/details/144049308

相关文章

  • 使用js获取鼠标坐标
    //获取鼠标坐标有两种主要方式,取决于你想获取相对于什么位置的坐标://1.相对于视口(viewport)的坐标:document.addEventListener('mousemove',function(event){constx=event.clientX;consty=event.clientY;//使用x和y坐标,例如显示在页面上consol......
  • js依赖注入的实现思路是什么?它有什么优缺点呢?
    JavaScript依赖注入的实现思路核心在于将组件的依赖关系从组件内部转移到外部,由外部负责创建和提供依赖。这实现了控制反转(InversionofControl,IoC),降低了组件之间的耦合度,提高了代码的可测试性、可维护性和可重用性。以下是几种常见的JavaScript依赖注入实现思路:构造......
  • 用js实现动态改变根元素字体大小的方法
    functionchangeRootFontSize(fontSize){//Method1:Using`document.documentElement.style.fontSize`document.documentElement.style.fontSize=fontSize;//Method2:Using`:root`CSSvariableand`setProperty`(moreflexible)//Thisallowsyou......
  • uni-app vue3 获取 package.json 自定义环境变量
    一、初始化项目 二、添加 package.json 文件(必须)注意:文件里面不要写备注{ "uni-app":{ "scripts":{ "dev":{ "title":"开发版", "env":{ "ENV_TYPE":"dev", "UNI_PLATFORM&q......
  • JSR303统一校验
    1、简介jsr是JavaSpecificationRequests的缩写,意思是java的请求规范。周志明老师的书上还着重介绍过jsr292(jvm多语言支持包括Kotlin,Clojure,JRuby,Scala等)。JSR303着重参数校验功能,点开javax.validation.constraints,可以看到已经封装好的注解有这些:使用jsr303规范......
  • 说说你对js排序的理解,你有了解哪些算法呢?
    我对JavaScript排序的理解是,它主要用于对数组中的元素进行排序,使其按照一定的顺序排列,比如升序或降序。JavaScript提供了内置的sort()方法来实现排序,同时也允许开发者自定义排序逻辑。我了解以下几种JavaScript排序算法:1.内置sort()方法:JavaScript的sort()方法默......
  • nvm安装详细教程(卸载旧的nodejs,安装nvm、node、npm、cnpm、yarn及环境变量配置)
    注意:1、安装nvm之前需要卸载之前的nodejs,并且还要删除之前的环境变量配置,否则会出现一些奇怪的问题2、nvm的安装路径不能有中文或者空格,否则后面在cmd中切换node版本会出现乱码 一、完全卸载旧的nodejs参考文章《Node卸载超详细步骤》1、打开系统的控制面板,点击卸载程序,卸......
  • #Js篇: 链式判断运算符 ?.和Null判断运算符 ??和逻辑赋值运算符||= &&= ??=
    链式判断运算符?.?.运算符,直接在链式调用的时候判断,左侧的对象是否为null或undefined。如果是的,就不再往下运算,而是返回undefined。链判断运算符?.有三种写法。obj?.prop//对象属性是否存在obj?.[expr]//同上func?.(…args)//函数或对象方法是否存在下面是obj?......
  • json-rules-engine engine 简单说明
    engine包含了存储,执行规则,提交事件以及维护状态,比如添加以及一处fact,添加、删除、更新rule,同时还包含添加operator,添加以及维护conddition执行//runtheengineawaitengine.run()//withconstantfactsawaitengine.run({userId:1})const{results,//r......
  • JAVA开源毕业设计 课程智能组卷系统 Vue.JS+SpringBoot+MySQL
    本文项目编号T009,文末自助获取源码\color{red}{T009,文末自助获取源码}......