学习threejs,光晕效果

news2024/10/9 14:30:57

👨‍⚕️ 主页: gis分享者
👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅!
👨‍⚕️ 收录于专栏:threejs gis工程师


文章目录

  • 一、🍀前言
  • 二、🍀光晕效果实现
    • 1. ☘️实现思路
    • 2. ☘️代码样例


一、🍀前言

本文详细介绍如何基于threejs在三维场景中实现光晕效果,亲测可用。希望能帮助到您。一起学习,加油!加油!

二、🍀光晕效果实现

1. ☘️实现思路

  • 1、初始化renderer渲染器
  • 2、初始化Scene三维场景
  • 3、初始化camera相机,定义相机位置 camera.position.set,设置相机方向camera.lookAt
  • 4、初始化THREE.AmbientLight环境光源,scene场景加入环境光源,初始化THREE.PointLight点光源,设置点光源位置,scene添加点光源。通过THREE.Lensflare实现光晕效果,场景scene添加光晕效果
  • 5、加载几何模型:创建SphereGeometry球体、BoxGeometry立方体、PlaneGeometry地面几何体以及AxisHelper辅助工具坐标系,Scene场景加入以上几何体和工具。
  • 6、加入controls控制,实现自动旋转,加入stats监控器,监控帧数信息

2. ☘️代码样例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>learn17(光晕)</title>
    <script src="lib/threejs/127/three.js-master/build/three.js"></script>
    <script src="lib/threejs/127/three.js-master/examples/js/objects/Lensflare.js"></script>
    <script src="lib/threejs/127/three.js-master/examples/js/controls/OrbitControls.js"></script>
    <script src="lib/threejs/127/three.js-master/examples/js/libs/stats.min.js"></script>
    <script src="lib/threejs/127/three.js-master/examples/js/libs/dat.gui.min.js"></script>
</head>
<style>
    body {
        margin: 0;
    }

    canvas {
        width: 100%;
        height: 100%;
        display: block;
    }
</style>
<body onload="draw();">
</body>
<script>
  var renderer
  var initRender = () => {
    renderer = new THREE.WebGLRenderer({antialias: true, alpha: true})
    renderer.shadowMap.enabled = true
    renderer.shadowMap.type = THREE.PCFSoftShadowMap
    // 背景色
    renderer.setClearColor(0x111111)
    // 如果设置,那么它期望所有纹理和颜色都是预乘伽马。默认值为false
    renderer.gammaInput = true
    //如果设置,那么它期望所有纹理和颜色需要以预乘伽马输出。默认值为false
    renderer.gammaOutput = true
    renderer.setSize(window.innerWidth, window.innerHeight)
    document.body.appendChild(renderer.domElement)
  }
  var scene
  var initScene = () => {
    scene = new THREE.Scene()
  }
  var camera
  var initCamera = () => {
    camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000)
    camera.position.set(400, -600, 100)
    camera.lookAt(new THREE.Vector3(-400, 600, -100))
  }
  var ambientLight, pointLight
  var initLight = () => {
    ambientLight = new THREE.AmbientLight('#111111')
    scene.add(ambientLight)

    pointLight = new THREE.PointLight('#ffffff')
    pointLight.position.set(-400, 600, -100)
    pointLight.castShadow = true
    scene.add(pointLight)

    var textureLoader = new THREE.TextureLoader()
    var textureFlare0 = textureLoader.load('lib/threejs/127/three.js-master/examples/textures/lensflare/lensflare0.png')
    var textureFlare2 = textureLoader.load('lib/threejs/127/three.js-master/examples/textures/lensflare/lensflare2.png')
    var textureFlare3 = textureLoader.load('lib/threejs/127/three.js-master/examples/textures/lensflare/lensflare3.png')

    var flareColor = new THREE.Color(0xffffff)
    flareColor.setHSL(0.55, 0.9, 1.0)

    var lensFlare = new THREE.Lensflare()
    lensFlare.addElement(new THREE.LensflareElement(textureFlare0, 500, 0, flareColor))
    lensFlare.addElement(new THREE.LensflareElement(textureFlare2, 512, 0.0))
    lensFlare.addElement(new THREE.LensflareElement(textureFlare2, 512, 0.0))
    lensFlare.addElement(new THREE.LensflareElement(textureFlare2, 512, 0.0))

    lensFlare.addElement(new THREE.LensflareElement(textureFlare3, 60, 0.6))
    lensFlare.addElement(new THREE.LensflareElement(textureFlare3, 70, 0.7))
    lensFlare.addElement(new THREE.LensflareElement(textureFlare3, 120, 0.9))
    lensFlare.addElement(new THREE.LensflareElement(textureFlare3, 70, 1.0))

    lensFlare.position.copy(pointLight.position)
    scene.add(lensFlare)
  }
  var stats
  var initStats = () => {
    stats = new Stats()
    document.body.appendChild(stats.dom)
  }
  var controls
  var initControls = () => {
    controls = new THREE.OrbitControls(camera, renderer.domElement)
    controls.enableDamping = true
    //是否自动旋转
    controls.autoRotate = true
    controls.autoRotateSpeed = 1
    controls.minDistance  = 1
    controls.maxDistance  = 200
  }
  var cube, sphere, plane
  var initModel = () => {
    var helper = new THREE.AxisHelper(10)
    scene.add(helper)

    var sphereGeometry = new THREE.SphereGeometry(10, 30, 30)
    var sphereMaterial = new THREE.MeshStandardMaterial({color: 0xff00ff})
    sphere = new THREE.Mesh(sphereGeometry, sphereMaterial)
    sphere.position.set(-20, 20, 0)
    sphere.castShadow = true
    scene.add(sphere)

    var cubeGeometry = new THREE.BoxGeometry(10, 10, 10)
    var cubeMaterial = new THREE.MeshLambertMaterial({color: 0x00ffff})
    cube = new THREE.Mesh(cubeGeometry, cubeMaterial)
    cube.position.set(30, 5, -5)
    cube.castShadow = true
    scene.add(cube)

    var planeGeometry = new THREE.PlaneGeometry(5000, 5000, 20, 20)
    var planeMaterial = new THREE.MeshLambertMaterial({color: 0xaaaaaa})
    plane = new THREE.Mesh(planeGeometry, planeMaterial)
    plane.rotation.x = -0.5 * Math.PI
    plane.position.y = -0
    plane.receiveShadow = true
    scene.add(plane)
  }
  var render = () => {
    renderer.render(scene, camera)
  }
  var onWindowResize = () => {
    camera.aspect = window.innerWidth / window.innerHeight
    camera.updateProjectionMatrix()
    render()
    renderer.setSize(window.innerWidth, window.innerHeight)
  }
  var animate = () => {
    render()
    stats.update()
    controls.update()
    requestAnimationFrame(animate)
  }
  var draw = () => {
    initRender()
    initScene()
    initCamera()
    initLight()
    initModel()
    initStats()
    initControls()

    animate()

    window.onresize = onWindowResize
  }
