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

前言:

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.4spotLight.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。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/480711.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

shell(9)

声明! 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&…

【头歌实训:递归实现斐波那契数列】

头歌实训:递归实现斐波那契数列 文章目录 任务描述相关知识递归相关知识递归举例何时使用递归定义是递归的数据结构是递归的问题的求解方法是递归的 编程要求测试说明源代码: 任务描述 本关任务:递归求解斐波那契数列。 相关知识 为了完成…

回声消除延时估计的一些方法

在音频信号处理,尤其是在回声消除和语音通信中,延时估计是一个至关重要的任务。回声消除技术旨在减少或消除在语音通信中由于信号反射而产生的回声。为了有效地实现这一点,系统需要准确估计发送信号和接收信号之间的延迟。通过了解延迟&#…

我们来学mysql -- 事务之概念(原理篇)

事务的概念 题记一个例子一致性隔离性原子性持久性 题记 在漫长的编程岁月中,存在一如既往地贯穿着工作,面试的概念这类知识点,事不关己当然高高挂起,精准踩坑时那心情也的却是日了🐶请原谅我的粗俗,遇到B…

剪映自动批量替换视频、图片素材教程,视频批量复刻、混剪裂变等功能介绍

一、三种批量替换模式的区别 二、混剪裂变替换素材 三、分区混剪裂变替换素材 四、按组精确替换素材 五、绿色按钮教程 (一)如何附加音频和srt字幕 (二)如何替换固定文本的内容和样式 (三)如何附加…

【力扣】389.找不同

问题描述 思路解析 只有小写字母,这种设计参数小的,直接桶排序我最开始的想法是使用两个不同的数组,分别存入他们单个字符转换后的值,然后比较是否相同。也确实通过了 看了题解后,发现可以优化,首先因为t相…

HarmonyOS Next 模拟器安装与探索

HarmonyOS 5 也发布了有一段时间了,不知道大家实际使用的时候有没有发现一些惊喜。当然随着HarmonyOS 5的更新也带来了很多新特性,尤其是 HarmonyOS Next 模拟器。今天,我们就来探索一下这个模拟器,看看它能给我们的开发过程带来什…

net9 abp vnext 多语言通过数据库动态管理

通过数据库加载实现动态管理,用户可以自己修改界面显示的文本,满足国际化需求 如图所示,前端使用tdesign vnext 新建表TSYS_Localization与TSYS_LocalizationDetail 国旗图标下载网址flag-icons: Free Country Flags in SVG 在Shared下创建下图3个文件 …

ceph的用户管理和cephx认证

用户权限概述 用户格式 参考链接: 权限:https://docs.ceph.com/en/latest/rados/operations/user-management/#authorization-capabilities 用户:https://docs.ceph.com/en/reef/rados/operations/user-management/ ceph的用户格式TYPEID…

springboot340“共享书角”图书借还管理系统(论文+源码)_kaic

摘 要 随着社会的发展,图书借还的管理形势越来越严峻。越来越多的借阅者利用互联网获得信息,但图书借还信息量大。为了方便借阅者更好的获得本图书借还信息,因此,设计一种安全高效的“共享书角”图书借还管理系统极为重要。 为…

爬虫笔记24——纷玩岛自动抢票脚本笔记

纷玩岛自动抢票,协议抢票思路实现 一、获取Authorization凭证二、几个关键的参数三、几个关键的接口获取参数v,这个参数其实可以写死,可忽略通过价位获取演出的参数信息获取观演人信息,账号提前录入即可提交订单接口 先看实现图&a…

配置泛微e9后端开发环境

配置泛微e9的后端开发环境 1.安装jdk1.8(请自行安装并设置环境变量) 2.将服务器上的WEARVER文件夹拷贝到开发环境下(其中要包含ecology和Resin目录) 3.通过idea创建一个基础Java项目,将jdk设置为1.8 4.添加依赖,需要将3个文件夹的所有jar包添加到项目中…

52-基于单片机的超声波、温湿度、光照检测分阶段报警

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 1.通过DHT11模块读取环境温度和湿度: 2.将湿度、障碍物距显示在lcd1602上面,第一行显示温度和湿度,格式为:xxCyy%,第二行显示超声波传感器测得的距离,格式为:Di…

C++类的自动转换和强制类型转换

目录 一、类型转换 二、转换函数 一、类型转换 C⽀持内置类型隐式类型转换为类类型对象,需要有相关内置类型为参数的构造函数 简单说就是可以将内置类型转化为自定义类型 示例: class Test { public:Test(int n1 0):num1(n1){}void pr…

w~视觉~合集26

我自己的原文哦~ https://blog.51cto.com/whaosoft/12663170 #InternVL 本文设计了一个大规模的视觉-语言基础模型(InternVL),将视觉基础模型的参数扩展到60亿,并逐步与LLM对齐,利用来自不同来源的网络规模的图像-文…

C++优选算法十六 BFS解决最短路问题

1.BFS解决最短路问题的优势与局限 BFS是一种有效的解决最短路问题的算法,特别适用于无权图或边权相等的图。 优势: BFS能够逐层遍历图中的所有节点,直到找到目标节点或遍历完所有可达节点。对于无权图(即边权为1的图&#xff0…

服务器创建容器时报错: no main manifest attribute

1.出现问题的原因 springboot项目快速搭建完成以后&#xff0c;打包 > 制作容器 > 启动 在创建完成docker容器以后,启动时出现以下问题 查询了一下百度,说的是没有main文件信息, 2.解决方法 在pom文件里面加入以下代码即可 <plugins><plugin><groupI…

【小白学机器学习34】基础统计2种方法:用numpy的方法np().mean()等进行统计,pd.DataFrame.groupby() 分组统计

目录 1 用 numpy 快速求数组的各种统计量&#xff1a;mean, var, std 1.1 数据准备 1.2 直接用np的公式求解 1.3 注意问题 1.4 用print() 输出内容&#xff0c;显示效果 2 为了验证公式的背后的理解&#xff0c;下面是详细的展开公式的求法 2.1 均值mean的详细 2.2 方差…

无需插件,如何以二维码网址直抵3D互动新世界?

随着Web技术的飞速发展&#xff0c;一个无需额外插件&#xff0c;仅凭二维码或网址即可直接访问的三维互动时代已经悄然来临。这一变革&#xff0c;得益于WebGL技术与先进web3D引擎的完美融合&#xff0c;它们共同构建了51建模网这样一个既便捷又高效的在线三维互动平台&#x…

【前端】跨域问题与缓存

报错如下&#xff1a; 原因&#xff1a; 浏览器 缓存跨域&#xff0c;顾名思义是由于浏览器的缓存机制导致的一种跨域情况。这种跨域一般会出现在浏览器通过一些无视跨域的标签和css(如img、background-image)缓存了一些图片资源之后&#xff0c;当再次发起图片请求时&#xff…