学习threejs,scene.overrideMaterial全局材质效果

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

文章目录

  • 一、🍀前言
    • 1.2 ☘️THREE.Scene 场景
    • 1.2 ☘️overrideMaterial 全局材质
  • 二、🍀scene.overrideMaterial全局材质效果
    • 1. ☘️实现思路
    • 2. ☘️代码样例


一、🍀前言

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

1.2 ☘️THREE.Scene 场景

THREE.Scene场景允许你在什么地方、摆放什么东西来交给three.js来渲染,这是你放置物体、灯光和摄像机的地方。
构造函数:
Scene()
创建一个新的场景对象。
属性:
.fog : Fog
一个fog实例定义了影响场景中的每个物体的雾的类型。默认值为null。
.overrideMaterial : Material
如果不为空,它将强制场景中的每个物体使用这里的材质来渲染。默认值为null。
.autoUpdate : boolean
默认值为true,若设置了这个值,则渲染器会检查每一帧是否需要更新场景及其中物体的矩阵。 当设为false时,你必须亲自手动维护场景中的矩阵。
.background : Object
若不为空,在渲染场景的时候将设置背景,且背景总是首先被渲染的。 可以设置一个用于的“clear”的Color(颜色)、一个覆盖canvas的Texture(纹理),或是一个CubeTexture。默认值为null。
方法:
.toJSON : JSON
使用JSON格式返回场景数据。
.dispose () : null
清除WebGLRenderer内部所缓存的场景相关的数据。

1.2 ☘️overrideMaterial 全局材质

scene.overrideMaterial用于覆盖场景中所有对象的材质属性‌。通过设置scene的overrideMaterial属性,可以统一修改场景中所有对象的材质,适用于需要统一调整场景色彩或材质效果的情况。另外scene中的对象设置其他材质都会被覆盖。例如,可以使用overrideMaterial属性来实现全场景边缘发光的特效,或者调整场景中所有对象的材质颜色‌。

二、🍀scene.overrideMaterial全局材质效果

1. ☘️实现思路

  • 1、初始化renderer渲染器
  • 2、初始化Scene三维场景scene,设置scene.overrideMaterial场景全材质为THREE.MeshLambertMaterial漫反射材质对象。
  • 3、初始化camera相机,定义相机位置 camera.position,定义相机方向camera.lookAt。
  • 4、初始化THREE.AmbientLight环境光源,scene场景加入环境光源,初始化THREE.SpotLight聚光灯光源,设置聚光灯光源位置,设置聚光灯光源投影,scene添加聚光灯光源。
  • 5、加载几何模型:创建THREE.PlaneGeometry平面几何体planeGeometry,创建THREE.MeshLambertMaterial漫反射材质planeMaterial,传入参数planeGeometry和planeMaterial创建平面几何体网格对象plane,设置plane投影,设置plane的位置和旋转角度,场景scene中加入plane。
  • 6、加入gui控制,实现添加旋转的立方体(材质颜色使用随机颜色,被scene.overrideMaterial全局材质替代,为同一个颜色)、移除已添加的立方体、打印加入的立方体、调整旋转速度等方法,具体实现参考代码样例。加入stats监控器,监控帧数信息。

2. ☘️代码样例

