Three.js

A collection of 192 posts
Three.js

Three.js教程:几何体顶点位置数据和点模型

推荐:将NSDT场景编辑器加到你的3D工具链 工具集:NSDT简石数字孪生 几何体顶点位置数据和点模型 本章节主要目的是给大家讲解几何体geometry的顶点概念,相对偏底层一些,不过掌握以后,你更容易深入理解Threejs的几何体和模型对象。 缓冲类型几何体BufferGeometry threejs的长方体BoxGeometry、球体SphereGeometry等几何体都是基于BufferGeometry (opens new window)类构建的,BufferGeometry是一个没有任何形状的空几何体,你可以通过BufferGeometry自定义任何几何形状,具体一点说就是定义顶点数据。 //创建一个空的几何体对象 const geometry = new THREE.BufferGeometry(); BufferAttribute定义几何体顶点数据 通过javascript类型化数组 (opens new window)Float32Array创建一组xyz坐标数据用来表示几何体的顶点坐标。 //类型化数组创建顶点数据 const vertic
3 min read
Three.js

Three.js教程:threejs语法总结

推荐:将NSDT场景编辑器加入你的3D工具链 其他系列工具:NSDT简石数字孪生 threejs语法总结 本节课从JavaScript面向对象语法的角度,给大家总结下threejs API的使用习惯,这样方便大家更好的使用threejs API。 Three.js语法总结:类(构造函数) Three.js提供了各种各样的类(构造函数),通过new关键字可以实例化类(构造函数),获得一个对象,对象具有属性和方法。 // new实例化类THREE.MeshLambertMaterial,创建一个材质对象 const material = new THREE.MeshLambertMaterial(); // 可以看到材质对象的属性color、side、opacity、transparent... // 通过属性可以看到threejs默认的属性值 console.log('查看材质对象',material); // 查看材质默认属性值 console.log('material.color',material.color); console.log('material.s
3 min read
Three.js

Three.js教程:gui.js库(分组)

推荐:将NSDT场景编辑器加入你的3D工具链 其他系列工具:NSDT简石数字孪生 gui.js库(分组) 当GUI交互界面需要控制的属性比较多的时候,为了避免混合,可以适当分组管理,这样更清晰。 gui交互界面不分组 gui交互界面不分组,只有一个默认的总的菜单。 const gui = new GUI(); //创建GUI对象 //创建一个对象,对象属性的值可以被GUI库创建的交互界面改变 const obj = { color: 0x00ffff,// 材质颜色 specular: 0x111111,// 材质高光颜色 }; // 材质颜色color gui.addColor(obj, 'color').onChange(function(value){ material.color.set(value); }); // 材质高光颜色specular gui.addColor(obj, 'specular').onChange(function(value){ material.
3 min read
Three.js

Three.js教程:gui调试3-下拉菜单、单选框

推荐:将NSDT场景编辑器加入你的3D工具链 其他系列工具:NSDT简石数字孪生 gui调试3-下拉菜单、单选框 前面大家学过通过.add()方法可以添加一个拖动条用来改变对象的某个属性,本节课给大家介绍.add()方法创建新的UI交互界面,比如下拉菜单、单选框。 .add()方法参数3和4数据类型:数字 格式:add(控制对象,对象具体属性,其他参数) 其他参数,可以一个或多个,数据类型也可以不同,gui会自动根据参数形式,自动生成对应的交互界面。 参数3和参数4,分别是一个数字,交互界面是一个鼠标可以拖动的拖动条,可以在一个区间改变属性的值 // 参数3、参数4数据类型:数字(拖动条) gui.add(obj, 'x', 0, 180).onChange(function (value) { mesh.position.x = value; }); .add()方法参数3数据类型:
3 min read
Three.js

Three.js教程:gui调试界面2-颜色命名等

