Three.js

A collection of 192 posts
ThreeJS教程:多边形轮廓Shape(圆弧)
Three.js

ThreeJS教程:多边形轮廓Shape(圆弧)

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 多边形轮廓Shape(圆弧) 先掌握上节课关于Shape内容,再继续学习本节课关于Shape圆弧的介绍。 圆弧方法.arc() 圆弧方法.arc()使用方式和原来学习过的圆弧曲线ArcCurve整体相似,区别在于圆心定位方式有差异。 圆弧.arc()参数的圆心坐标是相对当前.currentPoint而言,而不是坐标原点。 下面代码绘制了一个矩形+扇形的轮廓,圆心在(100, 0),半径50。 // 下面代码绘制了一个矩形+扇形的轮廓,圆心在(100, 0),半径50。 const shape = new THREE.Shape(); shape.lineTo(100+50, 0); //.currentPoint变为(100+50,0) // 圆弧.arc参数的圆心0,0坐标是相对当前.currentPoint而言,而不是坐标原点
3 min read
ThreeJS教程:多边形轮廓Shape简介
Three.js

ThreeJS教程:多边形轮廓Shape简介

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 多边形轮廓Shape简介 上节课提到多边形轮廓Shape,是直接通过一组二维向量Vector2表示的xy点坐标创建。下面给大家讲解通过Shape的一些2D绘图API表达多边形轮廓。 // Shape表示一个平面多边形轮廓 const shape = new THREE.Shape([ // 按照特定顺序,依次书写多边形顶点坐标 new THREE.Vector2(-50, -50), //多边形起点 new THREE.Vector2(-50, 50), new THREE.Vector2(50, 50), new THREE.Vector2(50, -50), ]); 多边形轮廓Shape的父类Path Shape的父类是Path,Path提供了直线、圆弧、贝塞尔、样条等绘制方法,Shape也会从父类是Path继承这些图形绘制方法。 如何使用Path的直线、圆弧等绘制方法,可以参考原来学习过的各种曲线API和Path的文档。 .current
3 min read
ThreeJS教程:扫描ExtrudeGeometry
Three.js

ThreeJS教程:扫描ExtrudeGeometry

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 扫描ExtrudeGeometry 通过ExtrudeGeometry除了可以实现拉伸成型,也可以让一个平面轮廓Shape沿着曲线扫描成型。 查看案例源码,你可以看到ExtrudeGeometry的一个扫描变换案例。 1.扫描轮廓 // 扫描轮廓:Shape表示一个平面多边形轮廓 const shape = new THREE.Shape([ // 按照特定顺序,依次书写多边形顶点坐标 new THREE.Vector2(0,0), //多边形起点 new THREE.Vector2(0,10), new THREE.Vector2(10,10), new THREE.Vector2(10,0), ]); 2.扫描轨迹 // 扫描轨迹:创建轮廓的扫描轨迹(3D样条曲线) const curve = new THREE.
1 min read
ThreeJS教程:拉伸ExtrudeGeometry
Three.js

ThreeJS教程:拉伸ExtrudeGeometry

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 拉伸ExtrudeGeometry 拉伸几何体ExtrudeGeometry和上节课讲到的轮廓填充几何体ShapeGeometry一样,都是基于一个基础的平面轮廓Shape进行变换,生成一个几何体。 查看案例源码,你可以看到ExtrudeGeometry的一个拉伸变换案例。 定义一个Shape轮廓 使用拉伸扫描ExtrudeGeometry和轮廓填充ShapeGeometry一样,需要首先定义一个用于拉伸或扫描的平面轮廓Shape。 多边形上随意选择一个点,作为起点,也就是Shape的第一个坐标,然后按照逆时针或顺时针方向依次书写坐标。 // Shape表示一个平面多边形轮廓 const shape = new THREE.Shape([ // 按照特定顺序,依次书写多边形顶点坐标 new THREE.Vector2(-50, -50), //多边形起点 new THREE.Vector2(-50, 50), new THREE.Vector2(50, 5
2 min read
Three.js

ThreeJS教程:轮廓填充ShapeGeometry

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 轮廓填充ShapeGeometry 有些时候已知一个多边形的外轮廓坐标,想通过这些外轮廓坐标生成一个多边形几何体平面,这时候你可以借助threejs提供的轮廓填充ShapeGeometry几何体实现。 多边形轮廓Shape 通过下面代码定义了5个点坐标,构成一个五边形区域,注意顺序问题,随意选择一个点作为起点都行,然后按照顺时针或逆时针依次写下点的坐标。 // 一组二维向量表示一个多边形轮廓坐标 const pointsArr = [ new THREE.Vector2(-50, -50), new THREE.Vector2(-60, 0), new THREE.Vector2(0, 50), new THREE.Vector2(60, 0), new THREE.Vector2(50, -50), ] 这一组二维顶点坐标作为Shape的参数构成一个多边形轮廓。 // Shape表示一个平面多边形轮廓,参数是二维向量构成的数组pointsArr
2 min read
ThreeJS教程:旋转成型LatheGeometry
Three.js

