三维重建

A collection of 24 posts
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
3D建模

Three.js教程:几何体旋转、缩放、平移变换

在线工具推荐:Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 3D数字孪生场景编辑器 几何体旋转、缩放、平移变换 通过前7节课的学习,我相信你已经对Threejs几何体内部顶点构成有了一定了解。 几何体Geometry对象有一系列的顶点属性,也封装了一系列的方法,通过.scale()、.translate()、.rotateX()等方法可以对几何体本身进行缩放、平移、旋转等几何变换。通过.scale()、.translate()、.rotateX()这些方法对几何体进行变换,注意本质上都是改变结合体顶点位置坐标数据。你可以执行测斜方法,然后在浏览器控制打印顶点位置坐标数据console.log(geometry.vertices);,然后对比几何体变化前后定点位置坐标是否变化。 var geometry = new THREE.BoxGeometry(100, 100, 100); //创建一个立方体几何对象Geometry // 几何体xyz三个方向都放大2倍 geometry.
2 min read
3D建模

Three.js教程:访问几何体对象的数据

推荐:将NSDT场景编辑器加入你的3D工具链 其他系列工具:NSDT简石数字孪生 访问几何体对象的数据 实际开发项目的时候,可能会加载外部模型,有些时候需要获取模型几何体的顶点数据,如果想获取几何体的顶点数据首先要熟悉three.js几何体BoxGeometry和BufferGeometry的结构。 访问几何体顶点数据其实很简单,刚开始学习不用刻意记忆,直接查看threejs文档,就像访问javascript对象的属性一样。 测试BoxGeometry 调用BoxGeometry创建一个立方体,执行THREE.BoxGeometry构造函数会自动生成几何体对象的顶点位置坐标、顶点法向量等数据。 你可以通过执行下面代码,然后查看浏览器控制台打印的数据 var geometry = new THREE.BoxGeometry(100, 100, 100); //创建一个立方体几何对象Geometry console.log(geometry); console.log('几何体顶点位置数据',geometry.vertices); console.log('三角行面数据
3 min read
Three.js教程:Face3对象定义Geometry的三角形面
3D建模

Three.js教程:Face3对象定义Geometry的三角形面

推荐:将NSDT场景编辑器加入你的3D工具链 其他系列工具:NSDT简石数字孪生 Face3对象定义Geometry的三角形面 几何体Geometry的三角面属性geometry.faces和缓冲类型几何体BufferGeometry顶点索引属性BufferGeometry.index类似都是顶点位置数据的索引值,用来组织网格模型三角形的绘制。 学习本节课最好对照2.4 顶点索引复用顶点数据学习。 下面代码自定义了一个由两个三角形构成的几何体,两个三角形有两个顶点坐标位置是重合的。 var geometry = new THREE.Geometry(); //声明一个几何体对象Geometry var p1 = new THREE.Vector3(0, 0, 0); //顶点1坐标 var p2 = new THREE.Vector3(0, 100, 0); //顶点2坐标 var p3 = new THREE.Vector3(50, 0, 0); //顶点3坐标 var p4 = new
6 min read
3D建模

Three.js教程:设置Geometry顶点位置、顶点颜色数据

推荐:将NSDT场景编辑器加入你的3D工具链 其他系列工具:NSDT简石数字孪生   前面几篇文章通过缓冲类型几何体BufferGeometry给大家讲解了顶点位置、颜色、法向量、索引数据,本节课给大家引入一个新的threejs几何体APIGeometry。几何体Geometry和缓冲类型几何体BufferGeometry表达的含义相同,只是对象的结构不同,Threejs渲染的时候会先把Geometry转化为BufferGeometry再解析几何体顶点数据进行渲染。 Vector3定义顶点位置坐标数据 Vector3是threejs的三维向量对象,可以通过Vector3对象表示一个顶点的xyz坐标,顶点的法线向量。 几何体Geometry的顶点位置属性geometry.vertices和缓冲类型几何体BufferGeometry顶点位置属性BufferGeometry.attributes.position是对应的。 var geometry = new THREE.Geometry(); //声明一个几何体对象Geometry var p1 = new THREE.Ve
3 min read
3D建模

Three.js教程:顶点索引复用顶点数据

推荐:将NSDT场景编辑器加入你3D工具链 其他工具系列:NSDT简石数字孪生 顶点索引复用顶点数据 通过几何体BufferGeometry的顶点索引属性BufferGeometry.index可以设置几何体顶点索引数据,如果你有WebGL基础很容易理解顶点索引的概念,如果没有也没有关系,下面会通过一个简单的例子形象说明。 比如绘制一个矩形网格模型,至少需要两个三角形拼接而成,两个三角形,每个三角形有三个顶点,也就是说需要定义6个顶点位置数据。对于矩形网格模型而言,两个三角形有两个顶点位置是重合的。也就是说可以重复的位置可以定义一次,然后通过通过顶点数组的索引值获取这些顶点位置数据。 不使用顶点索引 下面通过几何体六个顶点定义了两个三角形,几何体的顶点位置数据、顶点法向量数据都是6个。 var geometry = new THREE.BufferGeometry(); //声明一个空几何体对象 //类型数组创建顶点位置position数据 var vertices = new Float32Array([ 0, 0, 0, //顶点1坐标 80, 0, 0,
5 min read
Three.js教程:顶点法向量数据光照计算
3D建模

