Three.js快速入门

简介

Three.js是基于原生WebGL封装运行的三维引擎。可与各种前端技术结合使用。

github链接:GitHub - mrdoob/three.js: JavaScript 3D library.

Three.js官网:three.js – JavaScript 3D library

由于Three.js的官方资源部署在境外服务器所以打开会非常慢,这里推荐一个博客包含了Three.js的各种资源镜像和教程文档:http://www.yanhuangxueyuan.com/

建议一定要下载three.js的源代码,在了解了一些基本的概念后,可以尝试修改examples里的源代码运行看效果,这是一种很好的学习方式。

three.js目录结构

three.js目录结构

引用方式

使用模块引入、使用npm安装 参考文档

如何在本地运行Three.js(倘若你需要从外部文件里载入几何体或是纹理贴图,由于浏览器same origin policy(同源策略)的安全限制,从本地文件系统载入外部文件将会失败,同时抛出安全性异常。)参考文档

核心概念

场景,相机,渲染器,几何体,材质,光源等,理解以下结构

Three.js程序结构

可参考文档:Three.js快速入门—新手上路

Examples

Three.js的官方示例是非常重要的学习资源,示例的命名也较规范根据名称大概可以知道某个示例使用的技术以及实现的功能。

示例页面

可基于关键词搜索如

动画类:animation、相机类:camera、几何体类:geometry、控制类:controls、交互点选:interactive等

图扑代码介绍

图扑代码结构
 ├── longhui-digital-twin
       ├── js    单个js文件包含了这个模型场景用到的方法
       ├── lib    ht的源代码类库
       ├── storage
             ├── assets    包含模型的各个局部的.obj和.mtl文件
             ├── components    图表、ui的组件
             ├── displays    生成各个模型场景不同状态的面板的.json文件
             ├── models    引用模型对应.obj和.mtl文件的.json文件
             ├── scenes    用于生成场景模型的.json文件
             └── symbols     各个面板图表,以及标签背景和数据的.json文件
       ├── index.html    仿真模型的入口文件
       └──  weldingJoint.html    3D焊口的入口文件

功能点

(以下提到的链接请先运行three.js项目,然后根据自己的端口号自行匹配,最好使用8080)
以下功能点为在图扑已有项目中拆分出来的,在实现时会先参考图扑的实现方式,利用Three.js相对应的技术来实现。

  1. 地图控制(鼠标控制)
  2. 天空盒
  3. 模型点选
  4. 模型渐进显示
  5. 模型透明效果
  6. 说明类标签,实时数据标签
  7. 不同格式模型文件的差异
  8. 模型拆解,安装

1.地图控制(MAPCONTROLS)

使用技术:examples里的轨道控制(OrbitControls)
参考文档:http://localhost:8080/docs/index.html#examples/en/controls/OrbitControls
参考示例:
http://localhost:8080/examples/?q=control#misc_controls_map
http://localhost:8080/examples/?q=control#misc_controls_orbit
关键点:理解OrbitControls的属性,学会自定义鼠标按钮的相关事件

2.天空盒(SKYBOX)

1.通过场景(scene)实现

参考文档:http://localhost:8080/docs/index.html#api/zh/scenes/Scene
参考示例:
http://localhost:8080/examples/#webgl_animation_cloth
http://localhost:8080/examples/#webgl_postprocessing_backgrounds
总结:

  • 利用scene的 .background属性的Color, Texture, CubeTexture可分别实现纯色,图像背景,立方体背景,
  • CubeTexture的6张图像需专业化处理
  • 实现效果与需求不一致
2.使用球形几何体实现

参考图扑代码:longhui-digital-twin\storage\scenes\htproject_2020_q2\中油龙慧_黑河站\黑河站外景.json

天空背景代码

参考文档:
http://localhost:8080/docs/index.html#api/en/geometries/SphereBufferGeometry
http://localhost:8080/docs/index.html#api/en/materials/Material
关键点:理解材质(material)的.side属性

3. 模型点选

1.对象选择

使用技术:光线投射Raycaster
参考文档:http://localhost:8080/docs/index.html#api/zh/core/Raycaster
参考示例:
http://localhost:8080/examples/#webgl_interactive_cubes
http://localhost:8080/examples/?q=interactive#webgl_interactive_cubes_ortho

2.选中效果

4. 模型渐进显示

参考图扑代码:longhui-digital-twin\js\index.js

截面渐进

透明渐进

参考文档:
材质Material
setinterval实现动画
参考示例:
http://localhost:8080/examples/?q=clip#webgl_clipping
http://localhost:8080/examples/?q=clip#webgl_clipping_advanced
总结:

  1. 理解材质对象的clippingPlanes,transparent,opacity属性
  2. 产生截面效果需要设置WebGLRenderer.localClippingEnabled为 true
  3. 关于setInterval实现动画
    特点: 执行速度不能保证,与电脑当前状态有关;不能在限定的时间内达到确定的状态,或者说达到确定状态需要的时间是不确定的;需要手动清除。
    适用场景: 如一直闪烁的点,周期性执行需手动关闭的动画

