Three.js

A collection of 192 posts
Three.js

ThreeJS教程:单机按钮关闭HTML标签

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 单机按钮关闭HTML标签 给HTML标签,增加一个关闭按钮,鼠标单击之后,可以把射线弹出的标签关闭。 HTML标签增加一个关闭按钮
单击按钮关闭HTML标签 注意把原来射线拾取里面隐藏发光描边和标签的代码删除,以免影响HTML关闭标签的功能测试。 // 鼠标单击按钮,关闭HTML标签 document.getElementById('close').addEventListener('click',function(){ if (chooseObj) {//把原来选中模型对应的标签和发光描边隐藏 outlinePas
1 min read
Three.js

ThreeJS教程:鼠标选中模型弹出标签(工厂)

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 鼠标选中模型弹出标签(工厂) 射线、标签等知识点都学习过,你可以把本节课作为练习题,实现鼠标点击模型,弹出标签的功能。 添加HTML元素标签,并隐藏 引入标签的HTML、CSS代码,在射线拾取模型对象之前注意先隐藏display: none;。
4 min read
ThreeJS教程:标签指示线或箭头指向标注点
Three.js

ThreeJS教程:标签指示线或箭头指向标注点

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 标签指示线或箭头指向标注点 CSS2渲染器渲染HTML元素作为模型标签的时候,想把标签的箭头或指示线放在标注点上,下面给大家说下如何实现。 CSS2渲染器渲染HTML标签的位置特征 CSS2渲染器渲染的HTML元素标签,默认情况下,HTML元素标签自身的几何中心与标注点重合。 你可以查看本节课课件“圆锥标注”的案例验证。 const div = document.getElementById('tag'); // id="tag"元素高度40px,默认标签中心与圆锥顶部重合 // CSS2渲染器会把标签HTML默认设置为绝对定位,意味着你可以直接设置top div.style.top = '-20px';//平移20px,使标签底部和圆锥顶部重合 工厂设备标签CSS代码 工厂设备标签的HTML、CSS布局代码,课件中已经提供。当然你可以根据自己前端知识更换其他CSS布局写法,只要视觉效果符合UI设计需求都行。 标签HTML元素布局方式都是前端CSS知识,课程不在演示,下面主要讲解
4 min read
Three.js

ThreeJS教程:标签位置(标注工厂设备)

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 标签位置(标注工厂设备) 下面以一个工厂设备模型的标注为例,给大家演示工厂设备标签的位置如何设置。 回顾:CSS2模型对象继承父对象位置 在上节课“圆锥标注案例中”给大家说过,HTML标签对应的CSS2模型对象,如果作为一个模型的子对象,默认标注在模型的局部坐标系原点位置。 const tag = new CSS2DObject(div); //标签tag作为obj子对象,默认标注在obj的局部坐标系坐标原点 obj.add(tag); 模型软件中工厂设备局部坐标系 一个模型本身是有尺寸的,你想把模型标签标在模型那个具体位置,可以在三维软件中,把该模型的局部坐标系坐标原点设置在哪里。 本节课课件中提供的gltf工厂模型,有两个相同的形状的设备,名字分别为设备A和设备B,为了给大家演示标签功能,设备A和设备B的局部坐标系相对自身位置不同,下面分别进行标注。 你可以先尝试利用前面学习过的知识,获取某个模型设备进行标注,然后在跟着视频学习。 threejs获取工厂设备,查看局部坐标
3 min read
Three.js

ThreeJS教程:标签位置不同设置方式

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 标签位置不同设置方式 前面给大家讲解过,你想把HTML元素标签标注在三维场景中哪个位置,可以设置HTML标签对应的CSS2模型对象CSS2DObject位置属性.position。 CSS2模型标签对象位置和要标注的Mesh放在同一个位置,这样HTML标签就可以标注Mesh。 mesh.position.set(50,0,50); // HTML元素转化为threejs的CSS2模型对象 const tag = new CSS2DObject(div); tag.position.set(50,0,50); group.add(mesh,tag); 在学习本节课之前,最好把章节4关于层级模型知识的讲解回顾一下。 mesh增加一个父对象,查看标签变化 mesh增加一个父对象,且设置父对象的位置坐标,然后查看标签变化。 mesh.position.set(50,0,50); // mesh设置一个父对象meshGroup const meshGroup = new
4 min read
Three.js