Three.js教程:顶点法向量数据光照计算

推荐:将NSDT场景编辑器加入你3D工具链 其他工具系列:NSDT简石数字孪生 顶点法向量数据光照计算 前面两节课讲解到了顶点位置坐标数据、顶点颜色数据,这节课讲解第三种顶点数据:顶点法向量。 如果你有初高中物理的光学基础,应该会有漫反射、镜面反射的概念。比如太阳光照在一个物体表面,物体表面与光线夹角位置不同的区域明暗程度不同,WebGL中为了计算光线与物体表面入射角,你首先要计算物体表面每个位置的法线方向,在Threejs中表示物体的网格模型Mesh的曲面是由一个一个三角形构成,所以为了表示物体表面各个位置的法线方向,可以给几何体的每个顶点定义一个方向向量。 不设置顶点法向量数据 下面代码仅仅定义了几何体BufferGeometry的顶点位置数据,没有定义顶点法向量数据。没有法向量数据,点光源、平行光等带有方向性的光源不会起作用,三角形平面整个渲染效果相对暗淡,而且两个三角形分界位置没有棱角感。 var geometry = new THREE.BufferGeometry(); //声明一个空几何体对象 //类型数组创建顶点位置position数据 var ver
4 min read
Three.js教程:顶点颜色数据插值计算
3D建模

Three.js教程:顶点颜色数据插值计算

推荐:将NSDT场景编辑器加入你3D工具链 其他工具系列:NSDT简石数字孪生 顶点颜色数据插值计算 上节课自定义几何体给大家介绍了一个顶点位置坐标概念,本节课给大家介绍一个新的几何体顶点概念,就是几何体顶点颜色。 通常几何体顶点位置坐标数据和几何体顶点颜色数据都是一一对应的,比如顶点1有一个顶点位置坐标数据,也有一个顶点颜色数据,顶点2同样也有一个顶点位置坐标数据,也有一个顶点颜色数据... 每个顶点设置一种颜色 你可以在上节课代码更改为下面代码设置,你可以看到几何体的六个顶点分别渲染为几何体设置的顶点颜色数据。 var geometry = new THREE.BufferGeometry(); //声明一个缓冲几何体对象 //类型数组创建顶点位置position数据 var vertices = new Float32Array([ 0, 0, 0, //顶点1坐标 50, 0, 0, //顶点2坐标 0, 100, 0, //顶点3坐标 0, 0, 10, //顶点4坐标 0, 0, 100, //顶点5坐标 50, 0, 10,
5 min read
Three.js教程:顶点位置数据解析渲染
3D建模

Three.js教程:顶点位置数据解析渲染

推荐:将NSDT场景编辑器加入你3D工具链 其他工具系列:NSDT简石数字孪生 顶点位置数据解析渲染 如果你没有WebGL基础,可以先不用记忆每个的threejs 具体内容,有一个大致印象即可,学习本节课的重点是建立顶点的概念。如果你建立了顶点的概念,那么对于你深入理解学习Three.js很有帮助。 如果你已经有WebGL基础或者说图形学基础,说明你肯定有顶点的概念,本节课重点可以放在学习threejs的API使用细节,threejs引擎是如何封装webgl的。 JavaScript类型化数组 本节课会用到javascript的类型化数组,你如果不了解,可查看MDN关于javascript类型化数组的介绍,也可以查看文章类型化数组。 自定义几何体 你可以直接调用BoxGeometry直接创建一个立方体几何体,调用SphereGeometry创建一个球体几何体。不过为了大家更好的建立顶点概念,通过下面的代码自定义了一个几何体,通过网格模型可以渲染出来两个三角形效果。 下面代码通过Threejs引擎的BufferGeometry和BufferAttribute两个A
6 min read
3D建模

Three.js教程:光源

推荐:将NSDT场景编辑器加入你3D工具链 其他工具系列:NSDT简石数字孪生 threejs光源 为了更好的渲染场景,threejs提供了生活中常见的一些光源的API。 你可以测试前面几节课案例中的光源代码,比如全部删除所有的光源代码,你会发现场景中的物体是黑色的,就像生活中一样没有光,物体是黑色的。 常见光源类型 本节课不会对threejs各类光源进行深入介绍,主要是简单展示下,对于初学者有一个印象就可以。 光源简介AmbientLight环境光PointLight点光源DirectionalLight平行光,比如太阳光SpotLight聚光源 环境光创建 //环境光 环境光颜色与网格模型的颜色进行RGB进行乘法运算 var ambient = new THREE.AmbientLight(0x444444); scene.add(ambient); 点光源创建 //点光源 var point = new THREE.PointLight(0xffffff); point.position.set(400, 200, 300); //点光源位置 /
3 min read
3D建模

Three.js教程:材质效果

