学习threejs,添加环境光和点光源

news2024/9/28 7:24:58

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


文章目录

  • 一、🍀前言
  • 二、🍀绘制任意字体模型
    • 1. ☘️实现思路
    • 2. ☘️代码样例


一、🍀前言

本文详细介绍如何基于threejs在三维场景中添加环境光和点光源,亲测可用。希望能帮助到您。一起学习,加油!加油!

二、🍀绘制任意字体模型

1. ☘️实现思路

  • 1、初始化renderer渲染器
  • 2、初始化Scene三维场景
  • 3、初始化camera相机,定义相机位置 camera.position.set,设置相机方向camera.lookAt
  • 4、初始化THREE.AmbientLight环境光,scene场景加入环境光,初始化THREE.PointLight点光源,设置点光源位置,设置设置投掷阴影为true,scene添加点光源
  • 5、初始化gui工具,定义控制灯光和立方体模型位置的函数
  • 6、加载几何模型:创建BoxGeometry立方体、PlaneGeometry地面几何体以及AxisHelper辅助工具坐标系,Scene场景加入以上几何体和工具。
  • 7、加入controls控制,加入stats监控器,监控帧数信息

2. ☘️代码样例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>learn12(添加环境光THREE.AmbientLight和点光源THREE.PointLight)</title>
    <script src="lib/threejs/127/three.js-master/build/three.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})
    renderer.setSize(window.innerWidth, window.innerHeight)
    renderer.shadowMap.enabled = true
    renderer.shadowMap.type = THREE.PCFSoftShadowMap
    document.body.appendChild(renderer.domElement)
  }
  var camera
  var initCamera = () => {
    camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000)
    camera.position.set(0, 40, 100)
    camera.lookAt(new THREE.Vector3(0, 0, 0))
  }
  var scene
  var initScene = () => {
    scene = new THREE.Scene()
  }
  var ambientLight, pointLight
  var initLight = () => {
    ambientLight = new THREE.AmbientLight('#111111')
    scene.add(ambientLight)

    pointLight = new THREE.PointLight('#ffffff')
    pointLight.position.set(15, 30, 10)

    pointLight.castShadow = true
    scene.add(pointLight)
  }
  var gui
  var initGui = () => {
    gui = {
      ambientLight: '#111111', //环境光源
      pointLight: '#ffffff', //点光源
      lightY: 30, //灯光y轴的位置
      distance: 0, //点光源距离
      intensity: 1, //灯光强度
      visible: true //是否可见
    }
    var datGui = new dat.GUI()
    datGui.addColor(gui, 'ambientLight').onChange(e => {
      ambientLight.color = new THREE.Color(e)
    })
    datGui.addColor(gui, 'pointLight').onChange(e => {
      pointLight.color = new THREE.Color(e)
    })
    datGui.add(gui, "lightY", 0, 100)
    datGui.add(gui, 'distance', 0, 100).onChange(function (e) {
      pointLight.distance = e
    })
    datGui.add(gui, 'intensity', 0, 5).onChange(function (e) {
      pointLight.intensity = e
    })
    datGui.add(gui, 'visible').onChange(function (e) {
      pointLight.visible = e
    })
  }
  var cube
  var initModel = () => {
    var helper = new THREE.AxesHelper(10)
    scene.add(helper)

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

    var planeGeometry = new THREE.PlaneGeometry(100, 100)
    var planeMaterial = new THREE.MeshLambertMaterial({color: 0xaaaaaa})

    var plane = new THREE.Mesh(planeGeometry, planeMaterial)
    plane.rotation.x = -0.5 * Math.PI
    plane.position.y = -0

    plane.receiveShadow = true
    scene.add(plane)
  }

  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
  }
  // 进行渲染
  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()
    pointLight.position.y = gui.lightY
    controls.update()
    requestAnimationFrame(animate)
  }

  var draw = () => {
    initGui()
    initRender()
    initScene()
    initCamera()
    initLight()
    initModel()
    initControls()
    initStats()

    animate()

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

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

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

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

相关文章

人工智能之机器学习常见算法

摘要 之前一直对机器学习很感兴趣,一直没时间去研究,今天刚好是周末,有时间去各大技术论坛看看,刚好看到一篇关于机器学习不错的文章,在这里就分享给大家了. 机器学习无疑是当前数据分析领域的一个热点内容。很多人在平时的工作中都或多或少会用到机器学习的算法。这里IT经理网…

【Linux实践】实验六:LINUX系统管理

【Linux实践】实验六&#xff1a;LINUX系统管理 实验目的实验内容实验步骤及结果1. 包管理工具2. VMware Tools3. 修改主机名4. 网络配置① 临时修改② 永久修改 5. 查找文件6. 前后台执行7. 查看进程8. 结束进程 实验目的 4、掌握Linux下软件包管理&#xff0c;包括命令rpm、…

公交IC卡收单管理系统 多处 SQL注入致RCE漏洞复现

0x01 产品简介 公交IC卡收单管理系统是城市公共交通领域中不可或缺的一部分,它通过集成先进的集成电路技术(IC卡)实现了乘客便捷的支付方式,并有效提高了公共交通运营效率。系统集成了发卡、充值、消费、数据采集、查询和注销等多个功能模块,为公交公司和乘客提供了全面、…

领夹麦克风哪个品牌音质最好,主播一般用什么麦克风

在这个信息爆炸的时代&#xff0c;清晰的声音传达显得尤为重要。无论是激情澎湃的演讲&#xff0c;还是温馨动人的访谈&#xff0c;一款优质的无线领夹麦克风都能让声音清晰的传播。但市场上产品繁多&#xff0c;如何挑选出性价比高、性能卓越的无线领夹麦克风呢&#xff1f;本…

c4d.python 旋转一个对象

How to Rotate an Object 第一种方法 import c4ddef main():selected doc.GetActiveObject()if selected:#获取这个物体的矩阵,设置它的偏移再设置回来.mg selected.GetMg()mg c4d.utils.MatrixRotY(c4d.utils.DegToRad(45.))selected.SetMg(mg)main() 第二种方法 import…

图书系统|图书个性化推荐系统|基于springboot的图书个性化推荐系统设计与实现(源码+数据库+文档)

图书个性化推荐系统目录 目录 基于springboot的图书个性化推荐系统设计与实现 一、前言 二、系统功能设计 三、系统实现 四、数据库设计 1、实体ER图 2、具体的表设计如下所示&#xff1a; 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#x…

Web 自动化实战经验硬核总结

一、元素定位常用方法 1. xpath规则说明 "/" : 表示从根节点选取 "//" : 从匹配选择的当前节点选择 "" : 选取属性 "*" : 匹配任何元素节点 "*" : 匹配任何属性节点 1.1 属性使用说明 placeholder 用法&#xff1a…

游戏录制没有声音怎么办?简单的解决方法分享

在享受游戏乐趣的同时&#xff0c;不少玩家也喜欢通过录制游戏视频来分享自己的精彩瞬间或是攻略心得。然而&#xff0c;有时在满心欢喜地开始录制后&#xff0c;却发现录制的视频竟然没有声音&#xff0c;这无疑是一大遗憾&#xff0c;今天我们就来看看这个问题怎么解决吧~ 游…

vue 中获取数值但是只获取到了 Promise 属性,获取不到其中的值

左边的请求能获取到数据&#xff0c;右边的不行&#xff1f; 改成这样即可

即插即用篇 | YOLOv8 引入单头视觉Transformer模块 | CVPR 2024

本改进已同步到YOLO-Magic框架! 最近,高效的视觉Transformer在资源受限的设备上以低延迟表现出了出色的性能。传统上,它们在宏观层面上采用44的Patch嵌入和四阶段结构,而在微观层面上使用多头配置的复杂注意力机制。本文旨在通过内存高效的方式解决各个设计层面的计算冗余问…

Python 从入门到实战28(文件的读操作)

我们的目标是&#xff1a;通过这一套资料学习下来&#xff0c;通过熟练掌握python基础&#xff0c;然后结合经典实例、实践相结合&#xff0c;使我们完全掌握python&#xff0c;并做到独立完成项目开发的能力。 上篇文章我们讨论了文件的打开、创建、关闭的相关知识。今天我们将…

9_25_对话框

QColorDialog&#xff08;调色板对话框&#xff09; void MainWindow::on_pushButton_clicked() { // //创建一个调色板对话框 // QColorDialog* dialog new QColorDialog(this); // //设置调色板对话框的初始值,不调整默认是白色 // dialog->setCurrentColor(…

edu某智慧平台 ExpDownloadService.aspx接口任意文件读取漏洞复现 [附POC]

文章目录 edu某智慧平台 ExpDownloadService.aspx接口任意文件读取漏洞复现 [附POC]0x01 前言0x02 漏洞环境0x03 漏洞复现1.访问漏洞环境2.构造POC3.复现edu某智慧平台 ExpDownloadService.aspx接口任意文件读取漏洞复现 [附POC] 0x01 前言 免责声明:请勿利用文章内的相关技…

考虑电网交互及禁止运行区的风电、光伏与火电互补调度运行(MATLAB-Yalmip-Cplex全代码)

针对火电机组在某些区域存在禁止运行区(POR)的问题,若直接在yalmip中设置变量x约束:constraints = [Ppor_min<=x<=Ppor_max];,则造成的离散优化空间无法求解。 然而,我们可以借用yalmip越发完善的函数处理该约束。即在 YALMIP 中,implies 函数用于表示蕴含关系,…

记一次堆内存泄漏排查过程

记一次堆内存泄漏排查过程 前言定位问题 前言 写了一个升级脚本&#xff0c;执行过程中给内存干爆了&#xff0c;不作处理&#xff0c;自己又好了&#xff0c;神奇吗&#xff1f; 日志中内存溢出:java.lang.OutOfMemoryError: Java heap space 定位问题 top命令查看最耗CPU…

OceanBase云数据库战略实施两年,受零售、支付、制造行业青睐

2022年OceanBase推出云数据库产品OB Cloud,正式启动云数据库战略。两年来OB Cloud发展情况如何&#xff0c;9月26日&#xff0c;OceanBase公有云事业部总经理尹博学向记者作了介绍。 尹博学表示&#xff0c;OB Cloud推出两年以来&#xff0c;已服务超过700家客户&#xff0c;客…

遥感图像语义分割数据集制作(使用ArcGIS Pro)

0. 引言 图像分割就是把图像空间按照一定的要求分成一些“有意义”的区域的技术叫图像分割。一幅图像通常是由代表物体的图案与背景组成&#xff0c;简称物体与背景。若想从一幅图像中“提取”物体&#xff0c;可以设法用专门的方法标出属于该物体的点&#xff0c;如把物体上的…

鸿蒙界面开发(九):列表布局 (List)

列表布局 当列表项达到一定数量&#xff0c;内容超过屏幕大小时&#xff0c;可以自动提供滚动功能。它适合用于呈现同类数据类型或数据类型集&#xff0c;例如图片和文本。在列表中显示数据集合是许多应用程序中的常见要求&#xff08;如通讯录、音乐列表、购物清单等&#xf…

【动态规划-多重背包】【hard】力扣2585. 获得分数的方法数

考试中有 n 种类型的题目。给你一个整数 target 和一个下标从 0 开始的二维整数数组 types &#xff0c;其中 types[i] [counti, marksi] 表示第 i 种类型的题目有 counti 道&#xff0c;每道题目对应 marksi 分。 返回你在考试中恰好得到 target 分的方法数。由于答案可能很…

mac 上配置Jmeter代理进行web脚本录制过程容易踩坑的点

macOS 配置 Jmeter代理录制web脚本&容易踩坑的点 mac配置下载&#xff1a;前景提要&#xff1a;Jmeter中具体操作容易踩坑的点1、进入浏览器后&#xff0c;显示访问连接不安全。2、证书失效需要重新生成3、重新生成证书的方式4、没有生成新的证书5、jmeter安装路径找不到 m…