推荐:将NSDT场景编辑器加入你的3D工具链 其他系列工具:NSDT简石数字孪生 gui调试界面2-颜色命名等 本节课结合threejs,给大家介绍gui.js库更多的方法。 .name()方法 .add()创建的交互界面,会默认显示所改变属性的名字,为了通过交互界面更好理解你改变的某个对象属性,你可以通过.name()方法改变gui生成交互界面显示的内容。 const gui = new GUI();//创建GUI对象 gui.add(ambient, 'intensity', 0, 2.0).name('环境光强度'); gui.add(directionalLight, 'intensity', 0, 2.0).name('平行光强度'); 步长.step()方法 步长.step()方法可以设置交互界面每次改变属性值间隔是多少。 gui.add(ambient, 'intensity',
2 min read
Three.js

Three.js教程:gui.js库(可视化改变三维场景)

推荐:将NSDT场景编辑器加入你的3D工具链 其他系列工具:NSDT简石数字孪生 gui.js库(可视化改变三维场景) gui.js库(可视化改变三维场景) dat.gui.js说白了就是一个前端js库,对HTML、CSS和JavaScript进行了封装,学习开发的时候,借助dat.gui.js可以快速创建控制三维场景的UI交互界面,你打开课件中案例源码体验一下就能感受到。 课程学习dat.gui.js也不仅仅是为了学习dat.gui.js,也是建立一种思想,就是threejs三维空间的很多参数,不是心算出来的,往往需要可视化的方式调试出来。 引入dat.gui.js gihtub地址:https://github.com/dataarts/dat.gui npm地址:https://www.npmjs.com/package/dat.gui 你可以通过npm或github方式获得dat.gui.js库,
4 min read
Three.js

Three.js教程:WebGL渲染器设置(锯齿模糊)

推荐:将NSDT场景编辑器加入你的3D工具链 其他系列工具:NSDT简石数字孪生 WebGL渲染器设置(锯齿模糊) 一般实际开发,threejs的WebGL渲染器需要进行一些通用的基础配置,本节课给大家简单介绍下,比如渲染模糊或锯齿问题。 渲染器锯齿属性.antialias 设置渲染器锯齿属性.antialias的值可以直接在参数中设置,也可通过渲染器对象属性设置。 const renderer = new THREE.WebGLRenderer({ antialias:true, }); 或 renderer.antialias = true, 设备像素比window.devicePixelRatio 如果你有web前端基础,应该了解window对象,设备像素比.devicePixelRatio是window对象的一个属性,该属性的值和你的硬件设备屏幕相关,不同硬件设备的屏幕window.devicePixelRatio的值可能不同,可能就是1、1.5、2.0等其它值。 // 不同硬件设备的屏幕的设备像素比window.devicePixelRat
2 min read
Three.js教程:高光网格材质Phong
Three.js

Three.js教程:高光网格材质Phong

推荐:将NSDT场景编辑器加入你的3D工具链 其他系列工具:NSDT简石数字孪生 高光网格材质Phong 高光网格材质MeshPhongMaterial和基础网格材质MeshBasicMaterial、漫反射网格材质MeshLambertMaterial一样都是网格模型的Mesh的材质。 高光网格材质MeshPhongMaterial和漫反射网格材质MeshLambertMaterial一样会受到光照的影响。 MeshPhongMaterial对光照反射特点 MeshPhongMaterial和MeshLambertMaterial都会收到光照的影响区别在于,对光线反射方式有差异。 MeshPhongMaterial可以实现MeshLambertMaterial不能实现的高光反射效果。对于高光效果,你可以想象一下,你在太阳下面观察一辆车,你会发现在特定角度和位置,你可以看到车表面某个局部区域非常高亮。 镜面反射与漫反射 MeshPhongMaterial可以提供一个镜面反射效果,可以类比你生活中拿一面镜子,放在太阳光下,调整角度,可以把太阳光反射到其它地方,如果
3 min read
Three.js教程:Threejs常见几何体简介
Three.js

Three.js教程:Threejs常见几何体简介