ThreeJS教程:旋转成型LatheGeometry

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 旋转成型LatheGeometry 生活中有很多的几何体具备旋转特征, three.js提供了一个类LatheGeometry(), LatheGeometry可以利用一个2D轮廓,经过旋转变换生成一个3D的几何体曲面。 旋转LatheGeometry案例 格式:LatheGeometry(points, segments, phiStart, phiLength) 参数值pointsVector2表示的坐标数据组成的数组segments圆周方向细分数,默认12phiStart开始角度,默认0phiLength旋转角度,默认2π * LatheGeometry类第一个参数就是旋转轮廓,旋转轮廓使用多个二维向量Vector2表示的xy坐标去描述。 * LatheGeometry的旋转轮廓默认绕y轴旋转生成曲面几何体。 // Vector2表示的三个点坐标,三个点构成的轮廓相当于两端直线相连接 const pointsArr = [ new THREE.Vector2(50,
2 min read
Three.js

ThreeJS教程:曲线路径管道TubeGeometry

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 曲线路径管道TubeGeometry 管道TubeGeometry 管道TubeGeometry几何体的功能就是基于一个3D曲线路径,生成一个管道几何体。 构造函数格式:TubeGeometry(path, tubularSegments, radius, radiusSegments, closed) 参数值path扫描路径,路径要用三维曲线tubularSegments路径方向细分数,默认64radius管道半径,默认1radiusSegments管道圆弧细分数,默认8closedBoolean值,管道是否闭合 样条曲线生成圆管案例 // 三维样条曲线 const path = new THREE.CatmullRomCurve3([ new THREE.Vector3(-50, 20, 90), new THREE.Vector3(-10, 40, 40), new THREE.Vector3(0, 0, 0), new THREE.Vector
2 min read
ThreeJS教程:组合曲线CurvePath拼接曲线
Three.js

ThreeJS教程:组合曲线CurvePath拼接曲线

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 组合曲线CurvePath拼接曲线 通过threejs组合曲线CurvePath对象,你可以把直线、圆弧、贝塞尔等线条拼接为一条曲线。 课件案例源码为大家提供了一个圆弧和直线组合拼接的的U形效果。 直线线段简介 本节课用到的圆弧前面讲解过,下面给大家说下直线相关API,three.js提供了3D直线LineCurve3和2D直线LineCurve。 3D直线线段LineCurve3,参数是表示x、y、z坐标的三维向量Vector3对象。 new THREE.LineCurve3(new THREE.Vector3(), new THREE.Vector3()); 2D直线线段LineCurve,参数是表示x、y坐标的二维向量Vector2对象。 new THREE.LineCurve(new THREE.Vector2(), new THREE.Vector2()); 整体思路CurvePath.curves 整体思路很简单,LineCurve创建两条直线线段,ArcCur
4 min read
Three.js

ThreeJS教程:样条、贝塞尔曲线应用

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 样条、贝塞尔曲线应用 曲线API在大屏可视化中的应用:地图大屏可视化 (opens new window)、地球大屏可视化(opens new window) 表示一个飞线曲线轨迹有多重方案,圆弧、椭圆弧、贝塞尔、样条... 比如你有一个项目,已知平面上两个点坐标(-100,-100)、(100,100),需要生成一条飞线轨迹线,要求轨迹线把这两个点作为起始点,曲线有一定的高度。 维样条曲线CatmullRomCurve3实现飞线轨迹 下面曲线的起始点设置在XOZ平面上,y方向为曲线高度方向。 // p1、p3轨迹线起始点坐标 const p1 = new THREE.Vector3(-100, 0, -100); const p3 = new THREE.Vector3(100, 0, 100)
2 min read
ThreeJS教程:贝塞尔曲线
Three.js

