Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【带着canvas去流浪(11)】Three.js入门学习笔记

【带着canvas去流浪(11)】Three.js入门学习笔记

作者头像
大史不说话
发布于 2019-07-15 07:24:56
发布于 2019-07-15 07:24:56
4K00
代码可运行
举报
运行总次数:0
代码可运行

二. Three.js中的基本概念

官方文档中的新手示例过于简单,所以本节对Three.js中的概念进行一些补充描述:

  • 客观三要素:场景Scene,相机Camera,渲染器Renderer 具体用法可以看官方文档的【新手示例Demo】
  • 光照Light THREE.js提供了点光源,射线光源,平行光,环境光的等多种光源来模拟光。
  • 几何模型Geometry 生成实体的第一步是要建立几何模型geometryTHREE.js根据构建数据的数据类型将几何模型分为GeometryBufferGeometry两个大类,每种内置类型都可以使用其中任何一种来实现,BufferGeometry基于定型数组运作,使用起来要求更严格也更复杂,但性能相对更好。THREE.js中内置了包含立方体,球体,多面体数十种常见的几何体,也可以将canvas绘制的平面图形拉伸成为实体。
  • 材质Material 第二步是为实体选择材质material,材质是描述几何体表面对于光照的表现的,是像金属表面那种高光,还是像粗糙表面那样会对光进行漫反射的,几何体的不同表面也可以选择不同的材质。材质material需要和贴图texture的合理搭配才能使最终的实体效果更加逼真,比如你给一个立方体选择了镜面反射的材料,但是又贴了砖头墙面的纹理,最终效果就会很诡异。
  • 贴图纹理Texture 第三步是为实体选择贴图纹理texture,纹理通常是通过引入图片来生成,通过贴图可以让几何体呈现为它所代表的实体模型,比如一个球体,你贴上足球的纹理,它就是足球,贴上篮球纹理,把周围环境作为贴图贴在它表面,它就是水晶球。texture通常是在material实例化时通过指定map参数来关联的。
  • 实体Object 大多数博文的示例中只使用到了Mesh(网格实体)这一种类型的实体模型,实际上THREE.js中还提供了Points(粒子点集实体),Line(线性实体),Skeleton(骨骼动画实体)等等多种抽象实体模型来构建模型。实体的实例化依赖于geometry几何模型实例和material材料实例,最终调用场景的add方法将实体实例添加进场景中,实体就可以被渲染器renderer渲染出来。
  • 动画的更新 动画的更新实际上和二维动画是一样的,也是通过requestAnimationFrame和逐帧动画来实现的。

三.重点笔记

  • webGL中的世界坐标是以屏幕中心为原点(0,0,0)的,面对屏幕时,右为正X,上为正Y,指向屏幕外为正Z。
  • dat.GUI是个非常棒的动态调试工具,官方仓库地址:https://github.com/dataarts/dat.gui
  • THREE.CameraHelper类可以生成相机视锥辅助线,非常有用。
  • 常见材质的区别如下:MeshLambertMaterial材质适合表现漫反射表面MeshStandardMaterialMeshPhongMaterial适合表现镜面反射表面,MeshBasicMaterial是不响应光照的基本材质。
  • THREE.PointLight是真正的点光源,THREE.SpotLight是射线光源
  • flyControls控件相当于为相机实现第一人称视角,玩过CS的应该都懂。
  • 材质的基本定义:
  • 生成网格实例时传入wireframe:true即可以网格形式展示几何体。
  • THREE.LatheGeometry相当于三维建模软件中的“根据样条曲线生成回转体”,构造函数的参数中没有回转轴,此处官方文档中有说明:车削是绕着Y轴来进行旋转的。
  • THREE.shapeGeometry,THREE.ExtrudeGeometry等一类由平面生成3D实体的模型,感兴趣的可以尝试一下三维建模软件solidworks,完全是一个路数,对理解这些抽象几何实体很有帮助。
  • 三维的动画和二维动画的原理没什么区别,都是通过逐帧动画实现的。
  • AnimationMixer是场景中特定对象的动画播放器,场景中有多个独立动画时,可以为每一个对象使用一个AnimationMixer
  • 变形动画的实现过程:获得animationMixer实例,获得clip实例,获得action实例,最后调用action.setDuration().play()开启动画播放。
  • morphskeleton动画对比,morph文件更大加载更慢,但实际在网页上计算量更小;骨骼动画文件更小,当在网页上运行时需要进行更多计算。
  • 反光表面是通过材质实例化时修改envMap属性实现的。
  • 舞台背景scene.background是可以设置贴图纹理的。
  • 调整贴图的

