我的编程空间,编程开发者的网络收藏夹
学习永远不晚

threejs太阳光与阴影效果怎么实现

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

threejs太阳光与阴影效果怎么实现

这篇文章主要介绍“threejs太阳光与阴影效果怎么实现”,在日常操作中,相信很多人在threejs太阳光与阴影效果怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”threejs太阳光与阴影效果怎么实现”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

灯光与材质基础篇

常见的灯光:

       - 点光源 (点光源可以理解为一个同时向四面八方散发光线,我们通常用来模拟灯泡,可以产生阴影)

       - 平行光 (平行光可以想象成一个从无限远照射来的光束,通常用来模拟太阳光,可以产生阴影)

       - 聚光灯 (聚光灯字面意思就是类似舞台灯光一样,照射突出特定圆弧形范围,可以产生阴影)

       - 环境光 (一般用于改变整体场景的亮度,也是最常用的光源之一)

这里提一嘴材质:(仅仅列举常用的)

       - 网格基础材质(MeshBasicMaterial,不支持阴影)

       - FBR材质

           - 物理标准材质(MeshStandardMaterial)

           - MeshPhysicalMaterial

           - 以上两者FBR材质相对于高光网格材质效果更好

       - MeshPhongMaterial(高光网格材质,高亮表面、镜面反射)

       - MeshLambertMaterial(网格Lambert材质,暗淡,漫反射)

这里简单做一下介绍,不懂的同学可以具体去了解某个材质

太阳光

添加平行光-----从东至西调整位置-----调整亮度以及颜色-----添加过渡模拟太阳光

接下来介绍本文的重点,如何模拟太阳光照的变化。其实原理非常简单,就是添加平行光,调整场景模型的阴影关系,根据时间实时变化平行光的位置以及光照强度以及颜色即可模拟~

整体调用代码

由于是一个demo,所以注重效果,一切从简实现功能