推荐:将NSDT场景编辑器加入你的3D工具链 其他系列工具:NSDT简石数字孪生 Threejs常见几何体简介 Three.js提供的几何体API很多,本节课先给大家介绍几个比较简单的案例,为后面的学习打下基础。 你可以结合threejs文档,把下面动手把下面几何体相关代码全部测试一遍,并预览3D效果。 //BoxGeometry:长方体 const geometry = new THREE.BoxGeometry(100, 100, 100); // SphereGeometry:球体 const geometry = new THREE.SphereGeometry(50); // CylinderGeometry:圆柱 const geometry = new THREE.CylinderGeometry(50,50,100); // PlaneGeometry:矩形平面 const geometry = new THREE.PlaneGeometry(100,50); // CircleGeometry:
2 min read
Three.js

Three.js教程:阵列立方体和相机适配体验

推荐:将NSDT场景编辑器加入你的3D工具链 其他系列工具:NSDT简石数字孪生 阵列立方体和相机适配体验 本节课通过阵列一片立方体,进一步体验下透视投影相机的投影规律。 for循环创建一列模型 const geometry = new THREE.BoxGeometry(100, 100, 100); //材质对象Material const material = new THREE.MeshLambertMaterial({ color: 0x00ffff, //设置材质颜色 transparent: true,//开启透明 opacity: 0.5,//设置透明度 }); for (let i = 0; i < 10; i++) { const mesh = new THREE.Mesh(geometry, material); //网格模型对象Mesh // 沿着x轴分布 mesh.position.
3 min read
Three.js

Three.js教程:stats性能监视器

推荐:将NSDT场景编辑器加入你的3D工具链 其他系列工具:NSDT简石数字孪生 stats性能监视器(计算渲染帧率FPS) three.js每执行WebGL渲染器.render()方法一次,就在canvas画布上得到一帧图像,不停地周期性执行.render()方法就可以更新canvas画布内容,一般场景越复杂往往渲染性能越低,也就是每秒钟执行.render()的次数越低。 通过stats.js库可以查看three.js当前的渲染性能,具体说就是计算three.js的渲染帧率(FPS),所谓渲染帧率(FPS),简单说就是three.js每秒钟完成的渲染次数,一般渲染达到每秒钟60次为最佳状态。 stats.js下载链接:https://github.com/mrdoob/stats.js 引入Stats //引入性能监视器stats.js import Stats from 'three/addons/libs/stats.module.js'; Stats使用
3 min read
Three.js

Three.js教程:Canvas画布布局和全屏

在线工具推荐:三维数字孪生场景工具 - GLTF/GLB在线编辑器 - Three.js AI自动纹理化开发 - YOLO 虚幻合成数据生成器 - 3D模型在线转换 -  3D模型预览图生成服务 Canvas画布布局和全屏 threejs渲染输出的结果就是一个Cavnas画布,canvas画布也是HTML的元素之一,这意味着three.js渲染结果的布局和普通web前端习惯是一样的。 通过renderer.domElement属性可以访问threejs的渲染结果,也就是HTML的元素canvas画布。 非全屏局部布局 你可以把threejs的渲染结果renderer.domElement,插入到web页面上任何一个元素中,只要符合你项目的布局规则即可。
3 min read
Three.js

Three.js教程:动画渲染循环

推荐:将NSDT场景编辑器加入你的3D工具链 其他系列工具:NSDT简石数字孪生 动画渲染循环 threejs可以借助HTML5的API请求动画帧window.requestAnimationFrame实现动画渲染。 请求动画帧window.requestAnimationFrame // requestAnimationFrame实现周期性循环执行 // requestAnimationFrame默认每秒钟执行60次,但不一定能做到,要看代码的性能 let i = 0; function render() { i+=1; console.log('执行次数'+i); requestAnimationFrame(render);//请求再次执行函数render } render(); threejs旋转动画 动画说白了就是一张张照片,连起来依次展示,这样就形成一个动画效果,只要帧率高,人的眼睛就感觉不到卡顿,是连续的视频效果。 const renderer = new THREE.WebGLRenderer(); renderer.set
2 min read
Three.js教程:平行光与环境光
Three.js

Three.js教程:平行光与环境光