<!DOCTYPE html><html>
<head><title>scene.overrideMaterial全局材质效果</title><script type="text/javascript" src="../libs/three.js"></script><script type="text/javascript" src="../libs/stats.js"></script><script type="text/javascript" src="../libs/dat.gui.js"></script><style>body {/* set margin to 0 and overflow to hidden, to go fullscreen */margin: 0;overflow: hidden;}</style>
</head>
<body><div id="Stats-output">
</div>
<div id="WebGL-output">
</div><!-- Javascript code that runs our Three.js examples -->
<script type="text/javascript">// once everything is loaded, we run our Three.js stuff.function init() {var stats = initStats();var scene = new THREE.Scene();scene.overrideMaterial = new THREE.MeshLambertMaterial({color: 0xffffff});var camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000);var renderer = new THREE.WebGLRenderer();renderer.setClearColor(new THREE.Color(0xEEEEEE, 1.0));renderer.setSize(window.innerWidth, window.innerHeight);renderer.shadowMapEnabled = true;// create the ground planevar planeGeometry = new THREE.PlaneGeometry(60, 40, 1, 1);var planeMaterial = new THREE.MeshLambertMaterial({color: 0xffffff});var plane = new THREE.Mesh(planeGeometry, planeMaterial);plane.receiveShadow = true;// rotate and position the planeplane.rotation.x = -0.5 * Math.PI;plane.position.x = 0;plane.position.y = 0;plane.position.z = 0;// add the plane to the scenescene.add(plane);// position and point the camera to the center of the scenecamera.position.x = -30;camera.position.y = 40;camera.position.z = 30;camera.lookAt(scene.position);// add subtle ambient lightingvar ambientLight = new THREE.AmbientLight(0x0c0c0c);scene.add(ambientLight);// add spotlight for the shadowsvar spotLight = new THREE.SpotLight(0xffffff);spotLight.position.set(-40, 60, -10);spotLight.castShadow = true;scene.add(spotLight);// add the output of the renderer to the html elementdocument.getElementById("WebGL-output").appendChild(renderer.domElement);// call the render functionvar step = 0;var controls = new function () {this.rotationSpeed = 0.02;this.numberOfObjects = scene.children.length;this.removeCube = function () {var allChildren = scene.children;var lastObject = allChildren[allChildren.length - 1];if (lastObject instanceof THREE.Mesh) {scene.remove(lastObject);this.numberOfObjects = scene.children.length;}};this.addCube = function () {var cubeSize = Math.ceil((Math.random() * 3));var cubeGeometry = new THREE.BoxGeometry(cubeSize, cubeSize, cubeSize);var cubeMaterial = new THREE.MeshLambertMaterial({color: Math.random() * 0xffffff});var cube = new THREE.Mesh(cubeGeometry, cubeMaterial);cube.castShadow = true;// position the cube randomly in the scenecube.position.x = -30 + Math.round((Math.random() * planeGeometry.parameters.width));cube.position.y = Math.round((Math.random() * 5));cube.position.z = -20 + Math.round((Math.random() * planeGeometry.parameters.height));// add the cube to the scenescene.add(cube);this.numberOfObjects = scene.children.length;};this.outputObjects = function () {console.log(scene.children);}};var gui = new dat.GUI();gui.add(controls, 'rotationSpeed', 0, 0.5);gui.add(controls, 'addCube');gui.add(controls, 'removeCube');gui.add(controls, 'outputObjects');gui.add(controls, 'numberOfObjects').listen();render();function render() {stats.update();// rotate the cubes around its axesscene.traverse(function (e) {if (e instanceof THREE.Mesh && e != plane) {e.rotation.x += controls.rotationSpeed;e.rotation.y += controls.rotationSpeed;e.rotation.z += controls.rotationSpeed;}});// render using requestAnimationFramerequestAnimationFrame(render);renderer.render(scene, camera);}function initStats() {var stats = new Stats();stats.setMode(0); // 0: fps, 1: ms// Align top-leftstats.domElement.style.position = 'absolute';stats.domElement.style.left = '0px';stats.domElement.style.top = '0px';document.getElementById("Stats-output").appendChild(stats.domElement);return stats;}}window.onload = init</script>
</body>
</html>

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

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

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

相关文章

GTID详解

概念和组成 1&#xff0c;全局事务表示&#xff1a;global transaction identifiers 2, GTID和事务一一对应&#xff0c;并且全局唯一 3&#xff0c;一个GTID在一个服务器上只执行一次 4&#xff0c;mysql 5.6.5开始支持 组成 GTID server_uuid:transaction_id 如&#xf…

prober.php探针

raw.githubusercontent.com/kmvan/x-prober/master/dist/prober.php

差分矩阵(Difference Matrix)与累计和矩阵(Running Sum Matrix)的概念与应用:中英双语

本文是学习这本书的笔记: https://web.stanford.edu/~boyd/vmls/ 差分矩阵&#xff08;Difference Matrix&#xff09;与累计和矩阵&#xff08;Running Sum Matrix&#xff09;的概念与应用 在线性代数和信号处理等领域中&#xff0c;矩阵运算常被用来表示和计算各种数据变换…

EasyPlayer.js播放器Web播放H.265要兼顾哪些方面?

在数字化时代&#xff0c;流媒体技术已经成为信息传播和娱乐消费的重要方式。随着互联网技术的飞速发展和移动设备的普及&#xff0c;流媒体服务正在重塑我们的生活和工作方式。从视频点播、在线直播到音乐流媒体&#xff0c;流媒体技术的广泛应用不仅改变了内容的分发和消费模…

AI开发:支持向量机(SVM)鸢尾花模型入门教程- Python 机器学习

最近接触了一些数据分析的任务&#xff0c;越来越多地听到支持向量机(SVM), 之前我们也一起学习过 AI开发&#xff1a;支持向量机&#xff08;SVM&#xff09;入门教程- Python 机器学习 今天我们再由浅入深的地来重温和学习这个AI算法&#xff0c;以便我们进一步掌握如何熟悉…

Pytorch实战|猴痘病识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 一、 前期准备 1. 设置GPU 如果设备上支持GPU就使用GPU,否则使用CPU import torch import torch.nn as nn import torchvision.transforms as transforms im…

使用pyinstaller打包pyqt的程序,运行后提示ModuleNotFoundError: No module named ‘Ui_main‘

环境&#xff1a;windowpython3.9pyqt6 使用pyqt UI编辑器生成了main.ui &#xff0c;main.ui编译成了Ui_main.py main.py 使用当前目录下的Ui_main.py。 打包过程没报错&#xff0c;运行报错。 错误如下: 解决方法&#xff1a;pyinstaller -Fw main.py --paths. 使…

Vue2 router相关记录

