当前位置: 首页 > article >正文

WebGL入门:Three.js高级材质与光照

WebGL入门Three.js高级材质与光照大家好我是欧阳瑞Rich Own。今天想和大家聊聊WebGL和Three.js的高级特性。作为一个全栈开发者和极客玩家我对3D可视化有着浓厚的兴趣。今天就来分享一下Three.js中的高级材质和光照技术。为什么选择Three.jsThree.js是一个强大的3D图形库封装了复杂的WebGL API让我们可以轻松创建3D场景。基础设置import * as THREE from three; import { OrbitControls } from three/addons/controls/OrbitControls.js; const scene new THREE.Scene(); const camera new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000); const renderer new THREE.WebGLRenderer(); renderer.setSize(window.innerWidth, window.innerHeight); document.body.appendChild(renderer.domElement); const controls new OrbitControls(camera, renderer.domElement); camera.position.z 5; function animate() { requestAnimationFrame(animate); controls.update(); renderer.render(scene, camera); } animate();高级材质MeshStandardMaterialconst geometry new THREE.SphereGeometry(1, 32, 32); const material new THREE.MeshStandardMaterial({ color: 0x00ffff, metalness: 0.8, roughness: 0.2, envMap: environmentMap, envMapIntensity: 1.0 }); const sphere new THREE.Mesh(geometry, material); scene.add(sphere);MeshPhysicalMaterialconst material new THREE.MeshPhysicalMaterial({ color: 0xff00ff, metalness: 0.5, roughness: 0.3, clearcoat: 1.0, clearcoatRoughness: 0.1, transmission: 0.9, ior: 1.5 });ShaderMaterialconst vertexShader varying vec2 vUv; void main() { vUv uv; gl_Position projectionMatrix * modelViewMatrix * vec4(position, 1.0); } ; const fragmentShader varying vec2 vUv; void main() { gl_FragColor vec4(vUv.x, vUv.y, 0.5, 1.0); } ; const material new THREE.ShaderMaterial({ vertexShader, fragmentShader });光照系统AmbientLightconst ambientLight new THREE.AmbientLight(0xffffff, 0.5); scene.add(ambientLight);DirectionalLightconst directionalLight new THREE.DirectionalLight(0xffffff, 1); directionalLight.position.set(5, 5, 5); directionalLight.castShadow true; directionalLight.shadow.mapSize.width 2048; directionalLight.shadow.mapSize.height 2048; scene.add(directionalLight);PointLightconst pointLight new THREE.PointLight(0x00ffff, 1, 100); pointLight.position.set(0, 5, 0); pointLight.castShadow true; scene.add(pointLight);SpotLightconst spotLight new THREE.SpotLight(0xff00ff, 1); spotLight.position.set(0, 10, 0); spotLight.angle Math.PI / 4; spotLight.penumbra 0.1; spotLight.castShadow true; scene.add(spotLight);RectAreaLightconst rectLight new THREE.RectAreaLight(0x4e00ff, 10, 10, 10); rectLight.position.set(0, 5, 0); rectLight.lookAt(0, 0, 0); scene.add(rectLight);环境贴图const loader new THREE.CubeTextureLoader(); const environmentMap loader.load([ px.jpg, nx.jpg, py.jpg, ny.jpg, pz.jpg, nz.jpg ]); scene.background environmentMap; const material new THREE.MeshStandardMaterial({ envMap: environmentMap, metalness: 0.8, roughness: 0.2 });实战案例赛博朋克场景// 创建地面 const groundGeometry new THREE.PlaneGeometry(50, 50); const groundMaterial new THREE.MeshStandardMaterial({ color: 0x1a1a2e, roughness: 0.8, metalness: 0.2 }); const ground new THREE.Mesh(groundGeometry, groundMaterial); ground.rotation.x -Math.PI / 2; ground.receiveShadow true; scene.add(ground); // 创建霓虹灯 function createNeonSign(text, position) { const canvas document.createElement(canvas); const ctx canvas.getContext(2d); canvas.width 512; canvas.height 128; ctx.fillStyle #000; ctx.fillRect(0, 0, canvas.width, canvas.height); ctx.font bold 60px Arial; ctx.fillStyle #00ffff; ctx.shadowColor #00ffff; ctx.shadowBlur 50; ctx.textAlign center; ctx.fillText(text, canvas.width / 2, canvas.height / 2 20); const texture new THREE.CanvasTexture(canvas); const material new THREE.MeshBasicMaterial({ map: texture, transparent: true, side: THREE.DoubleSide }); const geometry new THREE.PlaneGeometry(5, 1.2); const mesh new THREE.Mesh(geometry, material); mesh.position.set(position.x, position.y, position.z); return mesh; } const sign1 createNeonSign(CYBERPUNK, { x: 0, y: 3, z: 0 }); scene.add(sign1); // 创建全息投影效果 function createHologram(position) { const geometry new THREE.BoxGeometry(2, 2, 2); const material new THREE.MeshPhongMaterial({ color: 0x00ffff, transparent: true, opacity: 0.3, wireframe: true }); const cube new THREE.Mesh(geometry, material); cube.position.set(position.x, position.y, position.z); return cube; } const hologram createHologram({ x: 5, y: 2, z: 5 }); scene.add(hologram); // 添加动态效果 function update() { sign1.rotation.y Math.sin(Date.now() * 0.001) * 0.1; hologram.rotation.x 0.01; hologram.rotation.y 0.01; }后期处理import { EffectComposer } from three/addons/postprocessing/EffectComposer.js; import { RenderPass } from three/addons/postprocessing/RenderPass.js; import { UnrealBloomPass } from three/addons/postprocessing/UnrealBloomPass.js; const composer new EffectComposer(renderer); const renderPass new RenderPass(scene, camera); composer.addPass(renderPass); const bloomPass new UnrealBloomPass( new THREE.Vector2(window.innerWidth, window.innerHeight), 1.5, // strength 0.4, // radius 0.85 // threshold ); composer.addPass(bloomPass); function animate() { requestAnimationFrame(animate); controls.update(); update(); composer.render(); } animate();性能优化使用InstancedMeshconst geometry new THREE.BoxGeometry(1, 1, 1); const material new THREE.MeshStandardMaterial({ color: 0x00ffff }); const instancedMesh new THREE.InstancedMesh(geometry, material, 1000); const dummy new THREE.Object3D(); for (let i 0; i 1000; i) { dummy.position.set( (Math.random() - 0.5) * 100, (Math.random() - 0.5) * 100, (Math.random() - 0.5) * 100 ); dummy.scale.set( Math.random(), Math.random(), Math.random() ); dummy.rotation.set( Math.random() * Math.PI, Math.random() * Math.PI, Math.random() * Math.PI ); dummy.updateMatrix(); instancedMesh.setMatrixAt(i, dummy.matrix); } scene.add(instancedMesh);使用LODconst lod new THREE.LOD(); const highGeometry new THREE.TorusKnotGeometry(10, 3, 100, 16); const mediumGeometry new THREE.TorusKnotGeometry(10, 3, 50, 8); const lowGeometry new THREE.TorusKnotGeometry(10, 3, 10, 4); const material new THREE.MeshStandardMaterial({ color: 0xff00ff }); lod.addLevel(new THREE.Mesh(highGeometry, material), 0); lod.addLevel(new THREE.Mesh(mediumGeometry, material), 100); lod.addLevel(new THREE.Mesh(lowGeometry, material), 200); scene.add(lod);总结Three.js是一个功能强大的3D库掌握高级材质和光照技术可以让你创建出令人惊叹的视觉效果。从简单的几何体到复杂的场景Three.js都能胜任。我的鬃狮蜥Hash对3D图形也有自己的理解——它总是能从不同角度观察蟋蟀这也许就是自然界的3D感知吧如果你对WebGL或Three.js感兴趣欢迎留言交流我是欧阳瑞极客之路永无止境技术栈Three.js · WebGL · 3D图形 · 着色器