推荐:将NSDT场景编辑器加入你的3D工具链 其他系列工具:NSDT简石数字孪生 平行光与环境光 本节课通过平行光DirectionalLight (opens new window)和环境光AmbientLight (opens new window)进一步了解光照对应模型Mesh表面的影响。 点光源辅助观察PointLightHelper 通过点光源辅助观察对象PointLightHelper (opens new window)可视化点光源。 预览观察:可以借助相机控件OrbitControls旋转缩放三维场景便于预览点光源位置 // 光源辅助观察 const pointLightHelper = new THREE.PointLightHelper(pointLight, 10); scene.add(pointLightHelper); 改变点光源位置,观察光照效果变化。 directionalLight.position.set(100, 60, 50); // 改变点光源位置,使用OrbitControls辅助观察 pointLight.posit
3 min read
Three.js

Three.js教程:相机控件轨道控制器OrbitControls

推荐:将NSDT场景编辑器加入你的3D工具链 其他系列工具:NSDT简石数字孪生 相机控件轨道控制器OrbitControls 平时开发调试代码,或者展示模型的时候,可以通过相机控件OrbitControls实现旋转缩放预览效果。 OrbitControls使用 你可以打开课件案例源码测试下效果。 * 旋转:拖动鼠标左键 * 缩放:滚动鼠标中键 * 平移:拖动鼠标右键 引入扩展库OrbitControls.js // 引入轨道控制器扩展库OrbitControls.js import { OrbitControls } from 'three/addons/controls/OrbitControls.js'; 注意:如果你在原生.html文件中,使用上面引入方式import { OrbitControls } from 'three/addons/controls/OrbitControls.js';,注意通过
2 min read
Three.js教程:光源对物体表面影响
Three.js

Three.js教程:光源对物体表面影响

推荐:将NSDT场景编辑器加入你的3D工具链 其他系列工具:NSDT简石数字孪生 光源对物体表面影响 实际生活中物体表面的明暗效果是会受到光照的影响,threejs中同样也要模拟光照Light对网格模型Mesh表面的影响。 你可以打开课件中案例源码,对比有光照和无光照两种情况,网格模型Mesh表面的差异。 受光照影响材质 threejs提供的网格材质,有的受光照影响,有的不受光照影响。 基础网格材质MeshBasicMaterial (opens new window)不会受到光照影响。 //MeshBasicMaterial不受光照影响 const material = new THREE.MeshBasicMaterial(); 漫反射网格材质MeshLambertMaterial (opens new window)会受到光照影响,该材质也可以称为Lambert网格材质,音译为兰伯特网格材质。 一个立方体长方体使用MeshLambertMaterial材质,不同面和光线夹角不同,立方体不同面就会呈现出来不同的明暗效果。 //MeshLambertMa
3 min read
Three.js

Three.js教程:三维坐标系

推荐:将NSDT场景编辑器加入你的3D工具链 其他系列工具:NSDT简石数字孪生 三维坐标系 本节课的目的就是为了加强大家对threejs三维空间的认识。 辅助观察坐标系 THREE.AxesHelper()的参数表示坐标系坐标轴线段尺寸大小,你可以根据需要改变尺寸。 // AxesHelper:辅助观察的坐标系 const axesHelper = new THREE.AxesHelper(150); scene.add(axesHelper); 材质半透明设置 设置材质半透明,这样可以看到坐标系的坐标原点。 const material = new THREE.MeshBasicMaterial({ color: 0x0000ff, //设置材质颜色 transparent:true,//开启透明 opacity:0.5,//设置透明度 }); AxesHelper的xyz轴 three.js坐标轴颜色红R、绿G、蓝B分别对应坐标系的x、y、z轴,对于three.js的3D坐标系默认y轴朝上。 设置模型在坐标系中的位置或
3 min read
Three.js教程:渲染器
Three.js

Three.js教程:渲染器