vue-router 安装与配置 vue2 得用vue-router3 npm i vue-router3vue3 得用vue-router4 建立一个文件夹router index.js import About from "/components/About.vue"; import Home from "/components/Home.vue";const router new VueRouter({routes: …

基于linux下实现的ping程序(C语言)

linux下实现的ping程序 一、设计目的 PING程序是我们使用的比较多的用于测试网络连通性的程序。PING程序基于ICMP&#xff0c;使用ICMP的回送请求和回送应答来工作。由计算机网络课程知道&#xff0c;ICMP是基于IP的一个协议&#xff0c;ICMP包通过IP的封装之后传递。 课程设…

2024年12月16日Github流行趋势

项目名称&#xff1a;PDFMathTranslate 项目维护者&#xff1a;Byaidu reycn hellofinch Wybxc YadominJinta项目介绍&#xff1a;基于 AI 完整保留排版的 PDF 文档全文双语翻译&#xff0c;支持 Google/DeepL/Ollama/OpenAI 等服务&#xff0c;提供 CLI/GUI/Docker。项目star数…

国标GB28181协议平台Liveweb:搭建建筑工地无线视频联网监控系统方案

随着科技高速发展&#xff0c;视频信号经过数字压缩&#xff0c;通过互联网宽带或者移动4G网络传递&#xff0c;可实现远程视频监控功能。将这一功能运用于施工现场安全管理&#xff0c;势必会大大提高管理效率&#xff0c;提升监管层次。而这些&#xff0c;通过Liveweb监控系统…

Ansible playbook 详解与实战操作

一、概述 playbook 与 ad-hoc 相比,是一种完全不同的运用 ansible 的方式&#xff0c;类似与 saltstack 的 state 状态文件。ad-hoc 无法持久使用&#xff0c;playbook 可以持久使用。 playbook 是由一个或多个 play 组成的列表&#xff0c;play 的主要功能在于将事先归并为一…

电脑玩《刺客信条》时中,遇到找不到d3dx9_42.dll的问题是什么原因?缺失d3dx9_42.dll应该怎么解决呢?下面一起来看看吧!

电脑玩《刺客信条》时&#xff0c;找不到d3dx9_42.dll的原因及解决办法 对于许多热爱《刺客信条》这款游戏的玩家来说&#xff0c;在游戏中遇到找不到d3dx9_42.dll的问题无疑是非常令人头疼的。这一错误不仅会导致游戏无法启动&#xff0c;还可能引发运行过程中的图形错误、卡…

Apache Solr RCE(CVE-2017-12629)--vulhub

Apache Solr 远程命令执行漏洞&#xff08;CVE-2017-12629&#xff09; Apache Solr 是一个开源的搜索服务器。Solr 使用 Java 语言开发&#xff0c;主要基于 HTTP 和 Apache Lucene 实现。原理大致是文档通过Http利用XML加到一个搜索集合中。查询该集合也是通过 http收到一个…

Mysql索引类型总结

按照数据结构维度划分&#xff1a; BTree 索引&#xff1a;MySQL 里默认和最常用的索引类型。只有叶子节点存储 value&#xff0c;非叶子节点只有指针和 key。存储引擎 MyISAM 和 InnoDB 实现 BTree 索引都是使用 BTree&#xff0c;但二者实现方式不一样&#xff08;前面已经介…

中间件 redis安装

redis官网地址&#xff1a;Redis - The Real-time Data Platform 环境 CentOS Linux release 7.9.2009 (Core) java version "17.0.12" 2024-07-16 LTS 1、通过压缩包安装redis 1&#xff0c;远程下载redis压缩包&#xff0c;或去官网下载&#xff1a;Downloads …

台球助教平台系统开发APP和小程序信息收藏功能需求解析(第十二章)

以下是开发台球助教系统客户端&#xff08;APP&#xff0c;小程序&#xff0c;H5&#xff09;几端的信息收藏功能的详细需求和功能说明&#xff0c;内容比较详细&#xff0c;可以说是一个教科书式的详细说明了&#xff0c;这套需求说明不仅仅用在我们的台球助教系统程序上&…

freertos入门---堆的概念

freertos入门—堆的概念 堆就是一块空闲的内存。下面举个例子更好的理解堆的概念&#xff1a;   堆是一块空闲的内存&#xff0c;我们可以定义一个数组char heap_buf[1024]&#xff0c;可以看到该数组就是一个空闲的内存&#xff0c;我们只需要在它上面实现内存的分配和释放那…

操作系统(17)文件和文件系统

一、文件 定义&#xff1a;文件是数据的有序集合&#xff0c;是用户存储信息于辅存的基本逻辑单位。文件可以是字符流构成的无结构文件&#xff0c;也可以是包含相似记录的结构化文件。 类型&#xff1a; 按性质和用途&#xff1a;系统文件&#xff08;由系统软件构成的文件&a…

ASP.NET|日常开发中读写TXT文本详解

ASP.NET&#xff5c;日常开发中读写TXT文本详解 前言一、读取 TXT 文本1.1 使用StreamReader类 二、写入 TXT 文本2.1 使用StreamWriter类 三、文件编码问题3.1 常见编码格式 四、错误处理和性能考虑4.1 错误处理4.2 性能考虑 结束语优质源码分享 ASP.NET&#xff5c;日常开发中…