相关文章:

WebGL入门:Three.js高级材质与光照

WebGL入门:Three.js高级材质与光照 大家好,我是欧阳瑞(Rich Own)。今天想和大家聊聊WebGL和Three.js的高级特性。作为一个全栈开发者和极客玩家,我对3D可视化有着浓厚的兴趣。今天就来分享一下Three.js中的高级材质和光…...

基于CircuitPython的嵌入式记忆游戏开发:状态机与TileGrid实战

1. 项目概述:一个嵌入式平台上的经典记忆配对游戏如果你玩过那种翻牌配对的记忆游戏,现在我们可以把它搬到一块小小的嵌入式开发板上,用CircuitPython来实现。这不仅仅是把游戏逻辑移植过来那么简单,它涉及到在资源受限的微控制器…...

从3D打印到智能光效:制作可编程NeoPixel守护者之剑全流程

1. 项目概述:当数字建模遇见智能光效作为一名在创客领域摸爬滚打了十多年的老玩家,我经手过无数个将虚拟想法变为现实的项目。但每次看到那些融合了数字制造与智能交互的作品,比如一把能自己发光的游戏道具,依然会感到兴奋。这不仅…...

基于BLE与CircuitPython的无线8-bit音乐合成器DIY全攻略

1. 项目概述与核心思路想不想亲手做一个能揣在口袋里,随时随地弹奏出复古8-bit音乐的小玩意儿?不是那种手机App模拟的,而是实实在在的、有物理按键、能无线连接、还会发光的小合成器。今天分享的这个项目,就是基于两块小巧但功能强…...

