同步操作将从 沈绪哲/vue2-threejs 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
新手入门教程(本工程以此书为导向书写):http://www.yanhuangxueyuan.com/Three.js/
本项目版本为: "three": "^0.146.0" 新手入门教程不能完全的适用本项目(部分 API 改名或者删除)
需要配合原文档及代码 一起看
- threejs 中文文档: http://www.webgl3d.cn/threejs/docs/#manual/zh/introduction/WebGL-compatibility-check
- threejs 官网: https://threejs.org/
- Three.js 历史版本 :https://github.com/mrdoob/three.js/releases
Three.js 是基于原生 WebGL 封装运行的三维引擎,在所有 WebGL 引擎中,Three.js 是国内文资料最多、使用最广泛的三维引擎。
- 物联网粮仓 3D 可视化案例:http://www.yanhuangxueyuan.com/3D/liangcang/index.html
- 玉镯产品在线预览案例:http://www.yanhuangxueyuan.com/3D/liangcang/index.html
- 解析 GeoJOSN 数据中国 GDP 数据可视化:http://www.yanhuangxueyuan.com/3D/geojsonChina/index.html
- 科研平台-蛋白质结构可视化案例:http://www.rcsb.org/3d-view/2JEN/1
- 化学相关——分子结构可视化:http://www.yanhuangxueyuan.com/3D/fenzi/index.html
- 机械模型在线预览 demo:http://www.yanhuangxueyuan.com/3D/jixiezhuangpei/index.html
- 室内设计作品展示案例:http://www.yanhuangxueyuan.com/3D/houseDesign/index.html
- 地理天文相关——太阳系 3D 预览:http://www.yanhuangxueyuan.com/3D/solarSystem/index.html
三维模型在线预览平台
- sketchfab: https://sketchfab.com/
- 动动三维: https://www.ddd.online/
- 琢刻: https://gizmohub.com/
室内逆向全景漫游平台
通过 3D 相机对室内空间进行逆向,在 Web 端以全景图的方式预览室内效果。
- 众趣科技: http://www.3dnest.cn/
- 贝壳: https://zz.ke.com//
- matterport: https://matterport.com/
vue 工程将模型数据 放在 public 文件夹下
不需要加载外部贴图和模型文件的 three.js 案例,可以直接使用浏览器打开.html 案例文件,通常一个 threejs 项目案例往往都会加载一些外部模型,因此打开 threejs 案例要搭建一个本地的静态服务器,否则的话,threejs 案例无法正常打开,浏览器控制台会提示跨域问题。
如果你知道怎么搭建本地静态服务器,自己用任何方式搭建都可以。如果不了解的话,建议使用 nodejs 去快速搭建一个本地静态服务器,对于一个 WebGL 工程师或前端工程师来说,肯定是要学习 Nodejs 的。
Nodejs 本地静态服务器 使用 Nodejs 搭建本地静态服务器很简单,首先是你要先百度 Nodejs 安装的相关文章,先在你的电脑上安装配置好 Nodejs,熟悉下 NPM 的使用,然后使用 npm 执行 npm install -g live-server 安装 live-server 模块,如果你想通过安装好的 live-server 模块开启一个静态服务器,打开命令行,进入 threejs 案例所在的文件目录,然后执行 live-server 命令就可以。
通过浏览器访问 http://localhost:8080 或http://127.0.0.1:8080 地址,找到 threejs 案例的.html 文件直接打开就可以看到三维场景渲染效果。
开发调试-热更新 在学习 threejs 的过程中,往往需要频繁的代码测试,查看 threejs 代码的渲染效果。这时候你肯定希望代码修改之后,threejs 渲染效果立即热更新。
如果通过 live-server 模块搭建的本地静态服务器,你可以实现代码的热加载。也就是说你修改一段代码,然后保存.html 代码文件,.html 对应的 threejs 案例就会重新渲染。
参考文档: http://www.webgl3d.cn/threejs/docs/#manual/zh/introduction/WebGL-compatibility-check
views/demo02/index.vue 中有使用
Unchecked runtime.lastError: A listener indicated an asynchronous response by returning true, but the message channel closed before a response was received
网上说是浏览器插件问题
代码位置:demo01/index01.vue
代码位置:demo01/index02.vue
代码位置:demo01/index03.vue
代码位置:demo01/index04.vue
代码位置:demo01/index05.vue
代码位置:demo01/index06.vue
代码位置:demo02/index01.vue
代码位置:demo02/index02.vue
代码位置:demo02/index03.vue
代码位置:demo02/index04.vue
代码位置:demo02/index05.vue
代码位置:demo02/index06.vue
代码位置:demo02/index07.vue
代码位置:demo03/index01.vue
代码位置:demo03/index02.vue
代码位置:demo04/index01.vue
代码位置:demo04/index02.vue
代码位置:demo04/index03.vue
代码位置:demo05/index01.vue
代码位置:demo05/index02.vue 需要新建两个模型: 一个 模型是物体, 另一个模型是地面 用来接收投影
// 这个版本需要开启 以下代码
this.renderer.shadowMap.enabled = true;
this.renderer.shadowMap.type = THREE.PCFSoftShadowMap;
模型.castShadow 属性
// 设置产生投影的网格模型
mesh.castShadow = true;
模型.receiveShadow 属性
// 设置网格模型planeMesh接收其它模型的阴影(planeMesh作为投影面使用)
planeMesh.receiveShadow = true;
光源.castShadow 属性
// 设置用于计算阴影的光源对象
directionalLight.castShadow = true;
// spotLight.castShadow = true;
光源.shadow 属性
阴影对象基类 LightShadow
平行光阴影对象 DirectionalLightShadow 和聚光源阴影对象 SpotLightShadow 两个类的基类是 LightShadow
LightShadow 属性.camera
// 聚光源设置
spotLight.shadow.camera.near = 1;
spotLight.shadow.camera.far = 300;
spotLight.shadow.camera.fov = 20;
LightShadow 属性.mapSize
directionalLight.shadow.mapSize.set(1024, 1024);
LightShadow 属性.map
代码位置:demo05/index03.vue 需要新建两个模型: 一个 模型是物体, 另一个模型是地面 用来接收投影
// 这个版本需要开启 以下代码
this.renderer.shadowMap.enabled = true;
this.renderer.shadowMap.type = THREE.PCFSoftShadowMap;
模型.castShadow 属性
// 设置产生投影的网格模型
mesh.castShadow = true;
模型.receiveShadow 属性
// 设置网格模型planeMesh接收其它模型的阴影(planeMesh作为投影面使用)
planeMesh.receiveShadow = true;
光源.castShadow 属性
// 设置用于计算阴影的光源对象
directionalLight.castShadow = true;
// spotLight.castShadow = true;
光源.shadow 属性
阴影对象基类 LightShadow
平行光阴影对象 DirectionalLightShadow 和聚光源阴影对象 SpotLightShadow 两个类的基类是 LightShadow
LightShadow 属性.camera
// 聚光源设置
spotLight.shadow.camera.near = 1;
spotLight.shadow.camera.far = 300;
spotLight.shadow.camera.fov = 20;
LightShadow 属性.mapSize
directionalLight.shadow.mapSize.set(1024, 1024);
LightShadow 属性.map
// 光源对象继承父类Object3D的位置属性.position。
/**
* 光源颜色属性.color和强度属性.intensity
* 你查看光源光源Light文档,可以看到该类定义了光源颜色属性.color和强度系数属性intensity。
*
* 光源颜色属性.color默认值是白色0xffffff,强度属性.intensity默认1.0,光照计算的时候会把两个属性值相乘。
* 比如环境光颜色设置为0xffffff,强度系数设置为0.5,把0.5设置为0.8,threejs场景中模型会变得更明亮。调节环境颜* 色你可以直接设置不同颜色值,比如0x44444、0xddddddd,也可以使用更为方便的强度系数去调节。对于点光源、聚光源和* 环境光一样继承基类Light强度系数属性.intensity。
*
* */
比如一辆车,在 Threejs 中你可以使用一个网格模型去描述车上面的一个零件,多个零件就需要多个网格模型表示,这些网格模型之间就会构成父子或兄弟关系,从而形成一个层级结构。在机械、建筑相关的 Web3D 应用中,通常会用到层级模型的知识,一个层级模型就是一本书的目录一样。
本章主要目的是帮助你建立 Threejs 层级模型的概念,通过 Threejs 的组对象 Group 可以组织各个模型,构成一个层级结构。学习本节课你也可以参考前端中 DOM 树去理解,Threejs 一个一个的模型对象就像 HTML 元素一样可以组成一个树结构,可以通过特定 id 或 name 属性选择某个或某些模型对象。
在具体开发过程中,3D 美术给你一个包含多个网格模型对象的层级模型,你可能需要操作某个网格模型,这时候 3D 美术只要通过对模型命名标记模型,那么对于程序员来说,直接调用 Threejs 的某个方法就可以遍历整个模型,找到某个你想要操作的模型对象。
层级关系
scene:{ group:[ mesh1:{} mesh2:{} ],gourp2:[],light:[] }
场景对象 Scene、组对象 Group、网格模型对象 Mesh、光源对象 Light 的.add()方法都是继承自它们共同的基类 Object3D。
//* traverse 递归遍历属性结构 查找到 子模型
this.scene.traverse(function (obj) {
if (obj.type === "Group") {
console.log(obj.name);
}
if (obj.type === "Mesh") {
console.log(" " + obj.name);
obj.material.color.set(0xffff00);
}
if ((obj.name === "左眼") | (obj.name === "右眼")) {
obj.material.color.set(0x000000);
}
console.log("打印id属性", obj.id);
console.log("打印该对象的父对象", obj.parent);
console.log("打印该对象的子对象", obj.children);
});
//
// 遍历查找scene中复合条件的子对象,并返回id对应的对象
var idNode = this.scene.getObjectById(4);
console.log(idNode);
// 遍历查找对象的子对象,返回name对应的对象(name是可以重名的,返回第一个)
var nameNode = this.scene.getObjectByName("左腿");
nameNode.material.color.set(0xff0000);
}
.getWorldPosition() 获取模型的世界坐标
建立世界坐标系概念
关于 Threejs 常见的几何体类下面通过一个脑图进行了简单的分类,并附上了 threejs 文档连接。
几何体本质上就是 threejs 生成顶点的算法,如果有兴趣你可以打开 threejs 几何体部分的源码查看 threejs 具体如何通过程序生成顶点位置、法线方向等顶点数据。
所有几何体的基类分为 Geometry 和 BufferGeometry 两大类,两类几何体直接可以相互转化。
曲线和几何体同样本质上都是用来生成顶点的算法,曲线主要是按照一定的规则生成一系列沿着某条轨迹线分布的顶点。当你把曲线、几何体看成顶点的时候,查考文档很多属性和方法自然很同意理解。
代码位置 src/views/test01/indexPage.vue
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。