《Three.js 开发指南》基于原书第二版
源码来自华章出版社官网随书源码,修改替换了其中不能跑的示例,保证每个demo都可以运行。
源码以及示例说明下载: git下载地址
huazhang目录下是第二版的修改源码。 huazhang3目录下面是第三版的源码。
第二版和第三版大同小异,第二版的three.js版本是69, 第三版的版本是95。

Three.js 官网文档

1. 用Three.js创建你的第一个三维场景

1.1 具有所有基本元素的hello world示例

2. 使用构建Three.js场景的基本组件

2.1 添加、删除、枚举、通过名字获取场景中的对象

2.2 雾化效果

2.3 材质效果覆盖

场景对象最重要的函数和属性的总结


2.4 three.js内建的几何体

2.5 自定义几何体,复制几何体

2.6 网格对象的函数和属性 position, rotation, scale, translate, visible

2.7 正投影相机和透视相机

if (camera instanceof THREE.PerspectiveCamera) {camera = new THREE.OrthographicCamera(window.innerWidth / -16, window.innerWidth / 16, window.innerHeight / 16, window.innerHeight / -16, -200, 500);camera.position.x = 120;camera.position.y = 60;camera.position.z = 180;camera.lookAt(scene.position);trackballControls = initTrackballControls(camera, renderer);this.perspective = "Orthographic";} else {camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000);camera.position.x = 120;camera.position.y = 60;camera.position.z = 180;camera.lookAt(scene.position);trackballControls = initTrackballControls(camera, renderer);this.perspective = "Perspective";}

2.8 让相机在指定点上聚焦

camera.lookAt( new THREE.Vector3(x, y, z));

3 . 学习使用Three.js中的光源

新版本Three.js中PointLight已经可以创建阴影。

详细参数可以参考:
three.js光源使用详解

颜色对象方法可参考:
THREE.Color颜色对象详解

3.1 AmbientLight环境光

3.2 PointLight 点光源

3.3 SpotLight 聚光灯

3.4 DirectionalLight 方向光

3.5 HemisphereLight 半球环境光

3.6 AreaLight 区域光

3.7 LensflaresLight 光晕光

4. 使用Three.js的材质


参数配置看这里: Three.js - 材质的使用参数详解

4. 1 MeshBasicMaterial 网格基础材质

4. 2 MeshDepthMaterial 网格深度材质, 颜色与离开相机的距离相关。

4. 3 材质结合: 基础材质 + 深度材质

4. 4 MeshNormalMaterial 网格法向材质, 法向材质可以将材质的颜色设置为其法向量的方向,有时候对于调试很有帮助。

4. 5 MeshFaceMaterial 网格面材质, 可以指定每个面使用的材质。

4. 6 MeshLambertMaterial 网格lambert材质, Lambert光照模型的主要特点是只考虑漫反射而不考虑镜面反射的效果,因而对于金属、镜子等需要镜面反射效果的物体就不适应,对于其他大部分物体的漫反射效果都是适用的。效果示例

4. 7 MeshPhongMaterial 网格phong材质, 和Lambert不同的是,Phong模型考虑了镜面反射的效果,因此对于金属、镜面的表现尤为适合。效果示例

4. 8 ShaderMaterial 着色器材质, glsl自定义材质,

4. 9 LineBasicMaterial 直线基础材质

4. 10 LineDashMaterial 虚线材质

着色器资源, 创建和分享着色器的好网站: http://glslsandbox.com/和https://www.shadertoy.com

5. 学习使用几何体

简单的参数可以看这里

5. 1 二维几何体

5.1.1 PlaneGeometry 二维矩形

5.1.2 CircleGeometry 二维圆

5.1.3 RingGeometry 二维环

5.1.4 ShapeGeometry 自定义二维图形, 可以通过一些函数画出二维图形。自定义参数示例

5. 2 三维几何体

5.2.1 BoxGeometry 长方体

5.2.2 SphereGeometry 球体 可以通过设置参数获得特殊的多面体,半球,伞形

5.2.3 CylinderGeometry 圆柱体 可以通过参数获得多边形柱体

5.2.4 TorusGeometry 三维圆环

5.2.5 TorusKnotGeometry 环状扭结

5.2.6 各种多面体

其实几何体还有线性几何体,可以看上一章。

6. 高级几何体和二元操作

这一章非常实用,介绍了很多将一维和二维的几何体转化为三维的方法。以及三维几何体合并、相减、相交等操作。对数据可视化应该比较有用。

6.1 ConvexGeometry 凸包几何体 包含三维点集的多面体 详细参数设置