终极CLIP-as-service指南:如何高效处理批量文本与图像嵌入任务

终极CLIP-as-service指南:如何高效处理批量文本与图像嵌入任务 【免费下载链接】clip-as-service 🏄 Scalable embedding, reasoning, ranking for images and sentences with CLIP 项目地址: https://gitcode.com/gh_mirrors/cl/clip-as-service …...

Arduino驱动多LED矩阵:I2C总线与位图编程实现动态表情动画

1. 项目概述:用Arduino驱动多个LED矩阵,打造动态表情动画如果你玩过Arduino和LED点阵,大概都体验过点亮单个8x8矩阵的乐趣——显示个字符、画个简单图案。但当你想要做一个更酷的项目,比如一个能眨眼、能变换嘴型的机器人脸&#…...

Bootstrap-Sass 终极指南:如何在现代 Web 项目中快速集成 Bootstrap 3

Bootstrap-Sass 终极指南:如何在现代 Web 项目中快速集成 Bootstrap 3 【免费下载链接】bootstrap-sass Official Sass port of Bootstrap 2 and 3. 项目地址: https://gitcode.com/gh_mirrors/bo/bootstrap-sass Bootstrap-Sass 是 Bootstrap 3 的官方 Sass…...

Rust数据库实战:Rusqlite SQLite深度解析

Rust数据库实战:Rusqlite SQLite深度解析 引言 在Rust开发中,SQLite是构建轻量级数据库应用的核心技术。作为一名从Python转向Rust的后端开发者,我深刻体会到Rusqlite在SQLite操作方面的优势。Rusqlite是Rust生态中最流行的SQLite客户端库&am…...

基于Docker部署企业级Rocket.Chat:openclaw增强镜像实战指南

1. 项目概述与核心价值最近在折腾一个挺有意思的开源项目,叫alexwoo-awso/openclaw-rocketchat。乍一看这个名字,你可能有点懵,这到底是啥?简单来说,这是一个基于 Rocket.Chat 开源即时通讯平台,深度定制和…...

终极React Native Navigation VR应用开发指南:打造沉浸式虚拟环境和菜单导航体验