ThreeJS教程:贝塞尔曲线

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 贝塞尔曲线 上节课讲解过,threejs可以通过样条曲线或贝塞尔曲线去表达生活中不规则的曲线,下面给大家介绍贝塞尔曲线有关的知识。 二维二次贝塞尔曲线QuadraticBezierCurve // p1、p2、p3表示三个点坐标 // p1、p3是曲线起始点,p2是曲线的控制点 const p1 = new THREE.Vector2(-80, 0); const p2 = new THREE.Vector2(20, 100); const p3 = new THREE.Vector2(80, 0); 二维二次贝赛尔曲线QuadraticBezierCurve的前面三个参数是二维向量对象Vector2。 // 二维二次贝赛尔曲线 const curve = new THREE.QuadraticBezierCurve(p1, p2, p3); 曲线上获取一定数量点,线模型line渲染贝塞尔曲线。 const pointsArr
3 min read
ThreeJS教程:样条曲线
Three.js

ThreeJS教程:样条曲线

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 样条曲线 对于一些不规则的曲线,很难用一个圆、椭圆或抛物线函数去描述,这时候,可以使用threejs提供的样条曲线或贝塞尔曲线去表达。 下面就给大家演示下样条曲线的使用特点。 三维样条曲线CatmullRomCurve3 在三维空间中随意设置几个顶点坐标,然后作为三维样条曲线CatmullRomCurve3的参数,你就可以生成一条穿过这几个点的光滑曲线。 CatmullRomCurve3的参数是三维向量对象Vector3构成的数组。 // 三维向量Vector3创建一组顶点坐标 const arr = [ new THREE.Vector3(-50, 20, 90), new THREE.Vector3(-10, 40, 40), new THREE.Vector3(0, 0, 0), new THREE.Vector3(60, -60, 0), new THREE.Vector3(70, 0, 80) ] // 三维样条曲线
2 min read
Three.js

ThreeJS教程:椭圆、圆

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 椭圆、圆 接着上节课内容给大家介绍椭圆和圆曲线。 椭圆弧线EllipseCurve EllipseCurve( aX, aY, xRadius,yRadius, aStartAngle, aEndAngle, aClockwise ) 参数含义aX, aY椭圆中心坐标xRadius椭圆x轴半径yRadius椭圆y轴半径aStartAngle弧线开始角度,从x轴正半轴开始,默认0,弧度单位aEndAngle弧线结束角度,从x轴正半轴算起,默认2 x Math.PI,弧度单位aClockwise是否顺时针绘制,默认值为false // 参数1和2表示椭圆中心坐标 参数3和4表示x和y方向半径 const arc = new THREE.EllipseCurve(0, 0, 100, 50); 椭圆曲线x和y方向半径相同,就是一个圆的效果。 // 参数1和2表示椭圆中心坐标 参数3和4表示x和y方向半径 const arc = new THREE.EllipseCurve(0, 0,
2 min read
ThreeJS教程:曲线Curve简介
Three.js

ThreeJS教程:曲线Curve简介

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 曲线Curve简介 上节课程绘制一个圆弧线是自己通过算法实现,其实threejs提供了很多常用的曲线或直线API,可以直接使用。这些API曲线都有一个共同的父类Curve。 椭圆EllipseCurve例子 曲线API的使用,具体语法可以查询文档,下面以椭圆为例,给大家绘制一个椭圆曲线效果。 // 参数1和2表示椭圆中心坐标 参数3和4表示x和y方向半径 const arc = new THREE.EllipseCurve(0, 0, 100, 50); 曲线Curve方法.getPoints() 椭圆弧线EllipseCurve的父类是曲线Curve,自然会继承父类曲线.getPoints()方法,通过.getPoints()可以从曲线上获取顶点数据。 通过方法.getPoints()可以从曲线上按照一定的细分精度返回沿着曲线分布的顶点坐标。细分数越高返回的顶点数量越多,自然轮廓越接近于曲线形状。方法.getPoints()的返回值是一个由二维向量Vector2或三维向量Vec
3 min read
Three.js