</script>
</html>

效果如下:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux环境变量及命令行参数

目录 一、环境变量的概念和基本命令 二、环境变量的组织结构及获取环境变量的方式 &#xff08;1&#xff09;组织结构 &#xff08;2&#xff09;获取环境变量 命令行第三个参数 通过第三方变量environ获取 通过系统调用getenv获取 三、命令行参数 一、环境变量的概念和…

ComfyUI 快速入门:从安装到使用的全面指南!

前言 在现代 AI 应用中&#xff0c;图像生成已成为一个热门话题。ComfyUI 是一个功能强大的工具&#xff0c;可以帮助用户轻松生成高质量的图像。本文将详细介绍如何在 Mac M系列&#xff08;我的电脑是M2的&#xff09; 和 Windows 上安装和使用 ComfyUI&#xff0c;从准备环…

Lumerical——Eigensolver Analysis

一、整体布局 上图显示的是“模式分析(MODE ANALYSIS )”窗口。①部分是模式列表 (MODE LIST)”,其中显示模式个数、反射率、传播损失、以及偏振方向。②部分显示的是计算参数;按照启动时设置,窗口左下角显示进行模拟计算用到的缺省参数。③部分包含模拟数据的“…

rpm软件包的制作方法

源码包制作成rpm包&#xff0c;可以在centos系列系统上平移 其他机器需要这个环境&#xff0c;把包发过去&#xff0c;就可以yum -y install new_pkg_name.rpm安装 比较方便 rpm包构建过程&#xff1a; 第一步&#xff1a;下载tar.gz源码包 在nginx官网下载自己准备用的版本&am…

查询效率提升近200倍!AntDB数据库助力医疗行业省级医保信息平台建设

导读&#xff1a; 本文介绍了在西北某省医保信息平台架构演进升级过程中&#xff0c;AntDB对于新建平台数据分析能力、数据同步能力、数据运维管理能力的提升。本次AntDB数据库多引擎能力的上线&#xff0c;解决了该医保系统数据同步不准确、数据查询结果不准确、复杂数据查询…

U盘数据丢失?这4款神器助你找回!

朋友们&#xff0c;今天咱们来聊聊U盘数据恢复工具&#xff1b;你是不是也遇到过U盘数据丢失的尴尬情况&#xff1f;别急&#xff0c;今天就让我来给你推荐几款好用的U盘数据恢复工具&#xff0c;并分享一下我的使用感受。 第一款&#xff1a;福昕数据恢复 直通车&#xff08;…

OBOO鸥柏:布局于为无人机展厅行产业提供LCD液晶显示终端

新华网快讯&#xff0c;于10月9日消息&#xff0c;有投资者在互动平台向OBOO鸥柏公司提问&#xff1a;您好&#xff01;目前有哪些工业/商用显示产品应用于无人机展厅展馆场景&#xff1f;能否着重介绍下贵司屏幕主要应用哪些品牌无人机数字化展厅展馆做保障&#xff1f; 鸥柏…

【ELKB】Kibana使用