终极React Native Navigation VR应用开发指南:打造沉浸式虚拟环境和菜单导航体验 【免费下载链接】react-native-navigation A complete native navigation solution for React Native 项目地址: https://gitcode.com/gh_mirrors/re/react-native-navigation …...

高光谱图像分类避坑指南:Hughes现象、同物异谱,这些坑你踩过吗?

高光谱图像分类实战避坑手册:从Hughes现象到模型优化的深度解析 当你的高光谱分类模型在验证集上表现优异,却在真实场景中频频失误时,或许正遭遇着这个领域特有的"暗礁"。不同于常规RGB图像分类,高光谱数据特有的图谱合…...

别再直接跳转了!用iframe在Vue项目里优雅嵌入第三方页面(附B站实战代码)

在Vue项目中优雅集成第三方页面的完整工程化方案 当我们需要在Vue应用中嵌入外部页面时,直接跳转会破坏应用的整体性和用户体验。本文将分享一套基于iframe的完整解决方案,涵盖从基础实现到高级优化的全流程实践。 1. 为什么选择iframe而非直接跳转 在现…...

从零上手SUSTechPOINTS:高效完成三维点云数据标注的完整指南

1. 初识SUSTechPOINTS:三维点云标注利器 第一次接触三维点云标注的朋友可能会被各种专业术语吓到,其实用对工具就能事半功倍。SUSTechPOINTS是我用过最顺手的三维点云标注工具之一,特别适合自动驾驶和机器人领域的初学者。这个开源工具不仅支…...

如何用CLIP-as-service实现半监督学习:有限标注数据的终极指南

如何用CLIP-as-service实现半监督学习:有限标注数据的终极指南 【免费下载链接】clip-as-service 🏄 Scalable embedding, reasoning, ranking for images and sentences with CLIP 项目地址: https://gitcode.com/gh_mirrors/cl/clip-as-service …...

如何高效管理命令历史:yargs readline功能的终极指南

如何高效管理命令历史:yargs readline功能的终极指南 【免费下载链接】yargs yargs the modern, pirate-themed successor to optimist. 项目地址: https://gitcode.com/gh_mirrors/ya/yargs 在现代命令行工具开发中,提供流畅的用户交互体验至关…...

XHS-Downloader:一款完全免费的小红书内容采集神器

XHS-Downloader:一款完全免费的小红书内容采集神器 【免费下载链接】XHS-Downloader 小红书(XiaoHongShu、RedNote)链接提取/作品采集工具:提取账号发布、收藏、点赞、专辑作品链接;提取搜索结果作品、用户链接&#x…...

基于MCP协议构建AI助手本地工具服务器:从原理到实战

1. 项目概述与核心价值最近在折腾AI Agent的开发,发现一个挺有意思的项目,叫kirill-markin/example-mcp-server。这名字听起来平平无奇,但如果你正在研究如何让ChatGPT、Claude这类大模型助手变得更“能干”,能直接操作你电脑上的…...

终极指南:ChatGPT for Google扩展的自动化部署脚本完全解析

终极指南:ChatGPT for Google扩展的自动化部署脚本完全解析 【免费下载链接】chatgpt-google-extension This project is deprecated. Check my new project ChatHub: 项目地址: https://gitcode.com/gh_mirrors/ch/chatgpt-google-extension 想要在Google搜…...

从零到一:基于ESP8266 AT指令与华为云IoT平台构建智能设备原型

1. ESP8266硬件准备与固件烧录 第一次接触ESP8266时,我被这个小巧的Wi-Fi模块惊艳到了——它只有指甲盖大小,却能实现完整的网络连接功能。不过在实际使用中,我发现出厂固件往往功能不全,特别是MQTT支持不够完善,这时候…...

5G基站功率自适应算法突破