四.补充示例

第15节-关于物体阴影

后来发现这个问题在第27节有说明。

许多demo都无法生成投影,投影不仅需要设置光线和物体的castShadow = true ,receiveShadow = true,同时需要选择能够响应光线的材质,另外,阴影需要独立的相机去拍,默认是一个正交相机,需要正确调整其参数才能够显示阴影,参数配置错误时可能会显示一半阴影或者马赛克黑区:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//初始化灯光
function initLight(color) {
  //添加环境光
  ambientLight = new THREE.AmbientLight(0x404040)
  scene.add(ambientLight);

  //添加平衡光
  light = new THREE.DirectionalLight( 0xffffff );
  light.castShadow = true;
  light.shadow.camera.near = 0.1;    // default
  light.shadow.camera.far = 1000;     // default
  light.shadow.camera.left= -5;     // default
  light.shadow.camera.top= 10;     // default
  light.position.set(60,30,0);
  scene.add(light);
}

另外,可以通过开启相机辅助功能查看阴影相机的视锥,并配合dat.GUI等其他工具进行调节:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  shadowCameraHelper = new THREE.CameraHelper( light.shadow.camera );
  scene.add(shadowCameraHelper);

第46节-关于将svg拉伸为实体

原文中提到的transformSVGPathExposed函数和官方代码仓lib里的脚本已经找不到了,新版的官方文档中已经听过了SVGLoader来完成svgshape的转换,具体用法可参考SVGLoader文档 ,官方仓库的example中提供了webgl_loader_svg.html示例文件,我们在其中稍作改动,将转换后的shape作为参数来得到拉伸体实例THREE.ExtrudeGeometry,就可以看到读入的svg被拉伸了:

第58节-重点:用THREE.Raycaster实现交互

这里很重要,是3D模型能响应用户交互行为的关键。后文的第101节也有这部分知识的说明

官方文档中已经提供了示例代码,平面坐标到3D坐标转换的部分如果不明白,可以看这篇博文ThreeJS中的点击与交互——Raycaster的用法,笔者也提供了示例demo供参考。

第85节:用morphTargetInfluences实现动画(简称Morph动画)

关于Morph动画的基本原理摘抄如下(原文链接):

The value is a scalar that determines the effect of a morph target. A morph target is another list of verticies (same length) that go along side the original list of verticies. Say we have a list of size 2 (a line), var list1 = [0.1, -0.2] and a morph target: var list2 = [0.2, -0.3] the scalar value is used like so: finalVertexPosition = list1[0] + (list2[0] * scalar);

使用时需要在Geometry实例构造函数的配置项中开启morphTargets: true,目标几何体的点集vertices相当于上面的list1,存放在目标集合体geometry实例morphTargets数组中的向量相当于上面的list2(它可以存放多个),而每一个morphTargets中的变形向量对原物体的影响系数存放在morphTargetInfluences数组中,取值为-1~1,相当于上面的scalar,通过连续改变morphTargetInfluences的值就可以实现变形动画,morphTargetInfluencesmesh实例的属性而不是 geometry的属性。

第101节:3D世界坐标求平面坐标

文中提及的localToWorld方法实际上继承自Object3D这个父类,当前版本的方法签名是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Object3D.localToWorld(target:THREE.Vector3):target