ThreeJS教程:Canvas尺寸变化(HTML标签)

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 Canvas尺寸变化(HTML标签) 前面内容讲解过,如果threejs Canvas画布尺寸变化,需要同步更新相机等受canvas画布尺寸影响的参数,对于HTML标签标注也是如此。 1.12. Canvas画布布局和全屏(opens new window) 8.1. three.js Canvas画布布局(opens new window) // 画布跟随窗口变化 window.onresize = function () { const width = window.innerWidth; const height = window.innerHeight; // cnavas画布宽高度重新设置 renderer.setSize(width,height); // 相机参数重新设置 camera.aspect = width / height; camera.updateProjectionMatrix(); }; Canvas
2 min read
Three.js

ThreeJS教程:HTML标签遮挡Canvas画布事件

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 HTML标签遮挡Canvas画布事件 HTML元素标签
外面div父元素遮挡了Canvas画布鼠标事件,会造成相机控件OrbitControls的旋转、缩放等操作无效,也有可能会影响你的射线拾取,等等任何与canvas画布有关的鼠标事件都有可能收到影响,不过这算是普通web前端内容,选择前端方式解决即可。 .style.pointerEvents 设置.style.pointerEvents = none,就可以解决HTML元素标签对threejs canvas画布鼠标事件的遮挡。 css2Renderer.domElement.style.pointerEvents = 'none'; 这时候你在测试threejs代码执行效果,你会发现OrbitControls旋转缩放是正常的、射线也能正常拾取模型。 CSS属性z-index 说到模型标签CSS2DRenderer.domElement遮挡canvas画布的问题,有必要给大家提一下CSS属性
2 min read
Three.js

ThreeJS教程:CSS2DRenderer(HTML标签)

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 CSS2DRenderer(HTML标签) 下面给大家介绍一个threejs的扩展库CSS2DRenderer.js,通过CSS2DRenderer.js可以把HTML元素作为标签标注三维场景。 引入扩展库CSS2DRenderer.js 在threejs文件包目录examples/jsm/renderers/,你可以找到CSS2DRenderer.js扩展库。 threejs扩展库CSS2DRenderer.js提供了两个类CSS2渲染器CSS2DRenderer、CSS2模型对象CSS2DObject。 // 引入CSS2渲染器CSS2DRenderer和CSS2模型对象CSS2DObject import { CSS2DRenderer,CSS2DObject } from 'three/addons/renderers/CSS2DRenderer.js'; // 引入CSS2渲染器CSS2DRenderer import { CSS2DRenderer } from 'thre
6 min read
Three.js