6.2 LatheGeometry 通过旋转创建几何体 让一根曲线绕Z轴旋转一周,创建几何体 详细参数设置

6.3 ExtrudeGeometry 让一个平面形状沿某一根曲线拉伸,创建几何体 详细参数设置

6.4 TubeGeometry 管道几何体,让某一根曲线变粗,创建几何体 详细参数设置

6.5 把svg拉伸 让一个svg平面形状沿某一根曲线拉伸,创建几何体 详细参数设置, 依赖于d3-threeD.js库

6.6 ParametricGeometry 参数化几何体, 通过设置函数,创建各种几何体 详细参数设置

6.7 textGeometry 文字几何体 详细参数设置 示例中是老版本threejs的js文字方式,参数设置中是新版本的json文字方式 typeface在线字体库获取相关字体文件

6.8 几何体的二元操作 几何体的合并、相减、相交操作 详细参数设置 依赖于ThreeBSP库

7. 粒子,sprite和点云

这一章介绍了两种粒子系统: sprite和点云。sprite可以定制每一个粒子的样式,支持的点比较少。点云可以定制一群粒子的材质,支持的点更多;点云只可以定制单个粒子的颜色,单个粒子其他的属性都是通过修改材质统一设置的。粒子的位置在sprite和点云中都可以单独修改。

7.1 理解粒子

7.2 粒子颜色

7.3 点云基础

7.4 sprite + canvasRenderer 通过代码绘制canvas内容,并设置为THREE.SpriteCanvasMaterial的program属性值。

7.5a pointCloud + webglRenderer 通过代码绘制canvas内容,并设置为THREE.PointCloudMaterial的map属性值。

7.5b sprite + webglRenderer 通过代码绘制canvas内容,并设置为THREE.SpriteMaterial的map属性值。

7.6 雨滴 单个纹理 使用纹理图片来设置THREE.PointCloudMaterial的map属性值。

7.7 雪花 多个纹理 使用多个纹理图片来创建多个pointCloud。

7.8 sprite 使用大纹理图片的一部分

7.9 sprite 使用大纹理图片的多个部分

7.10 利用几何体模型的结点创建粒子系统

8. 创建、加载高级网格和几何体

这一章介绍了 1. 如何组合几何体。如果说第7章的粒子中的最小单元是平面的,那么这一章最小单元就是立体的。group之于merge, 有点类似于sprite之于pointCloud。 2. 如何加载三维模型文件。Blender是一个开源的制作三维几何体的软件,介绍了如何从Blender导出三维模型文件。
多种格式的比较和说明

8.1 group 组 group可以把多个object组合成一个object, 并对合成的object进行统一的位移、旋转、缩放操作。使用组的时候,还可以单独引用、修改、定位每一个单独的几何体,唯一需要注意的是,所有的位移、旋转、缩放操作都是相对于父对象的。

8.2 merge 合并 merge可以把多个几何体合并成一个几何体。内部的几何体共享一个材质。无法单独控制。merge的性能优于group,书中说可以提升5倍。

8.3 json object导入导出

8.4 json scene导入导出

8.5 blender 模型导出并显示

8.6 obj格式

8.7 obj-mtl格式

8.8 collada(.dae)格式

8.9 stl格式

8.10 ctm格式

8.11 vtk格式

8.12 pdb格式

8.13 PLY格式 粒子效果示例

8.14 awd格式

8.15 assimp格式

8.16 vrml格式

8.17 babylon格式 babylon可以整个scene导入

9. 创建动画和移动摄像机

RequestAnimationFrame 实现动画。 Tween.js实现补间。 光线追踪实现交互。 各种内置控制器。 变形和骨骼动画。

9.1.1 简单动画

9.1.2 选择对象

9.1.3 使用tween.js实现动画


9.2.1 轨迹球控制器

9.2.2 飞行控制器

9.2.3 翻滚控制器

9.2.4 第一视角控制器

9.2.5 轨道控制器

适合用来做地球的3D控制

9.3 变形动画和骨骼动画

9.3.1 用变形目标创建动画

9.3.1.1 用MorphAnimMesh创建动画 需要带有变形目标的模型

9.3.1.2 通过设置morphTargetInfluence创建动画 通过代码创建变形目标

9.3.2 用骨骼和蒙皮来创建动画

9.4 使用外部模型创建动画

9.4.1 用Blender创建骨骼动画

9.4.2 用Collada创建骨骼动画

9.4.3 用md2创建骨骼动画

10. 加载和使用纹理

10.1 加载纹理并应用到网格