也就是说调用的时候需要传一个空的Vector3实例,然后结果会被填充在里面,文中那种无参调用的模式会报错。其他的按照原文的方法就可以反求二维空间的坐标了。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-07-13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Three.js可视化企业实战WEBGL网-2024入门指南
Three.js 是一个功能强大的 JavaScript 库,用于在 Web 浏览器中创建和显示动画 3D 图形。它的丰富 API 和模块化设计使得开发者可以轻松构建复杂的 3D 场景和动画效果。本文将详细介绍 Three.js 中的一些重要组件和模块,包括场景、相机、几何体、材质、光源、渲染器和控制器等。
用户11130883
2024/05/31
2310
three.js中的重要基础概念
Three.js 是一个功能强大的 JavaScript 库,用于创建和展示基于 WebGL 的三维图形。在学习使用Three.js来构建3D世界之前,有一些基本概念是需要牢记的,否则,在你绘制3D世界时,思绪会是杂乱无章的:
fastmock
2025/04/26
920
「冰墩墩」代码,开源了!
随着前两天冬奥会序幕的正式拉开,也成功带火了本次吉祥物冰墩墩。憨厚可爱的熊猫形象,让冰墩墩的实体公仔、钥匙扣都被一抢而空,众多网友呼吁现在真的是「一墩难求」!
对白
2022/02/11
4.6K0
「冰墩墩」代码,开源了!
Three.js深入浅出:2-创建三维场景和物体
以上demo总结来说,使用了 Three.js 库创建了一个简单的绿色立方体模型,并实现了旋转动画效果。 总结一下它的步骤:
用户6297767
2023/11/21
7290
Three.js深入浅出:2-创建三维场景和物体
Three.js - 走进3D的奇妙世界
随着人们对用户体验越来越重视,Web开发已经不满足于2D效果的实现,而把目标放到了更加炫酷的3D效果上。Three.js是用于实现web端3D效果的JS库,它的出现让3D应用开发更简单,本文将通过Three.js的介绍及示例带我们走进3D的奇妙世界。
宜信技术学院
2019/11/27
10.4K0
用 Three.js 画个 3D 生日蛋糕送给他(她)
作为整天和 UI 打交道的前端工程师,是否想在他(她)生日的时候用代码送上一份惊喜呢?
神说要有光zxg
2021/11/25
3.6K0
用 Three.js 画个 3D 生日蛋糕送给他(她)
Three.JS的第一个三弟(3D)案例
Three.js 是基于 WebGL 技术,用于浏览器中开发 3D 交互场景的 JS 引擎。
不惑
2024/04/23
3130
Three.JS的第一个三弟(3D)案例
用 Three.js 画一个哆啦A梦的时光机
在 three.js 里以向右的方向为 x 轴,向上的方向为 y 轴,向前的方向为 z 轴:
神说要有光zxg
2023/08/28
5250
用 Three.js 画一个哆啦A梦的时光机
一文搞懂如何在Three.js里创建阴影效果 |《Three.js零基础直通14》
经过上一小节,我们学会了如何使用各种类型的灯光。既然有了光,那还得有阴影,这样看起来才会更加真实。
大帅老猿
2022/11/11
7.5K0
一文搞懂如何在Three.js里创建阴影效果 |《Three.js零基础直通14》
ThreeJs 基础学习
如果你要实现一个机器人在跑步,那么机器人的头、四肢、躯干等都是要整体移动的,group可以将一系列的mesh模型组成一个整体,这样就可以实现整体移动了。
心安事随
2024/07/29
2100
Threejs入门之十六:纹理贴图和纹理材质
Texture 用于创建一个纹理贴图,将其应用到一个物体的表面,纹理对象可以通过TextureLoader(纹理加载器)的load()方法来加载一个图片。要使用纹理贴图,首先要创建一个纹理加载器,纹理加载器返回一个Texture 纹理对象,通过纹理加载器加载贴图材质 然后通过设置材质的颜色贴图map属性的值为上面的Texture来调用,下面我们创建一个立方体,并给这个立方体贴上木头材质的贴图,使其变为一个木箱
九仞山
2023/04/30
2.7K0
Threejs入门之十六:纹理贴图和纹理材质
Three.js实现脸书元宇宙3D动态Logo
Three.js实现脸书元宇宙3D动态Logo 背景 Facebook 近期将其母公司改名为 Meta,宣布正式开始进军 元宇宙 🪐领域。本文主要讲述通过 Three.js + Blender 技术栈,实现 Meta 公司炫酷的 3D 动态 Logo,内容包括基础模型圆环、环面扭结、管道及模型生成、模型加载、添加动画、添加点击事件、更换材质等。 什么是元宇宙 元宇宙 Metaverse 一词源于 1992 年尼尔·斯蒂芬森的 《雪崩》,该书描述了一个平行于现实世界的虚拟世界 Metaverse,所有现实
玖柒的小窝
2021/11/21
2.7K0
Three.js实现脸书元宇宙3D动态Logo
十分钟快速实战Three.js
本文不会对Three.js几何体、材质、相机、模型、光源等概念详细讲解,会首先分成几个模块给大家快速演示一盒小案例。大家可以根据这几个模块快速了解Three.js的无限魅力。
Vam的金豆之路
2021/12/01
2.2K0
十分钟快速实战Three.js
提示
在THREEjs中,渲染一个3d世界的必要因素是场景(scene)、相机(camera)、渲染器(renderer)。渲染出一个3d世界后,可以往里面增加各种各样的物体、光源等,形成一个3d世界:
lhyt
2019/08/20
1.1K0
Three.js贴图技巧:优化性能与效果
在当今数字化的时代,WebGL 技术为开发者们打开了一扇通往交互式 3D 图形世界的大门,而 Three.js 作为JavaScript库中的佼佼者,凭借其简单易用的 API 和丰富的功能,在创建3D场景和交互应用方面得到了广泛应用。在Three.js构建的虚拟世界中,贴图扮演着至关重要的角色。从赋予模型逼真的材质质感,到增强场景的视觉吸引力,贴图的质量直接影响着用户的体验。然而,随着场景复杂度的增加和贴图数量的增长,如何在保证贴图效果的同时优化性能,成为了开发者们必须面对的重要课题。本文将深入探讨Three.js贴图的相关知识,分享一系列优化性能与效果的实用技巧,并通过丰富的代码示例进行详细说明,帮助读者更好地理解和应用这些技巧,从而提升Three.js项目的品质。
Front_Yue
2025/03/11
2150
Three.js贴图技巧:优化性能与效果
基于 three.js 的 3D 粒子动效实现
粒子特效是为模拟现实中的水、火、雾、气等效果由各种三维软件开发的制作模块,原理是将无数的单个粒子组合使其呈现出固定形态,借由控制器、脚本来控制其整体或单个的运动,模拟出现真实的效果。three.js是用JavaScript编写的WebGL的第三方库,three.js提供了丰富的API帮助我们去实现3D动效,本文主要介绍如何使用three.js实现粒子过渡效果,以及基本的鼠标交互操作。(注:本文使用的关于three.js的API都是基于版本r98的。)
个推
2019/04/08
7.1K0
基于 three.js 的 3D 粒子动效实现
Three.js 之 Import Model 导入模型
Three.js 提供了很多原始模型,但如果我们需要更复杂的模型,最好使用 3D 软件建模,然后导入到场景中。本节我们就来学学如何导入一个做好的 3D 模型。
阿珍
2022/08/10
6.6K0
Three.js 场景创建基础
在当今数字化的时代,Web 开发已经不再局限于传统的二维界面。随着技术的不断进步,越来越多的开发者开始探索将 3D 图形引入到网页中,为用户带来更加沉浸式和交互性的体验。而 Three.js 作为一款广受欢迎的 JavaScript 3D 库,为开发者提供了强大而便捷的工具,使得在网页上创建和展示复杂的 3D 场景变得不再困难。本文将深入探讨 Three.js 场景创建的基础知识,包括其简介、引入方式,以及场景构建的关键要素。
Front_Yue
2025/03/12
1750
Three.js 场景创建基础
【带着canvas去流浪(15)】threejs fundamentals翻译系列1-scene graph
本文是three.js系列博文的一篇,第一篇文章是【three.js基础知识】,如果你还没有阅读过,可以从这一篇开始,页面顶部可以切换为中文或英文。
大史不说话
2020/05/12
1.7K0
我是如何用 Three.js 在三维世界建房子的(详细教程)
这两天用 Three.js 画了一个 3D 的房子,放了一个床进去,可以用鼠标和键盘控制移动,有种 3D 游戏的即视感。
神说要有光zxg
2021/12/10
5.3K0
我是如何用 Three.js 在三维世界建房子的(详细教程)
相关推荐
Three.js可视化企业实战WEBGL网-2024入门指南
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验