推荐:将NSDT场景编辑器加入你的3D工具链。 其他系列工具:NSDT简石数字孪生 渲染器 生活中如果有了景物和相机,那么如果想获得一张照片,就需要你拿着相机,按一下,咔,完成拍照。对于threejs而言,如果完成“咔”这个拍照动作,就需要一个新的对象,也就是WebGL渲染器WebGLRenderer (opens new window)。 WebGL渲染器WebGLRenderer 通过WebGL渲染器WebGLRenderer (opens new window)可以实例化一个WebGL渲染器对象。 设置Canvas画布尺寸.setSize() // 定义threejs输出画布的尺寸(单位:像素px) const width = 800; //宽度 const height = 500; //高度 renderer.setSize(width, height); //设置three.js渲染区域的尺寸(像素px) 渲染器渲染方法.render() 渲染器WebGLRenderer执行渲染方法.render(
2 min read
Three.js教程:透视投影相机
Three.js

Three.js教程:透视投影相机

推荐:将NSDT场景编辑器加入你的3D工具链。 其他系列工具:NSDT简石数字孪生 Threejs如果想把三维场景Scene渲染到web网页上,还需要定义一个虚拟相机Camera,就像你生活中想获得一张照片,需要一台用来拍照的相机。 透视投影相机PerspectiveCamera Threejs提供了正投影相机OrthographicCamera (opens new window)和透视投影相机PerspectiveCamera (opens new window)。本节课先给大家比较常用的透视投影相机PerspectiveCamera。 透视投影相机PerspectiveCamera本质上就是在模拟人眼观察这个世界的规律。 相机位置.position 生活中用相机拍照,你相机位置不同,拍照结果也不同,threejs中虚拟相机同样如此。 比如有一间房子,你拿着相机站在房间里面,看到的是房间内部,站在房子外面看到的是房子外面效果。 相机对象Camera具有位置属性.position,通过位置属性.position可以设置相机的位置。 相机观察目标.lookAt
5 min read
Three.js教程:常见光源类型
3D建模

Three.js教程:常见光源类型

推荐:将NSDT场景编辑器加入你的3D工具链 其他系列工具:NSDT简石数字孪生 常见光源类型 Threejs虚拟光源是对自然界光照的模拟,threejs搭建虚拟场景的时候,为了更好的渲染场景,往往需要设置不同的光源,设置不同的光照强度,就像摄影师给你拍照要设置各种辅助灯光一样。 环境光AmbientLight 环境光是没有特定方向的光源,主要是均匀整体改变Threejs物体表面的明暗效果,这一点和具有方向的光源不同,比如点光源可以让物体表面不同区域明暗程度不同。 //环境光:环境光颜色RGB成分分别和物体材质颜色RGB成分分别相乘 var ambient = new THREE.AmbientLight(0x444444); scene.add(ambient);//环境光对象添加到scene场景中 你可以把光源颜色从0x444444更改为0x888888,可以看到threejs场景中的网格模型表面变的更亮。 点光源PointLight 点光源就像生活中的白炽灯,光线沿着发光核心向外发散,同一平面的不同位置与点光源光线入射角是不同的,点光源照射下,同一个
8 min read
3D建模

Three.js教程:对象克隆、复制

推荐:将NSDT场景编辑器加入你的3D工具链 其他系列工具:NSDT简石数字孪生 对象克隆.clone()和复制.copy() Threejs大多数对象都有克隆.clone()和复制.copy()两个方法,点模型Points、线模型Line、网格网格模型Mesh一样具有这两个方法。 复制方法.copy() A.copy(B)表示B属性的值赋值给A对应属性。 var p1 = new THREE.Vector3(1.2,2.6,3.2); var p2 = new THREE.Vector3(0.0,0.0,0.0); p2.copy(p1) // p2向量的xyz变为p1的xyz值 console.log(
3 min read
3D建模

Three.js教程:模型对象旋转平移缩放变换