dds格式纹理 pvr格式纹理 tga格式纹理

10.2 凹凸贴图

bump map这种贴图是一种灰度图,用表面上灰度的变化来描述目标表面的凹凸。Bump Map并没有改变物体的表面而只是影响光照的结果。把Bump Map叠加在已经渲染好的表面上,造成亮度上的扰动,从而让人以为是凹凸的。 更多贴图相关原理

10.3 法向量贴图

normal-map图中存储的东西是每个原始表面法线的迭代。使用Normal Map的先决条件--逐像素著色。引入NormalMap。这时光照计算和以往有点不同,把表面的法线用NormalMap中存储的法线来替代。这样当我们在计算表面光照情况的时候,就会因为法线不断的变化而产生比原来丰富的多的明暗变化。至于为什么会感觉出凹凸来这个就是人的眼睛自己骗自己了……其实那里本没有凹凸。

10.4 用光照贴图创建阴影效果 用阴影贴图来模拟阴影。只能用于静态场景。

10.5 用环境贴图创建反光效果(静态) ,用环境贴图创建反光效果(动态)

10.6 高光贴图 地球的海洋部分可以用反光更亮的部分来修饰。

10.7 自定义纹理映射 blender等建模软件可以设置uv映射,导出不同的obj文件。 Three.js也可以设置UV映射

10.8 重复纹理

10.9 使用canvas作为纹理

var canvas = document.createElement("canvas");
var canvasMap = new THREE.Texture(canvas);
var mat = new THREE.MeshPhongMaterial();
mat.map = canvasMap;
var mesh = new THREE.Mesh(geom, mat);

10.10 将画布作为凹凸贴图

10.11 将视频输出作为纹理 , 使用Three.VideoTexture的简化版本

var video = document.getElementById('video');
texture = new THREE.VideoTexture(video);

11. 自定义着色器和后期处理

这一章主要讲了后期处理。 可以对Three.js 输出的画面做一些After Effect 特效,比如模糊、电影、泛光等等,对提升视觉品质有很好的效果。各种不同的特效感觉像ps的滤镜,需要比较熟悉才能运用好。最后还介绍了用自定义着色器才制作后期特效。 自定义着色器也可应通过第4章4.8中的自定义材质来实现。

11.1 配置Three.js以进行后期处理 THREE.EffectComposer基础示例

11.2 后期处理通道

11.2.1 简单后期处理通道 这个示例分别展示了FilmPass的电视效果,BloomPass的泛光效果,DotScreenPass的点集效果,以及三者的融合效果。

GlitchPass电脉冲效果

11.2.2 使用掩码的高级效果组合器

地球与火星 maskPass可以对单独的物体做后期处理,比如地球和火星有不同的后期处理特效。

11.2.3 使用THREE.ShaderPass自定义效果

ShaderPass里面可以设置shader, 达到不同的效果。这些Shader都以Shader结尾。
shader合集
shader模糊效果
更多高级的shader效果

11.3 创建自定义后期处理着色器 自定义的shader效果

12. 在场景中添加物理效果和声音

这一章主要讲物理碰撞检测库Physijs, 它是一个three.js的配套库,在物理碰撞引擎ammo.js或者cannon.js上做了一层封装,方便three.js调用。

12.1创建基本的Three.js场景

多米诺骨牌

12.2 材质属性 设置物理的摩擦系数和弹性

12.3 基础图形 Physijs默认封装了不少网格几何体

12.4 使用约束限制对象的移动 PointConstraint限制对象在两点间移动;HingeConstraint创建类似门的约束;SlideConstraint将移动限制在一个轴上;ConeTwistConstraint创建类似于球销的约束。

运动的四轮小车 DOFConstraint实现细节的控制

12.4.6 在场景中添加声源 几何体上绑定声源,camera上绑定听筒,声音的大小随着距离的远近而变化。