ThreeJS教程:几何体方法.setFromPoints()

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 几何体方法.setFromPoints() 几何体方法.setFromPoints() 章节2给大家介绍过几何体BufferGeometry顶点数据,本节课在章节2基础上,给大家介绍该几何体的一个方法.setFromPoints()。 三维向量Vector3表示顶点坐标 用三维向量Vector3表示顶点的x、y、z坐标,作为数组元素创建一组顶点坐标。 const pointsArr = [ // 三维向量Vector3表示的坐标值 new THREE.Vector3(0,0,0), new THREE.Vector3(0,100,0), new THREE.Vector3(0,100,100), new THREE.Vector3(0,0,100), ]; 几何体方法.setFromPoints() .setFromPoints()是几何体BufferGeometry的一个方法,通过该方法可以把数组pointsArr中坐标数据提取出来赋值给
1 min read
Three.js

ThreeJS教程:生成圆弧顶点

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 生成圆弧顶点 通过代码算法生成圆弧线上的顶点坐标,并最后绘制一个圆弧效果。 学习本节课之前,确保你已经掌握章节2 (opens new window)中,关于几何体顶点数据的讲解。 const geometry = new THREE.BufferGeometry(); //创建一个几何体对象 const R = 100; //圆弧半径 const N = 50; //分段数量 const sp = 2 * Math.PI / N;//两个相邻点间隔弧度 // 批量生成圆弧上的顶点数据 const arr = []; for (let i = 0; i < N; i++) { const angle = sp * i;//当前点弧度
3 min read
Three.js

ThreeJS教程:模型加载进度条

在线工具推荐:三维数字孪生场景工具 - GLTF/GLB在线编辑器 - Three.js AI自动纹理化开发 - YOLO 虚幻合成数据生成器 - 3D模型在线转换 -  3D模型预览图生成服务 模型加载进度条 web3d可视化项目开发,很多时候,3D模型的大小要比普通前端项目的文件大得多,这时候往往需要设置一个进度条,表示模型的加载进度。 在线进度条案例(opens new window) 进度条HTML、CSS、JavaScript代码 课件中提供的是用原生HTML、CSS、JavaScript代码写的一个进度条,当然实际开发的时候,你可以不自己写,选择成熟的UI组件库,比如你使用vue技术栈的Element-ui进度条组件。 建议:正式学习后面threejs代码之前,你可以先自己把下面进度条CSS代码写一遍,然后再学习后面内容。
3 min read
Three.js

ThreeJS教程:深度冲突(模型闪烁)

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 深度冲突(模型闪烁) 本节课通过一个比较简单的案例,来给大家展示一下,实际开发的过程中,你可能会遇到的模型闪烁问题。 对于模型闪烁的原因简单地说就是深度冲突,对应的英文关键词是Z-fighting。 Mesh面重合渲染测试 下面代码创建两个重合的矩形平面Mesh,通过浏览器预览,当你旋转三维场景的时候,你会发现模型渲染的时候产生闪烁。 这种现象,主要是两个Mesh重合,电脑GPU分不清谁在前谁在后,这种现象,可以称为深度冲突Z-fighting。 // 两个矩形平面Mesh重合,产生闪烁 // 闪烁原因:两个矩形面位置重合,GPU无法分清谁在前谁在后 const geometry = new THREE.PlaneGeometry(250, 250); const material = new THREE.MeshLambertMaterial({ color: 0x00ffff, side: THREE.DoubleSide, }); const mesh = new
4 min read
Three.js

ThreeJS教程:Three.js渲染结果保存为图片

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 Three.js渲染结果保存为图片 保存three.js渲染结果,其实就是保存three.js对应canvas画布上的图像。那么这个问题就转化为如何把canvas画布保存为一个图片。 超链接元素a下载文件 在学习下面内容之前,如果你有兴趣,可以选择补充下前端相关知识,具体说就是通过超链接元素a合成一个文件,并下载。 你通过下面代码,可以通过点击按钮“下载”,创建一个txt文件,下载到本地,txt文件包含字符串“一些数据”。
3 min read
Three.js

ThreeJS教程:Three.js背景透明度

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 Three.js背景透明度 通过Three.js渲染一个模型的时候,不希望canvas画布有背景颜色,也就是canvas画布完全透明,可以透过canvas画布看到画布后面叠加的HTML元素图文,呈现出来一种三维模型悬浮在网页上面的效果。 threejs canvas画布插入到web页面上
document.getElementById('webgl').appendChild(renderer.domElement); .setClearAlpha()方法 改变背景透明度值 renderer.setClearAlpha(0.8); 完全透明 renderer.setClearAlpha(0.0); 背景透明alpha: true 通过Three.js渲染器WebGLRenderer的alpha属性值设置为true就可以,WebGL渲染器的alpha属性默认值是false。 // 在构造函数参数中设置alpha属性的值
1 min read
Three.js

ThreeJS教程:UI交互按钮与3D场景交互

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 UI交互按钮与3D场景交互 实际开发的时候,往往会通过前端的HTML、CSS代码创建按钮等交互界面,用来与3D场景交互。 如果你是用vue或react开发web3d项目,也可以不用HTML、CSS自己写,可以使用UI组件库。 UI按钮改变Mesh颜色
绿
通过UI按钮与3D场景交互,改变mesh颜色 document.getElementById('red').addEventListener('click',function(){ mesh.material.color.set(0xff0000); }) document.getElementById('green').addEventListener('click',function(){ mesh.material.color
1 min read
Three.js

ThreeJS教程:UI交互界面与Canvas画布叠加

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 UI交互界面与Canvas画布叠加 本节课把threejs Cavnas画布和HTML元素叠加布局时候,可能遇到问题演示下,以后遇到类似的问题知道怎么排查。 插入div元素 在课程课件演示文件.html中插入一个div元素,你会看到地址元素影响canvas元素布局
红色
canvas画布绝对定位 如果你想设置threejs Canvas画布的style属性,可以通过renderer.domElement访问。 // canvas画布绝对定位 renderer.domElement.style.position = 'absolute'; renderer.domElement.style.top = '0px'; renderer.domElement.style.left = '0px'; 这时候你会发现你插入的div元素看不到了,这涉及到z-index的CSS布局知识点,具体说就是当两个HTML元素位置重
1 min read
Three.js

ThreeJS教程:three.js Canvas画布布局

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 three.js Canvas画布布局 学习本节课之前,可以先回顾下第一章节入门部分的6和12两小节关于threejs Canvas画布布局的讲解。 * 网页上局部特定尺寸:1.6 第一个3D案例—渲染器(opens new window) * 全屏,随窗口变化:1.12 Canvas画布布局和全屏(opens new window) * 局部,尺寸随窗口变化:在线案例(opens new window) Canvas元素 Canvas是HTML的元素之一,Canvas元素的CSS布局规律和div、img等其它HTML元素相似,webgl就是依赖于canvas实现,threejs是基于webgl封装的,自然也要依赖canvas,具体说就是把三场场景渲染到canvas画布上。
3 min read
Three.js

ThreeJS教程:三维软件导出PBR材质属性

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 三维软件导出PBR材质属性 实际开发的时候PBR材质的属性,很多时候是可以在三维建模软件中设置的,然后通过gltf导出即可,这样就不用在threejs代码设置。 通常美术对三维场景渲染的了解也比大部分前端程序员多的多,只要美术在三维建模软件设置好并导出包含pbr材质属性的gltf即可。 threejs与建模软件对接的问题 1. gltf能否存储3D建模软件的某个材质属性:有些三维软件特有的材质属性,不一定能通过gltf导出,也谈不上threejs解析 2. 三维建模能否导出PBR材质:能导出的话,能导出哪些属性,不能导出哪些属性 如果你的三维建模不能导出pbr材质,或者部分pbr材质属性无法导出,那你通常需要用代码方式添加材质,这样就麻烦些。 Blender导出PBR材质演示 首先Blender最新版导出gltf模型时候,是可以把PBR材质的很多属性导出的,比如金属度metalness、粗糙度roughness、清漆.clearcoat、透光率(透射度).transmission
3 min read
Three.js

ThreeJS教程:物理材质透光率.transmission

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 物理材质透光率.transmission 如果你已经掌握上节课内容,可以继续学习物理材质MeshPhysicalMaterial的透光率属性.transmission和折射率属性.ior。 透光率(透射度).transmission 为了更好的模拟玻璃、半透明塑料一类的视觉效果,可以使用物理透明度.transmission属性代替Mesh普通透明度属性.opacity。 使用.transmission属性设置Mesh透明度,即便完全透射的情况下仍可保持高反射率。 物理光学透明度.transmission的值范围是从0.0到1.0。默认值为0.0。 const mesh = gltf.scene.getObjectByName('玻璃01') mesh.material = new THREE.MeshPhysicalMaterial({ transmission: 1.0, //玻璃材质透光率,transmission替代opacity }) 折射率.ior 非金属材料
2 min read
Three.js

ThreeJS教程:MeshPhysicalMaterial清漆层

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 MeshPhysicalMaterial清漆层 MeshPhysicalMaterial和MeshStandardMaterial都是拥有金属度metalness、粗糙度roughness属性的PBR材质,MeshPhysicalMaterial是在MeshStandardMaterial基础上扩展出来的子类,除了继承了MeshStandardMaterial的金属度、粗糙度等属性,还新增了清漆.clearcoat、透光率.transmission、反射率.reflectivity、光泽.sheen、折射率.ior等等各种用于模拟生活中不同材质的属性。 清漆层属性.clearcoat 清漆层属性.clearcoat可以用来模拟物体表面一层透明图层,就好比你在物体表面刷了一层透明清漆,喷了点水。.clearcoat的范围0到1,默认0。 const material = new THREE.MeshPhysicalMaterial( { clearcoat: 1.0,//物体表面清漆层或者说
2 min read
NSDT场景编辑器 | NSDT 数字孪生 | GLTF在线编辑器 | 3D模型在线转换 | UnrealSynth虚幻合成数据生成器 | 3D模型自动纹理化工具
2023 power by nsdt©鄂ICP备2023000829号