sun() { //两秒变化一次平行光  let i=0  setInterval(()=>{    this.initSun(i)    i++  },2000)}

简单实现通过定时器以及提前写好对应位置光照的信息。主要是思想,酌情根据自己的需求可以改变~

这里这么写主要是实现效果,真实的应该根据系统时间将太阳光做出调整,包括根据天气原因,换汤不换药,主要还是

手动调整并存储为json通过传入时间以及天气去做出转化~ 

Viewer.prototype.initSun = function (type) {  let position = {}  let color = '#ffffff'  let intensity = 1  switch (type) {    case 0:      position = {        x: 270,        y: 150,        z: 0      }      intensity = 5      break    case 1:      position = {        x: 258,        y: 170,        z: 0      }      intensity = 7      color = '#fcffc9'      break    case 2:      position = {        x: 245,        y: 180,        z: 0      }      intensity = 10      color = '#ffe69f'      break    case 3:      position = {        x: 0,        y: 100,        z: 0      }      intensity = 15      color = '#ffe69f'      break    case 4:      position = {        x: -245,        y: 180,        z: 0      }      intensity = 10      color = '#e3894d'      break    case 5:      position = {        x: -258,        y: 160,        z: 0      }      intensity = 10      color = '#ff8400'      break    default :      position = {        x: -270,        y: 150,        z: 0      }      intensity = 8      color = '#ff8400'      break  }  if (this.directionalLight) {    this.directionalLight.setSun(position,color,intensity)  } else {    this.directionalLight = new zhdSun()    this.directionalLight.renderFn(this.renderFunction)    this.directionalLight.init({      position,      color,      intensity,      scene: this.scene,      currentlayers: this.currentlayers    })  }}

太阳光类

这里主要对太阳光类的拆解与分析,封装的比较粗糙,酌情个人可以优化

import TWEEN from '@tweenjs/tween.js'import {zhdObject} from './zhdObject'export class zhdSun extends zhdObject {  constructor() {    super()    this.light = null  }}//由于添加了TWEEN动画库,记得在animate中实时更新TWEENTWEEN.update()

初始化

这里做的是向场景中添加平行光,设置其阴影的范围以及距离等属性,因为我这边涉及层级,所以设置了平行光的层级

平行光可谓是所有灯光中阴影调整最麻烦的,想要平行光能够产生对的阴影效果,模型的产生阴影以及接收阴影要调整好,并且平行光的照射范围也要调整好。我效果图中不知大家有没有发现,在正午时刻的时候太阳光照射地面产生了一个长方形的范围阴影,这里是特地录制一个相对不那么完美的版本。

产生原因:平行光范围太小,但是一旦你调整平行光范围过大,由于地面是通过多个瓦片加载的,就会出现条纹状的阴影

如下图

解决方法:调整平行光阴影的bias属性,有助于减少阴影中的伪影

threejs太阳光与阴影效果怎么实现

init({position, color, intensity , currentlayers, scene}) {  const directionalLight = new THREE.DirectionalLight(color, intensity) // 新建一个平行光源,颜色未白色,强度为1  this.light = directionalLight  directionalLight.position.set(position.x, position.y, position.z) // 将此平行光源调整到一个合适的位置  directionalLight.castShadow = true // 将此平行光源产生阴影的属性打开  // 设置平行光的的阴影属性,即一个长方体的长宽高,在设定值的范围内的物体才会产生阴影  const d =100 //阴影范围  directionalLight.shadow.camera.left = -d  directionalLight.shadow.camera.right = d  directionalLight.shadow.camera.top = d  directionalLight.shadow.camera.bottom = -d  directionalLight.shadow.camera.near = 20  directionalLight.shadow.camera.far = 8000  directionalLight.shadow.mapSize.x = 2048 // 定义阴影贴图的宽度和高度,必须为2的整数此幂  directionalLight.shadow.mapSize.y = 2048 // 较高的值会以计算时间为代价提供更好的阴影质量  directionalLight.shadow.bias = -0.0005 //解决条纹阴影的出现  this.setlayers(directionalLight, currentlayers)  scene.add(directionalLight) // 将此平行光源加入场景中,我们才可以看到这个光源  return directionalLight}

设置平行光信息

设置平行光的信息:包括位置、颜色、强度

setSun(position, color, intensity) {  this.setTweens(this.light.position, position, 2000)  this.light.color = new THREE.Color( color )  this.light.intensity = intensity}

Tween

这里简单介绍TWEEN不懂的可以去看我之前的文章,主要是一个动画库,这里做简单的封装

setTweens(obj, newObj, duration = 1500) {  var ro = new TWEEN.Tween(obj)  ro.to(newObj, duration) // 变化后的位置以及动画时间  ro.easing(TWEEN.Easing.Sinusoidal.InOut)  ro.onUpdate(function () {  })  ro.start()}

到此,关于“threejs太阳光与阴影效果怎么实现”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

threejs太阳光与阴影效果怎么实现

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

threejs太阳光与阴影效果怎么实现

这篇文章主要介绍“threejs太阳光与阴影效果怎么实现”,在日常操作中,相信很多人在threejs太阳光与阴影效果怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”threejs太阳光与阴影效果怎么实现
2023-06-29

css怎么实现曲边阴影与翘边阴影效果

本篇内容主要讲解“css怎么实现曲边阴影与翘边阴影效果”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“css怎么实现曲边阴影与翘边阴影效果”吧!一、曲边阴影效果图如下:它不仅是四周有阴影,下部还有
2023-07-04

css阴影效果怎么实现

这篇文章主要介绍“css阴影效果怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“css阴影效果怎么实现”文章能帮助大家解决问题。box-shadow属性可以设置一个或多个下拉阴影的框。CSS3
2023-07-04

Android怎么实现阴影效果

这篇文章主要介绍了Android怎么实现阴影效果的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Android怎么实现阴影效果文章都会有所收获,下面我们一起来看看吧。实现形式elevationMaterial D
2023-07-02

CSS怎么实现阴影效果

这篇文章给大家分享的是有关CSS怎么实现阴影效果的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。box-shadow:用来添加阴影。它有四个属性:横坐标偏移量(相对于元素的左上角定点);纵坐标偏移量(相对于元素的左
2023-06-27

怎么在CSS中实现文本阴影与元素阴影效果

怎么在CSS中实现文本阴影与元素阴影效果?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。文本阴影介绍在CSS中使用text-shadow属性设置文本阴影,该属性一共有4个属性值如
2023-06-08

怎么在JavaScript中使用canvas实现七彩太阳光晕效果

今天就跟大家聊聊有关怎么在JavaScript中使用canvas实现七彩太阳光晕效果,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。具体内容如下
2023-06-15

CSS怎么实现滚动阴影效果

这篇文章主要为大家展示了CSS怎么实现滚动阴影效果,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带大家一起来研究并学习一下“CSS怎么实现滚动阴影效果”这篇文章吧。css是什么意思css是一种用来表现HTML或XML等文件样
2023-06-06

css怎么实现悬浮效果的阴影

这篇文章主要介绍了css怎么实现悬浮效果的阴影,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。要实现的效果图:实现的代码:-webkit-box-shadow:0px 3px
2023-06-08

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录