返回顶部
首页 > 资讯 > 前端开发 > JavaScript >threejs太阳光与阴影效果实例代码
  • 475
分享到

threejs太阳光与阴影效果实例代码

2024-04-02 19:04:59 475人浏览 薄情痞子
摘要

目录前言灯光与材质基础篇太阳光整体调用代码太阳光类初始化设置平行光信息Tween总结前言 这篇文章实现智慧城市中模拟太阳光随时间变化产生对应场景效果。为了场景能够更逼真,我们一般会通

前言

这篇文章实现智慧城市中模拟太阳光随时间变化产生对应场景效果。为了场景能够更逼真,我们一般会通过对接天气以及阳光等各种环境因素同步到场景中,使得场景能够更贴近现实。比如一些常见的天气系统,下雨、下雪、阴天、雾霾等,我之后会独立一篇文章中提现。这边文章主要介绍一系列灯光,主要是平行光对于太阳的模仿,以及一些材质的问题~

灯光与材质基础篇

常见的灯光:

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

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

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

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

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

       - 网格基础材质(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中实时更新TWEEN
TWEEN.update()

初始化

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

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

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

如下图

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

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太阳光与阴影效果的文章就介绍到这了,更多相关threejs太阳光与阴影内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: threejs太阳光与阴影效果实例代码

本文链接: https://lsjlt.com/news/145004.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • threejs太阳光与阴影效果实例代码
    目录前言灯光与材质基础篇太阳光整体调用代码太阳光类初始化设置平行光信息Tween总结前言 这篇文章实现智慧城市中模拟太阳光随时间变化产生对应场景效果。为了场景能够更逼真,我们一般会通...
    99+
    2024-04-02
  • threejs太阳光与阴影效果怎么实现
    这篇文章主要介绍“threejs太阳光与阴影效果怎么实现”,在日常操作中,相信很多人在threejs太阳光与阴影效果怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”threejs太阳光与阴影效果怎么实现...
    99+
    2023-06-29
  • jquery实现div阴影效果示例代码
    复制代码 代码如下: <html> <head> <style> .mydiv1 {height:250px;width:250px;border...
    99+
    2022-11-15
    jquery div阴影
  • JavaScript canvas实现七彩太阳光晕效果
    本文实例为大家分享了JavaScript canvas实现七彩太阳光晕效果的具体代码,供大家参考,具体内容如下 <!DOCTYPE html> <html la...
    99+
    2024-04-02
  • Android实现流光和光影移动效果代码
    目录概述:实现思路:代码如下:注意点:概述: 开发过程中,看到有些界面用到一道光线在屏幕中掠过的效果,觉得挺炫的。所以查找相关资料自己实现了一遍。 先上个预览图: 实现思路: ...
    99+
    2024-04-02
  • cssz2box-shadow实现曲边阴影与翘边阴影效果
    小编给大家分享一下cssz2box-shadow实现曲边阴影与翘边阴影效果,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、曲边...
    99+
    2024-04-02
  • Qt实现部件透明及阴影效果的示例代码
    目录透明效果情况一情况二情况三情况四阴影效果透明效果 情况一 //窗口整个透明属性,取值为0-1,0为全透明 setWindowOpacity(0.5); 情况二 //部件...
    99+
    2024-04-02
  • css怎么实现曲边阴影与翘边阴影效果
    本篇内容主要讲解“css怎么实现曲边阴影与翘边阴影效果”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“css怎么实现曲边阴影与翘边阴影效果”吧!一、曲边阴影效果图如下:它不仅是四周有阴影,下部还有...
    99+
    2023-07-04
  • 怎么在CSS中实现文本阴影与元素阴影效果
    怎么在CSS中实现文本阴影与元素阴影效果?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。文本阴影介绍在CSS中使用text-shadow属性设置文本阴影,该属性一共有4个属性值如...
    99+
    2023-06-08
  • 怎么在JavaScript中使用canvas实现七彩太阳光晕效果
    今天就跟大家聊聊有关怎么在JavaScript中使用canvas实现七彩太阳光晕效果,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。具体内容如下<!DOCTYPE ht...
    99+
    2023-06-15
  • Android 自定义阴影效果详解及实例
    Android 自定义阴影效果详解及实例 Android5.X中,Google为其增加了两个属性 android:elevation=” ” 与 android:transla...
    99+
    2022-06-06
    自定义 Android
  • 如何使用HTML颜色代码创建阴影效果?
    阴影效果在网站设计中经常被用于突出元素,吸引用户注意或提供视觉深度。我们来看看如何利用 HTML 颜色代码实现阴影效果吧。 一、基础知识 HTML 颜色代码:用于设置元素的颜色,由16进制数字或颜色名称组成。 RGBA 颜色值: rgb...
    99+
    2024-02-14
    阴影, HTML, CSS, 代码
  • android xml实现按钮的圆角、阴影效果及按下变化效果的实现代码
    前言 5个xml文件实现 按钮的圆角、阴影效果以及按下变化效果 实现 drawable/shape.xml <?xml version="1.0" encoding...
    99+
    2024-04-02
  • React + Threejs + Swiper 实现全景图效果的完整代码
      咱先看看全景图实现效果:展示地址   截图:   体验了一下是不是感觉周围环境转了一圈,感觉世界是圆的?...
    99+
    2024-04-02
  • css如何实现阴影效果的设置与取消
    这篇文章主要为大家展示了css如何实现阴影效果的设置与取消,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带大家一起来研究并学习一下“css如何实现阴影效果的设置与取消”这篇文章吧。css是什么意思css是一种用来表现HTML...
    99+
    2023-06-06
  • Android 轻松实现图片倒影效果实例代码
    主Activity 代码如下:package com.mj.myweather;import android.app.Activity;import android.graph...
    99+
    2022-06-06
    图片 Android
  • Java实现去除文档阴影的示例代码
    目录一、前言二、实现原理1. 图像2. 灰度转换3.阈值处理三、代码实现1.读取图像2.阈值处理一、前言 文稿扫描大家用的都比较频繁、想是各种证件、文件都可以通过扫描文稿功能保存到手...
    99+
    2022-12-08
    Java去除文档阴影 Java去除阴影 Java 阴影
  • WPF实现文本描边+外发光效果的示例代码
    解决思路: (1)描边效果可以将文本字符串用GDI+生成Bitmap,然后转成BitmapImage,再用WPF的Image控件显示。 (2)外发光效果用WPF自带的Effect实现...
    99+
    2024-04-02
  • Python获取时光网电影数据的实例代码
    目录一、前言二、准备2.1 安装库2.2 原理介绍三、实例3.1 完整代码一、前言 有时候觉得电影真是人类有史以来最伟大的发明,我喜欢看电影,看电影可以让我们增长见闻,学习知识。从某...
    99+
    2024-04-02
  • Qt实现部件透明阴影效果与不规则窗体详解
    目录透明效果阴影效果不规则窗体效果透明效果 原始效果 设置整个窗体透明,调用setWindowOpacity( )方法,传入一个0~1之间的值来表示透明度;1表示不透明,0表示完全...
    99+
    2023-01-06
    Qt部件透明阴影 Qt部件透明 Qt部件阴影 Qt 不规则窗体
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作