《Three.js 开发指南》源码示例说明以及在线demo(原书第二版)附第三版的代码下载相关推荐

  1. 太空射击unity工程素材文件 飞机大战 飞行射击游戏源码(C#,Unity2019.2.4f1)素材+源码 最新写的,demo简单版本

    飞机大战素材 太空大战unity工程文件 飞行射击游戏源码(C#,Unity2019.2.4f1)素材+源码 最新写的,demo简单版本 希望能对初学者提供帮助,代码根据教材以及out了的代码更新了, ...

  2. WinFormreportViewer(rdlc)报表[列表]的使用(一)(附源码示例) 之配餐系统的开发

    紧接着"WinForm"reportViewer报表[矩阵]的使用(一)(附源码示例)" 之配餐系统的开发"这篇文章,此文与大家分享的是在 配餐系统的开发 中使 ...

  3. WinForm立体饼状图实现(附源码示例) 之配餐系统的开发

    本文所要将的是在"配餐系统"开发中 立体饼状图效果的实现,直接贴出代码和附上示例,相信需要的朋友可以很容易使用!项目中的效果图,如下: 实现 应用的是 System.Drawing ...

  4. WinFormreportViewer报表[矩阵]的使用(一)(附源码示例) 之配餐系统的开发

    winform开发中,报表在大多管理软件和数据分析中是必备的一个功能,追求简单.快捷.美观的报表开发是大家在做此类应用时比较关心的问题.就winform中的报表控件:大家熟知.不错的有reportVi ...

  5. 呼吸灯代码linux,ESP32 开发笔记(三)源码示例 3_LEDC_PWM 使用LEDC实现LED呼吸灯

    开发板购买链接 开发板简介 开发环境搭建 windows 源码示例: 0_Hello Bug (ESP_LOGX与printf)    工程模板/打印调试输出 1_LED                ...

  6. 《node.js开发指南》读后感

    <node.js开发指南>这部只有180多页的书,我花了一个多月的业余时间算是粗略看完了.中间因为公司项目的加班,中断了几次.大大拖累进度,现在空出来时间,写一点自己的小小感想吧. 先从缺 ...

  7. 计算机毕业设计Java智慧社区信息管理系统开发(源码+系统+mysql数据库+lw文档)

    计算机毕业设计Java智慧社区信息管理系统开发(源码+系统+mysql数据库+lw文档) 计算机毕业设计Java智慧社区信息管理系统开发(源码+系统+mysql数据库+lw文档) 本源码技术栈: 项目 ...

  8. JAVA计算机毕业设计智慧社区信息管理系统开发Mybatis+源码+数据库+lw文档+系统+调试部署

    JAVA计算机毕业设计智慧社区信息管理系统开发Mybatis+源码+数据库+lw文档+系统+调试部署 JAVA计算机毕业设计智慧社区信息管理系统开发Mybatis+源码+数据库+lw文档+系统+调试部 ...

  9. Extjs各版本的下载链接,包含ext3.4源码示例

    Extjs各版本的下载链接,包含ext3.4源码示例 最近在维护一个老平台,用的是ext3.4,老东西在网上找示例发现既然还有人收钱,谷歌了一下总算找到了一位免费的发布的,感谢 yipanbo 分享 ...

最新文章

  1. Oracle与JCP执行委员会分享了他们的Java EE策略
  2. 机器学习(MACHINE LEARNING)MATLAB求解状态转移矩阵
  3. 下列代码之后的结果为()?
  4. 前端学习(2110):组件化得开发和实现步骤
  5. 安卓应用安全指南 4.4.2 创建/使用服务 规则书
  6. Java中常见的URL问题及解决方案
  7. [Flex]Flex编程注意之自动获取焦点、监听全局键盘事件
  8. 目前M院M师的教学乱象
  9. vscode中怎样格式化js代码_VSCode代码格式化设置
  10. 华为网络安全工程师:HCNA-Security(H12-711)题型解析(第一部分)-马青-专题视频课程...
  11. php酒店系统论文,基于PHP的酒店管理系统PHP1008(毕业设计+论文)
  12. mpu6050惯性导航学习记录
  13. 基于SpringBoot的QQ邮箱登录注册
  14. python 天天向上求几天数_Python十题(第2课)
  15. linux命令 - tail:查看文件最后几行的命令
  16. Verilog语言、语法
  17. U盘里面空间占用了.但是却不显示任何东西
  18. VMware Workstation中安装Windows10系统
  19. 转帖:一生必读经典书籍大全,看看你读过几本?
  20. C++学习笔记27:do while 循环

热门文章

  1. 2015.02.08——张佳莉
  2. 第十二届“中国软件杯”大赛:A10-基于机器学习的分布式系统故障诊断系统——baseline(二)
  3. 会员权益营销中,设置会员权益的三个标准
  4. 大数据基础——知识汇总
  5. 疯狂星期四,抢980元超值美食卡,尊享超级特价!
  6. 证券市场基础知识(三)——回购市场
  7. CSS 内边距 padding 属性
  8. linux创建运维账户流程,Linux运维养成记-账户与权限管理
  9. 【转载】使用Pandas创建数据透视表
  10. 经颅电刺激促进睡眠振荡及其功能耦合增强轻度认知障碍患者的记忆巩固