5. 模型透明效果

参考文档:http://localhost:8080/docs/index.html#api/zh/materials/Material
总结:

  1. 保存所有对象材质的 transparent,opacity属性(通过uuid做主键)
  2. 改变所有对象材质的 transparent,opacity属性,提高透明度
  3. Clone需要强调对象的材质 ,修改transparent,opacity属性
  4. 回到初始状态时,恢复所有对象的材质的transparent,opacity属性

6. 说明类标签,实时数据标签

图扑实现效果:标签始终面向相机,与3d模型对象具有相同的坐标体系和相机渲染效果,支持动态改变数值
参考文档:
http://localhost:8080/docs/index.html#manual/zh/introduction/Creating-text
http://www.yanhuangxueyuan.com/Three.js_course/advanced/modelTag.html

1.使用CSS 2D渲染器(CSS2DRenderer)

参考文档:http://localhost:8080/docs/index.html#examples/zh/renderers/CSS2DRenderer
参考示例:
http://localhost:8080/examples/?q=pdb#webgl_loader_pdb
http://localhost:8080/examples/?q=css#css2d_label
http://www.yanhuangxueyuan.com/3D/liangcang/index.html
实现效果:与3d模型对象具有相同的坐标体系,相机渲染效果与3d模型不同,始终面向相机,支持动态改变数值
适用场景:只显示简单文字的2d效果标签

2.使用CSS 3D渲染器(CSS3DRenderer)

参考文档:http://localhost:8080/docs/index.html#examples/zh/renderers/CSS3DRenderer
参考示例:
http://localhost:8080/examples/?q=css#css3d_periodictable
http://localhost:8080/examples/?q=css#css3d_sandbox
实现效果:与3d模型对象具有相同的坐标体系,相机渲染效果与3d模型不同,不会始终面向相机,支持动态改变数值
适用场景:直接使用css的3d属性实现3d效果

3.使用精灵(Sprite)+ Canvas纹理(CanvasTexture)

参考文档:
http://localhost:8080/docs/index.html#api/zh/objects/Sprite
http://localhost:8080/docs/index.html#api/zh/textures/CanvasTexture
https://www.w3school.com.cn/html5/html_5_canvas.asp
参考示例:
http://localhost:8080/examples/?q=sprite#webgl_points_sprites
http://localhost:8080/examples/?q=sprite#webgl_raycast_sprite
http://localhost:8080/examples/?q=canvas#webgl_materials_texture_canvas
关键点:每次改变canvas对象需要手动将材质的needsUpdate属性赋值为true,canvas的drawImage()是异步的,需要在图片的onload回调函数中重新添加文字

实现效果:与3d模型对象具有相同的坐标体系,相机渲染效果与3d模型相同,始终面向相机,支持动态改变数值
适用场景:给3d模型对象添加标签

7. 不同格式模型文件的差异

关于如何加载3d模型:参考示例里有关于loader的实现代码



关于不同格式模型文件的差异参考:

8. 模型拆解,安装

场景分析:天空球 + 平面地板
管道延长线:clone对象及材质,利用对象的.scale属性,将管道沿着x轴方向扩大20倍,并修改其材质的transparent和opacity属性,调整相对位置
参考文档:
http://localhost:8080/docs/index.html#api/zh/core/Object3D
http://localhost:8080/docs/index.html#api/zh/materials/Material
动画实现:使用tween.js
参考文档:
https://www.cnblogs.com/qianduanjingying/p/6155744.html
http://www.createjs.cc/tweenjs/

1.确认,把所有任务按序维护到禅道,如果有缺的自己补一下
2.每个功能点的结论,文字描述的,
实现方式,几种,优缺点、适应场景,技术平台里有对应实现、demo

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容

  • Threejs 为什么? webGL太难用,太复杂! 但是现代浏览器都支持 WebGL 这样我们就不必使用 Fla...
    强某某阅读 6,003评论 1 21
  • 1、简介 WebGL 是在浏览器中实现三维效果的一套规范,而 Three.js 可以看成是浏览器对 WebGL 规...
    风之化身呀阅读 3,483评论 0 4
  • What is Three.js 什么是threejs,很简单,你将它理解成three + js就可以了。thre...
    依依玖玥阅读 1,502评论 0 2
  • three.js是JavaScript编写的WebGL第三方库。提供了非常多的3D显示功能。Three.js 是一...
    简聆壹阅读 4,971评论 1 13
  • 本文主要是讲解 Three.js 的相关概念,帮助大家对 Three.js 以及相关知识形成比较完整的理解。今年来...
    Simon王小白阅读 8,435评论 2 9