搭建好ELKB后访问地址&#xff1a;http://localhost:5601 输入账号密码登录以后 左侧导航有home、Analysis、Enterprise search 、Observability、Security、Management home&#xff1a;首页Analysis&#xff1a;工具来分析及可视化数据Enterprise search&#xff1a;企业级搜…

原生USDC正式上线Sui

今天&#xff0c;标志着Sui生态的一个重要里程碑 — — 原生USDC现已正式在Sui主网上线。作为最广泛使用的稳定币之一&#xff0c;USDC为日益增长的Sui生态带来了稳定的价值传输和流动性。 随着Sui DeFi锁仓量&#xff08;TVL&#xff09;突破10亿美元&#xff0c;网络上需要更…

JAVA无人值守共享娱乐棋牌室系统源码

无人值守共享娱乐棋牌室系统——自由畅玩&#xff0c;尽享娱乐新风尚 &#x1f3b2; 开篇&#xff1a;无人值守&#xff0c;开启娱乐新纪元 在这个快节奏的时代&#xff0c;人们越来越追求便捷、高效的娱乐方式。而“无人值守共享娱乐棋牌室系统”正是这样一款应运而生的创新…

YOLOv11模型地址

地址链接 项目Git地址&#xff1a;https://github.com/ultralytics/ultralytics?tabreadme-ov-file

随机掉落的项目足迹:Element UI组件库 ElMessage 组件报错或样式丢失

问题引入 使用 Element UI 组件库时&#xff0c;如果用的是自动按需导入&#xff0c;那么就无需通过import语句导入组件&#xff0c;直接就能在项目里使用 但是 ElMessage 虽然可以正常使用&#xff0c;但是代码却会出现报错 虽然组件用起来没问题&#xff0c;但是这个报错看…

SpringBoot3响应式编程全套-Spring Webflux

目录 传送门前言一、组件对比二、WebFlux1、引入2、Reactor Core3、DispatcherHandler3.1、请求处理流程 4、注解开发4.1、目标方法传参4.2、返回值写法 5、文件上传6、错误处理7、RequestContext8、自定义Flux配置9、Filter 传送门 SpringMVC的源码解析&#xff08;精品&…

MATLAB - 四旋翼机器人上的飞行机械臂路径规划

系列文章目录 前言 本示例展示了如何使用 “浮动 ”类型的刚体关节&#xff08;rigidBodyJoint&#xff09;和操纵器RRT 为浮动基座系统规划无碰撞的几何路径。浮动基座系统的基座带有一个 “浮动 ”关节&#xff0c;可以在空间自由平移和旋转&#xff0c;因此具有六个自由度。…

Tita使用小技巧:项目类型自定义,业务管理个性化

应用场景 某互联网企业&#xff0c;企业内部有研发部&#xff0c;有销售部 研发部通常需要管理各种技术研发类型项目&#xff0c;因此需要管理「研发型」项目&#xff0c;该类型项目需要明确「所属产品」、「级别管理&#xff1a;国家级/省市级」、「项目类别&#xff1a;创新…

DS1302时钟模块(STM32)

目录 一、介绍 二、模块原理 1.原理图 2.引脚描述 3.工作原理&#xff1a;读/写时序 4.寄存器地址/定义 三、程序设计 main.c文件 ds1302.h文件 ds1302.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 DS1302是一款由达拉斯半导体&#xff08;Dallas Semic…

货拉拉冲刺上市:周胜馥已“套现”16亿元,被指经营管理问题突出

撰稿|多客 来源|贝多财经 10月2日&#xff0c;货拉拉以“拉拉科技控股有限公司-W&#xff08;简称“拉拉科技”&#xff0c;英文名&#xff1a;Lalatech&#xff09;”为主体更新递交招股书&#xff0c;继续冲刺港交所上市。此前&#xff0c;货拉拉曾分别于2023年3月、2023年…

面试中遇到的关于Transformer模型的问题有哪些?

Transformer是深度学习中极具影响力的模型架构之一&#xff0c;广泛应用于自然语言处理、计算机视觉等领域。它通过自注意力机制和并行计算等特点&#xff0c;取得了比传统模型&#xff08;如RNN、LSTM&#xff09;更优异的性能。本文将针对Transformer的多个关键问题进行详细探…

1,STM32CubeMX生成第一个freeRTOS工程

1&#xff0c;前言 本章内容是CubeMX工程配置freeRTOS的demo工程&#xff0c;后续其他本专栏文章中不再提及&#xff0c;默认在本章内容上完成。 单片机型号&#xff1a;STM32F407 编程环境 &#xff1a;STM32CubeMX Keil v5 2&#xff0c;STM32CubeMX新建工程 双击打开ST…

最新2024 LLM大模型学习路线图:从入门到精通的完整路径,收藏一下吧很难找全的!

ChatGPT的出现在全球掀起了AI大模型的浪潮&#xff0c;2023年可以被称为AI元年&#xff0c;AI大模型以一种野蛮的方式&#xff0c;闯入你我的生活之中。 从问答对话到辅助编程&#xff0c;从图画解析到自主创作&#xff0c;AI所展现出来的能力&#xff0c;超出了多数人的预料&…