ThreeJS教程:射线拾取Sprite控制场景

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 射线拾取Sprite控制场景 射线投射器Raycaster通过.intersectObjects()方法可以拾取网格模型Mesh,一样也可以拾取精灵模型Sprite。 下面举一个例子,把精灵模型当做一个功能按钮,当鼠标单击选中以后,改变3D场景中参数,比如模型的颜色。 给精灵模型绑定一个函数.change() 三维场景中提供了两个精灵模型对象,可以分别自定义一个方法.change()。 sprite.change = function(){ mesh.material.color.set(0xffffff); } sprite2.change = function(){ mesh.material.color.set(0xffff00); } 射线选中Sprite,sprite.change()函数执行 鼠标单击,如果选中某个精灵模型,就调用该精灵模型绑定的函数.change()。 addEventListener('click', function (event) {
1 min read
Three.js

ThreeJS教程:射线拾取层级模型(模型描边)

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 射线拾取层级模型(模型描边) 前面几节课演示过,通过射线投射器Raycaster的.intersectObjects()方法可以拾取Mesh模型对象。 如果一个层级模型包含多个网格网格模型Mesh,使用.intersectObjects()方法拾取的时候,返回的结果默认是层级模型的后代Mesh,没办法整体选中该层级模型。 下面以案例:射线拾取工厂设备添加发光描边,给大家演示如何解决含多Mesh的层级模型如何拾取。 .intersectObjects()参数的元素是层级模型 通过Blender查看工厂模型,你可以发现存储罐cunchu.children里面有两个子对象设备A、设备B,这些子对象本身都是由多个Mesh构成的父对象。 执行.intersectObjects(cunchu.children)进行射线拾取计算,返回结果并不是设备A或设备B父对象,而是他们的某个子对象Mesh。 const cunchu = model.getObjectByName('存储罐'); // 射线拾取
3 min read
Three.js

ThreeJS教程:Canvas尺寸变化(射线坐标计算)

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 Canvas尺寸变化(射线坐标计算) 本节课内容非常简单,就是你鼠标单击canvas画布,用射线拾取模型的时候,有一点要注意,Canvas画布尺寸如果不是固定的,而是变化的,会对坐标变换有影响。 学习本节课内容之前,可以先回顾下,前面关于threejs Canvas画布布局的讲解。 1.12. Canvas画布布局和全屏(opens new window) 8.1. three.js Canvas画布布局(opens new window) canvas画布全屏-尺寸跟着浏览器窗口变化 const width = window.innerWidth; const height = window.innerHeight; // 画布跟随窗口变化 window.onresize = function () { renderer.setSize(window.innerWidth, window.innerHeight)
2 min read
Three.js

ThreeJS教程:Raycaster(鼠标点击选中模型)

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 Raycaster(鼠标点击选中模型) 在实际开发中,射线投射器Raycaster经常会使用到,本节课先通过一个简单的小案例来给大家展示射线投射器Raycaster的射线拾取功能,简单说就是鼠标点击,选中一个模型对象。 下面代码的功能是鼠标单击threejs的canvas画布,通过射线投射器Raycaster射线拾取网格模型,被选中拾取到的网格模型改变颜色。 renderer.domElement.addEventListener('click', function (event) { // .offsetY、.offsetX以canvas画布左上角为坐标原点,单位px const px = event.offsetX; const py = event.offsetY; //屏幕坐标px、py转WebGL标准设备坐标x、y //width、height表示canvas画布宽高度 const x = (px / width) * 2 - 1;
3 min read
ThreeJS教程:屏幕坐标转标准设备坐标
Three.js

ThreeJS教程:屏幕坐标转标准设备坐标

在线工具推荐:三维数字孪生场景工具 - GLTF/GLB在线编辑器 - Three.js AI自动纹理化开发 - YOLO 虚幻合成数据生成器 - 3D模型在线转换 -  3D模型预览图生成服务 屏幕坐标转标准设备坐标 在讲解下节课鼠标点击选中模型之前,先给大家讲解下坐标系的问题。 获取鼠标事件坐标 先来了解一些,普通的web前端相关知识。 鼠标单击HTML元素,通过函数的参数鼠标事件对象event,可以获取一些坐标信息。课件源码中是以threejs的canvas画布为例给大家演示。 addEventListener('click',function(event){ // event对象有很多鼠标事件相关信息 console.log('event',event); }) .offsetX、.offsetY表示鼠标单击位置的坐标,单位是像素px,以点击的HTML元素左上角为坐标原点,水平向右方向为x轴,竖直向下方向为y轴。 addEventListener('click',function(event){ const px = event.o
4 min read
Three.js

ThreeJS教程:Raycaster(射线拾取模型)

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 Raycaster(射线拾取模型) 上节课给大家介绍过射线Ray,下面给大家介绍另一个和射线相关的API射线投射器Raycaster。 射线投射器Raycaster 射线投射器Raycaster具有一个射线属性.ray,该属性的值就是上节课讲解的射线对象Ray。 const raycaster = new THREE.Raycaster(); console.log('射线属性',raycaster.ray); // 设置射线起点 raycaster.ray.origin = new THREE.Vector3(-100, 0, 0); // 设置射线方向射线方向沿着x轴 raycaster.ray.direction = new THREE.Vector3(1, 0, 0); 射线交叉计算(.intersectObjects()方法) 射线投射器Raycaster通过.intersectObjects()方法可以计算出来与自身射线.ray相交的网格模型。 .intersect
2 min read
Three.js

ThreeJS教程:射线Ray

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 射线Ray 射线Ray和三维向量Vector3一样属于数学几何计算相关的API,可以进行射线交叉计算。 射线Ray 学习Three.js中的射线Ray概念,你可以类比数学几何中提到的射线,在三维空间中,一条线把一个点作为起点,然后沿着某个方向无限延伸。 // 创建射线对象Ray const ray = new THREE.Ray() 射线起点.origin 射线Ray的起点.origin在3D空间中的坐标,可以用一个三维向量Vector3的x、y、z分量表示。 // 设置射线起点 ray.origin = new THREE.Vector3(1,0,3); 起点.origin属性值是三维向量Vector3,也可以用.set()方法设置。 // 设置射线起点 ray.origin.set(1, 0, 3); 射线方向.direction
3 min read
Three.js

ThreeJS教程:抗锯齿后处理

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 抗锯齿后处理 three.js提供了多种抗锯齿的后处理,下面给大家演示下FXAAShader和SMAAPass两种抗锯齿的后处理。 gltf模型使用后处理带来的锯齿 你可以对比下面两种情况的渲染效果。(使用后处理之后带来了锯齿) * gltf工厂模型,无后处理 ( 课件文件:“无后处理的gltf工厂” ) * gltf工厂模型,有后处理EffectComposer (课件文件:“演示”) 调整相机参数,方便观察工厂设备B的渲染细节 // camera.position.set(202, 123, 125); camera.position.set(1.1, 11.8, 62.4); // 可视化选择相机位置 controls.addEventListener('change',function(){ console.log('camera.position',camera.position); }) FXAA抗锯齿通道 FXAA减弱了锯齿,但是并不完美。
2 min read
Three.js

ThreeJS教程:gltf后处理颜色异常(伽马校正)

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 gltf后处理颜色异常(伽马校正) 你打开上节课代码,可以发现,加载gltf模型,如果使用EffectComposer添加后处理功能,模型颜色可能会出现异常,对于这种情况,首先要先分析产生颜色偏差原因。 颜色偏差的原因 首先你可以回顾6.3和6.9节内容,加载gltf模型如果出现颜色偏差,需要设置renderer.outputEncoding解决。 如果你使用threejs后处理功能EffectComposer,renderer.outputEncoding会无效,自然会出现颜色偏差。 renderer.outputEncoding = THREE.sRGBEncoding; 引入GammaCorrectionShader.js GammaCorrectionShader.js扩展库的目录:examples/jsm/shaders/ examples/jsm/shaders/目录下有很多不同功能的shader文件,GammaCorrectionShader.js的功能就是进行伽马
1 min read
Three.js

ThreeJS教程:gltf工厂模型设置发光描边

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 gltf工厂模型设置发光描边 本节课算是一个发光描边OutlinePass后处理的练习题,通过按钮点击选择gltf工厂的某个设备模型,添加发光描边效果。 课件演示文件提供了加载gltf工厂模型的源码,你可以在此基础上,利用13.1和13.2节讲解过的OutlinePass知识给工厂设备添加发光描边效果。 1.引入扩展库 具体参考13.1节讲解 // 引入后处理扩展库EffectComposer.js import { EffectComposer } from 'three/addons/postprocessing/EffectComposer.js'; // 引入渲染器通道RenderPass import { RenderPass } from 'three/addons/postprocessing/RenderPass.js'; // 引入OutlinePass通道 import { OutlinePass } from 'three/addons/postprocessing/
2 min read
Three.js

ThreeJS教程:多通道组合(GlitchPass和描边)

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 多通道组合(GlitchPass和描边) threejs可以多个后处理效果组合使用,比如模型先通过OutlinePass设置描边,再设置其它的后处理通道。 GlitchPass通道 // 引入GlitchPass通道 import { GlitchPass } from 'three/addons/postprocessing/GlitchPass.js'; GlitchPass通道会产生闪屏效果。 const glitchPass = new GlitchPass(); // 设置glitchPass通道 composer.addPass(glitchPass); 多通道组合(OutlinePass+GlitchPass) OutlinePass和GlitchPass通道组合使用,一个通道就像流水线上的一个工位一样,负责完成一个后处理功能,然后交给下一个通道,完成新的后处理功能。 // 引入后处理扩展库EffectComposer.js import { EffectComp
2 min read
Three.js

ThreeJS教程:Bloom发光通道

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 Bloom发光通道 前面两节课,通过OutlinePass给大家演示过后处理的整个流程,本节课给大演示一个Bloom发光通道案例。 * OutlinePass.js:高亮发光描边 * UnrealBloomPass.js:Bloom发光 Bloom发光通道UnrealBloomPass UnrealBloomPass.js扩展库目录:examples/jsm/postprocessing/ // 引入UnrealBloomPass通道 import { UnrealBloomPass } from 'three/addons/postprocessing/UnrealBloomPass.js'; UnrealBloomPass参数1是一个二维向量Vector2,二维向量尺x、y分量要和Canvas画布的宽、高度尺寸保持一致。 // canvas画布宽高度尺寸是800, 600 const bloomPass = new UnrealBloomPass(new THREE.Vect
1 min read
Three.js

ThreeJS教程:OutlinePass描边样式

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 OutlinePass描边样式 继续上节课关于OutlinePass的讲解,给大家演示如何修改OutlinePass默认高亮发光描边样式。 OutlinePass有很多控制高亮外边框样式的属性,下面介绍几个比较常用的属性。 //模型描边颜色,默认白色 outlinePass.visibleEdgeColor.set(0xffff00); //高亮发光描边厚度 outlinePass.edgeThickness = 4; //高亮描边发光强度 outlinePass.edgeStrength = 6; //模型闪烁频率控制,默认0不闪烁 outlinePass.pulsePeriod = 2; 描边颜色.visibleEdgeColor 修改OutlinePass默认边框效果 .visibleEdgeColor可以设置模型边缘高亮描边颜色 //模型边缘高亮边框颜色,默认白色 outlinePass.visibleEdgeColor.set(0xffff0
1 min read
Three.js

ThreeJS教程:后处理(发光描边OutlinePass)

在线工具推荐:Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 3D数字孪生场景编辑器 后处理(发光描边OutlinePass) 查看threejs文件包目录examples/jsm/postprocessing/,你可以看到Three.js提供了一个扩展库EffectComposer.js,通过EffectComposer可以实现一些后期处理效果。 所谓threejs后期处理,就像ps一样,对threejs的渲染结果进行后期处理,比如添加发光效果。 不同功能后处理通道 查看threejs文件包目录examples/jsm/postprocessing/,你可以看到threejs提供了很多后处理通道,想实现什么样的后期处理效果,需要调用threejs对应的后处理通道扩展库。 * OutlinePass.js:高亮发光描边 * UnrealBloomPass.js:Bloom发光 * GlitchPass.js:画面抖动效果 比如OutlinePass.js扩展库提供的类OutlinePass
3 min read
Three.js

ThreeJS教程:Sprite模拟下雨、下雪

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 Sprite模拟下雨、下雪 在实际开发的时候,物联网3D可视化、数字孪生、游戏等项目可能会模拟天气的效果。 如果你想模拟下雨效果,一个雨滴用一个3D水滴形曲面表示,假设一个水滴用40个三角形表示,1万个雨滴,就是40万个三角形,精灵模型Sprite在threejs内部就像相当于两个三角形构成的矩形,1万个精灵模型,相当于2万个三角形,Sprite模拟雨滴相比比3D曲面几何体表示雨滴顶点数量就会少很多,这样threejs渲染性能就更好。 Sprite模拟雨滴 提供一个背景透明的png雨滴贴图,然后作为Sprite的颜色贴图,用来模拟雨滴3D几何体。 const texture = new THREE.TextureLoader().load("./雨滴.png"); const spriteMaterial = new THREE.SpriteMaterial({ map: texture, }); const sprite = new THREE.Sprite(spriteMat
3 min read
Three.js

ThreeJS教程:精灵模型标注场景(贴图)

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 精灵模型标注场景(贴图) 前面课程5.5小节讲解过一个例子,就是通过矩形平面Mesh + 贴图标注三维场景。 不过有些时候,你也可以通过Sprite+贴图标注三维场景。 你可以对比案例源码中矩形平面Mesh和Sprite标注三维场景差异。 大家根据需要选择Sprite或矩形Mesh标注场景,如果希望矩形始终平行于canvas画布,就选择Sprite,如果希望矩形标注姿态角度能跟着场景旋转,就使用矩形Mesh标注场景。 精灵模型设置颜色贴图.map 精灵材质对象SpriteMaterial和普通的网格材质一样具有颜色贴图.map、开启透明.transparent、透明度.opacity等属性。 const texture = new THREE.TextureLoader().load("./光点.png"); const spriteMaterial = new THREE.SpriteMaterial({ map: texture, //设置精灵纹理贴图 }); .tran
2 min read
ThreeJS教程:精灵模型Sprite
Three.js

ThreeJS教程:精灵模型Sprite

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 精灵模型Sprite Three.js的精灵模型Sprite和Threejs的网格模型Mesh一样都是模型对象,父类都是Object3D,关于精灵模型对象Sprite的方法和属性除了可以查看文档Sprite,也可以查看父类Object3D。 第一次接触精灵模型Sprite的时候,可以类比以前讲解过的网格模型Mesh学习。 创建精灵模型材质SpriteMaterial 精灵材质对象SpriteMaterial和普通的网格材质一样可以设置颜色.color、颜色贴图.map、开启透明.transparent、透明度.opacity等属性,精灵材质对象SpriteMaterial的父类是材质Material。 // 创建精灵材质对象SpriteMaterial const spriteMaterial = new THREE.SpriteMaterial({ color:0x00ffff,//设置颜色 }); 创建精灵模型Sprite 创建精灵模型对象Sprite和创建网格模型对象一样
4 min read
NSDT场景编辑器 | NSDT 数字孪生 | GLTF在线编辑器 | 3D模型在线转换 | UnrealSynth虚幻合成数据生成器 | 3D模型自动纹理化工具
2023 power by nsdt©鄂ICP备2023000829号