SummaryArticleObjectiveMethodComments统计机器翻译领域自适应综述解决统计机器翻译中训练数据和测试数据的领域分布不一致问题,提高翻译模型的性能和准确性基于数据选择的方法:选择和目标领域文本相似的源领域数据进行模型的训练。基于混合模型的方法&…...

MySQL的知识阶段小总结

1.MySQL的库操作1.1 MySQL 显示已建库操作语法格式:show databases;注意事项:是databases而不是database,要加s。使用该SQL语句,可以查找当前服务器所有的数据库。huan如上图所示,画红框的Java13和test113是用户自己创…...

终极指南:CodeGuide数据备份与恢复策略,保障Java开发项目安全无忧

终极指南:CodeGuide数据备份与恢复策略,保障Java开发项目安全无忧 【免费下载链接】CodeGuide :books: 本代码库是作者小傅哥多年从事一线互联网 Java 开发的学习历程技术汇总,旨在为大家提供一个清晰详细的学习教程,侧重点更倾向…...

多尺度地理加权回归(MGWR)终极指南:从入门到实战的完整教程

多尺度地理加权回归(MGWR)终极指南:从入门到实战的完整教程 【免费下载链接】mgwr Multiscale Geographically Weighted Regression (MGWR) 项目地址: https://gitcode.com/gh_mirrors/mg/mgwr 面对复杂多变的空间数据,传统的地理加权回归(GWR)常…...

终极Java数据结构指南:从链表到红黑树的实现与原理

终极Java数据结构指南:从链表到红黑树的实现与原理 【免费下载链接】CodeGuide :books: 本代码库是作者小傅哥多年从事一线互联网 Java 开发的学习历程技术汇总,旨在为大家提供一个清晰详细的学习教程,侧重点更倾向编写Java核心内容。如果本仓…...

Diablo Edit2终极指南:如何轻松编辑暗黑破坏神2角色存档

Diablo Edit2终极指南:如何轻松编辑暗黑破坏神2角色存档 【免费下载链接】diablo_edit Diablo II Character editor. 项目地址: https://gitcode.com/gh_mirrors/di/diablo_edit 暗黑破坏神2作为经典的动作角色扮演游戏,拥有庞大的玩家群体。然而…...

为内部工具集成AI能力时下载Taotoken作为统一接口层的方案

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 为内部工具集成AI能力时采用Taotoken作为统一接口层的方案 在为企业内部工具(如数据分析平台、客服辅助系统或内容生成…...

智能健身器材核心技术解析:从光学编码器到电机驱动的安华高方案

1. 项目概述:当健身器材遇上“芯”动力如果你拆开一台近两年新出的智能动感单车、划船机或者高端跑步机,大概率会在其控制主板的核心位置,发现一枚印着“Avago”或“Broadcom”标志的芯片。这不是偶然。安华高科技(Avago Technolo…...

不只是画图:用Design Entry CIS画原理图符号,你真的理解引脚属性吗?

不只是画图:用Design Entry CIS画原理图符号,你真的理解引脚属性吗? 在电子设计自动化(EDA)领域,原理图符号的创建常被视为"简单绘图",但真正影响设计质量的往往是那些被忽视的细节。…...

从YOLOv8到Heatmap:手把手教你搭建一个景区人员拥挤预警系统(含完整代码)

从YOLOv8到Heatmap:手把手教你搭建一个景区人员拥挤预警系统(含完整代码) 每到旅游旺季,景区管理者最头疼的问题之一就是如何有效监控人流密度,预防踩踏事故。传统的人工监控方式不仅效率低下,而且难以及时…...

告别烦人黑窗口!QT Creator控制台程序输出完美嵌入IDE的两种方法

告别烦人黑窗口!QT Creator控制台程序输出完美嵌入IDE的两种方法 每次调试QT控制台程序时,那个突然弹出的黑窗口是否总让你手指悬停在AltTab键上?作为深耕QT开发多年的技术顾问,我见过太多开发者被这个"窗口刺客"打断思…...