推荐:将NSDT场景编辑器加入你的3D工具链 其他系列工具:NSDT简石数字孪生 模型对象旋转平移缩放变换 点模型Points、线模型Line、网格网格模型Mesh等模型对象的基类都是Object3D,如果想对这些模型进行旋转、缩放、平移等操作,如何实现,可以查询Threejs文档Object3D对相关属性和方法的介绍。 缩放 网格模型Mesh的属性.scale表示模型对象的缩放比例,默认值是THREE.Vector3(1.0,1.0,1.0),.scale的属性值是一个三维向量对象Vector3,查看three.js文档你可以知道Vector3对象具有属性.x、.y、.z,Vector3对象还具有方法.set(),.set方法有三个表示xyz方向缩放比例的参数。 网格模型xyz方向分别缩放0.5,1.5,2倍 mesh.scale.set(0.5, 1.5, 2) x轴方向放大2倍 mesh.scale.x
3 min read
3D建模

Three.js教程:点、线、网格模型介绍

推荐:将NSDT场景编辑器加入你的3D工具链 其他系列工具:NSDT简石数字孪生 点、线、网格模型介绍 经过前面几章学习相信你对点模型Points、线模型Line、网格模型Mesh已经有了大致了解,本节课就对点、线、网格模型模型进行简单总结。 点模型Points、线模型Line、网格网格模型Mesh都是由几何体Geometry和材质Material构成,这三种模型的区别在于对几何体顶点数据的渲染方式不同,如果有一定WebGL基础,就更容易理解这一点了。 点模型Points 点模型Points就是几何体的每一个顶点数据渲染为一个方形区域,方形区域的大小可以设置。 var geometry = new THREE.BoxGeometry(100, 100, 100); //创建一个立方体几何对象Geometry // 点渲染模式 var material = new THREE.PointsMaterial({ color: 0xff0000, size: 5.0 //点对象像素尺寸 }); //材质对象 var points = new THREE.Points
4 min read
3D建模

Three.js教程:材质共有属性、私有属性

推荐:将NSDT场景编辑器加入你的3D工具链 其他系列工具:NSDT简石数字孪生 材质共有属性、私有属性 如果你的javascript语言基础还可以,应该明白类、基类、子类、父类等概念。如果你有这些类的概念,那么在学习Threejs的过程中,如何查找Threejs文档将会比较顺利。 点材质PointsMaterial、基础线材质LineBasicMaterial、基础网格材质MeshBasicMaterial、高光网格材质MeshPhongMaterial等材质都是父类Material的子类。 各种各样的材质子类都有自己的特定属性,比如点材质特有的尺寸属性.size、高光网格材质特有的高光颜色属性.specular等等这些属性可以成为子类材质的私有属性。 所有子类的材质都会从父类材质Material继承透明度opacity、面side等属性,这些来自父类的属性都是子类共有的属性。 .side属性 在Three.js开发过程中你可能会遇到下面的问题,比如three.js矩形平面planegeometry的网格模型插入场景看不到,一个球体或立方体网格模型如何背面显示贴图
3 min read
3D建模

Three.js教程:常用材质介绍

推荐:将NSDT场景编辑器加入你的3D工具链 其他系列工具:NSDT简石数字孪生 常用材质介绍 为了方便开发Threejs提供了一系列的材质,所有材质就是对WebGL着色器代码的封装,如果你不了解WebGL,会通过查阅Threejs文档使用相关材质类即可。 点材质PointsMaterial 点材质比较简单,只有PointsMaterial,通常使用点模型的时候会使用点材质PointsMaterial。 点材质PointsMaterial的.size属性可以每个顶点渲染的方形区域尺寸像素大小。 var geometry = new THREE.SphereGeometry(100, 25, 25); //创建一个球体几何对象 // 创建一个点材质对象 var material = new THREE.PointsMaterial({ color: 0x0000ff, //颜色 size: 3, //点渲染尺寸 }); //点模型对象 参数:几何体 点材质 var point = new THREE.Points(geometry, material); s
3 min read
NSDT场景编辑器 | NSDT 数字孪生 | GLTF在线编辑器 | 3D模型在线转换 | UnrealSynth虚幻合成数据生成器 | 3D模型自动纹理化工具
2023 power by nsdt©鄂ICP备2023000829号