推荐:将NSDT场景编辑器加入你3D工具链 其他工具系列:NSDT简石数字孪生 材质效果 前面案例中几何体对应网格模型材质只是设置了一个颜色,实际渲染的时候往往会设置其他的参数,比如实现玻璃效果要设置材质透明度,一些光亮的表面要添加高光效果。 半透明效果 更改场景中的球体材质对象构造函数THREE.MeshLambertMaterial()的参数,添加opacity和transparent属性,opacity的值是0~1之间,transparent表示是否开启透明度效果, 默认是false表示透明度设置不起作用,值设置为true,网格模型就会呈现透明的效果,使用下面的代码替换原来的球体网格模型的材质, 刷新浏览器,通过鼠标旋转操作场景,可以看到半透明的球体和立方体颜色叠加融合的效果。 var sphereMaterial=new THREE.MeshLambertMaterial({ color:0xff0000, opacity:0.7, transparent:true });//材质对象 材质对象的一些属性可以在构造函数参数中设置,也可
5 min read
3D建模

Three.js教程:3D场景中插入新的几何体

推荐:将NSDT场景编辑器加入你3D工具链 其他工具系列:NSDT简石数字孪生 3D场景中插入新的几何体 前面课程绘制了一个立方体效果,下面通过three.js的球体构造函数SphereGeometry()在三维场景中添加一个球几何体。 SphereGeometry构造函数 SphereGeometry(radius, widthSegments, heightSegments) 第一个参数radius约束的是球的大小,参数widthSegments、heightSegments约束的是球面的精度,球体你可以理解为正多面体,就像圆一样是正多边形,当分割的边足够多的时候,正多边形就会无限接近于圆,球体同样的的道理, 有兴趣可以研究利用WebGL实现它的算法,对于three.js就是查找文档看使用说明。 参数含义radius球体半径widthSegments控制球面精度,水平细分数 heightSegments| 控制球面精度,水平细分数| 绘制球体网格模型 使用THREE.SphereGeometry(60,40,40);替换立方体几何体代码new THREE
4 min read
3D建模

Three.js教程:鼠标操作三维场景

推荐:将NSDT场景编辑器加入你3D工具链 其他工具系列:NSDT简石数字孪生 为了使用鼠标操作三维场景,可以借助three.js众多控件之一OrbitControls.js,可以在下载的three.js-master文件中找到(three.js-master\examples\js\controls)。 然后和引入three.js文件一样在html文件中引入控件OrbitControls.js。本节课的目的不是为了深入讲解OrbitControls.js,主要目的一方面向大家展示下threejs的功能,另一方面后面课程学习过程中经常会通过鼠标旋转、缩放模型进行代码调试。 代码实现 OrbitControls.js控件支持鼠标左中右键操作和键盘方向键操作,具体代码如下,使用下面的代码替换1.1节中renderer.render(scene,camera);即可。 function render() { renderer.render(scene,camera);//执行渲染操作 } render(); var controls = new THREE.OrbitCont
4 min read
3D建模

Three.js教程:旋转动画、requestAnimationFrame周期性渲染

推荐:将NSDT场景编辑器加入你3D工具链 其他工具系列:NSDT简石数字孪生 基于WebGL技术开发在线游戏、商品展示、室内漫游往往都会涉及到动画,初步了解three.js可以做什么,深入讲解three.js动画之前,本节课先制作一个简单的立方体旋转动画。 本节课是在1.1节 第一个3D场景已绘制好的立方体代码基础上进行更改。 周期性渲染 在1.1节中讲解过,每执行一次渲染器对象WebGLRenderer的渲染方法.render(),浏览器就会渲染出一帧图像并显示在Web页面上,这就是说你按照一定的周期不停地调用渲染方法.render()就可以不停地生成新的图像覆盖原来的图像。这也就是说只要一边旋转立方体,一边执行渲染方法.render()重新渲染,就可以实现立方体的旋转效果。 为了实现周期性渲染可以通过浏览器全局对象window对象的一个方法setInterval(),可以通过window对象调用该方法window.setInterval(),也可以直接以函数形式调用setInterval()。 setInterval()是一个周期性函数,就像一个定时器,每隔多少毫秒
5 min read
Three.js教程:第一个3D场景
3D建模

Three.js教程:第一个3D场景

推荐:将NSDT场景编辑器加入你3D工具链 其他工具系列:https://nsdt.cloud/ 下面的代码完整展示了通过three.js引擎创建的一个三维场景,在场景中绘制并渲染了一个立方体的效果,为了大家更好的宏观了解three.js引擎, 尽量使用了一段短小但完整的代码实现一个实际的三维效果图。 学习建议 刚一开始学习,不需要完全看懂下面的代码,能够修改增删部分代码就可以,随着时间的推移就能够很好的使用三维引擎three.js。 本课程风格和大多数课程风格不同,注意一定要结合案例代码学习,在案例代码的基础上调试体验总结,就像做化学实验一样,不要仅仅阅读文字。 .html文件引入three.js引擎 在.html文件中引入three.js就像前端经常使用的jquery.js一样引入即可。 我已经把three.js文件上传到了服务器, 可以通过下面的URL地址去加载。