本文搬自我的Github,https://github.com/555chy/three.js-example-comment,有兴趣的可以一起来完善,这个为Three.js的Demo进行注解的项目
本项目是对 three.js 库中的 examples 进行注释
方便初学者直接从项目入手开始学习three.js
官网地址:https://threejs.org/examples
Name | 名字 | 描述 |
---|---|---|
AmbientLight | 环境光 | 这是一种基础光源,它的颜色会添加到整个场景和所有对象的当前颜色上 |
AmbientLight(color, intensity) | ||
DirectionalLight | 方向光 | 也称作无限光,平行光光源就如同太阳,若在场景中添加了一个平行光,它可以影响场景中的所有物体,而无论平行光光源设置在任何位置。平行光的方向为它的位置指向场景中心。 |
DirectionalLight(color, intensity) | ||
PointLight | 点光源 | 空间中的一点,朝所有方向发射光线 |
PointLight(color, intensity, distance, decay) | ||
SpotLight | 聚光灯光源 | 这种光源有聚光效果,类似台灯、天花板上的吊灯、或者手电筒 |
SpotLight(color, intensity, distance, angle, penumbra, decay) | ||
HemisphereLight | 半球光 | 这是一种特殊的光源,可以用来创建更加自然的室外光线,模拟光线微弱的天空和反光的地面 |
HemisphereLight(color, groundColor, intensity) | ||
RectAreaLight | 面光源 | 使用这种光源可以指定散发光线的平面,而不是空间中的一点 |
RectAreaLight (color, intensity, width, height) | ||
LensFlare | 镜头眩光 | 这不是一种光源,而是通过LensFlare为场景中的光源添加眩光效果 |
LensFlare(texture, size, distance, blending, color) |
Name | 名字 |
---|---|
PlaneGeometry | 平面 |
CircleGeometry | 圆形 |
ShapeGeometry | 塑形 |
CubeGeometry | 立方体 |
SphereGeometry | 球体 |
CylinderGeometry | 圆柱 |
TorusGeometry | 圆环 |
TorusKnotGeometry | 环面纽结 |
PolyhedronGeometry | 多面体 |
IcosahedronGeometry | 二十面体 |
OctahedronGeometry | 八面体 |
TetraHedronGeometry | 四面体 |
ConvexGeometry | 凸面体 |
LatheGeometry | 扫描面 |
ExtrudeGeometry | 拉伸几何 |
TubeGeometry | 管状体 |
ParametricGeometry | 参数几何体 |
TextGeometry | 文本几何体 |
Name | 名字 | 描述 |
---|---|---|
MeshBasicMaterial | 与光照无关,仅根据材质的颜色或贴图来渲染物体 | |
MeshDepthMaterial | 根据网格到相机的距离,这种材质决定如何给网格染色 | |
MeshNormalMaterial | 这是一种简单的材质,根据物体表面的法向量计算颜色 | |
MeshFaceMaterial | 这是一个容器,可以在这个容器里为物体的各个表面指定不同的颜色 | |
MeshLambertMaterial | 这种材质会考虑光照的影响,可以用来创建颜色暗淡的、不光亮的物体 | |
MeshStandardMaterial(原 MeshPhongMaterial) | 这种材质也会考虑光照的影响,而且可以用来创建光亮的物体 | |
ShaderMaterial | 这种材允许使用自定义的着色器程序,直接控制顶点的放置方式,以及像素的着色方式 | |
LineBasicMaterial | 这种材质可以用于THREE.Line(直线)几何体,从而创建着色的直线 } | |
LineDashedMaterial | 这种材质跟直线基础材质一样,不过可以用来创建出一种虚线效果 | |
SpriteMaterial | CanvasRenderer下Sprite(点精灵)的材质标准渲染器 | |
SpriteCanvasMaterial | 使用canvas渲染器的Sprite(点精灵)的材质 | |
PointsMaterial | WebGLRenderer下的粒子渲染器 | |
} MultiMaterial | 使用多种材质渲染同一物体 |
WebGL需要环境光否则是黑色的,其它两个即使没有环境光也能渲染出材质。
对于粒子系统:CanvasRenderer只能显示THREE.Sprite(原Particle),WebGLRenderer只能显示THREE.Points(原ParticleSystem)
Sprite和Points都是始终面朝相机的2D图形
WebGLRenderer可以通过computeVertexNormals等函数,使geometry变得光滑(相邻面的夹角不大于45度),而CanvasRenderer下则无效
AxisHelper(坐标轴)只能在WebGLRenderer下显示,不能在CanvasRenderer下显示
大部分情况下,WebGL、Canvas、Software这三种渲染器理论上可以相互替换。
另外,所使用的图片数据的大小必须是2的阶乘,横竖的像素长度大小必须是32x32,128x128等2的阶乘的形式。
在渲染速度方面,一般来说:WebGL > Canvas > Software。但对于低端设备有可能GPU太渣反而不如CPU渲染快。
参考:
范例:
{ x, 0, 0, 0 }
{ 0, y, 0, 0 }
{ 0, 0, z, 0 }
{ 0, 0, 0, 1 }
如果调用者本身的matrixWorldNeedsUpdate值为真,那么在函数applyMatrix(matrix)中,改变了matrix值后立刻就更新了position,rotation等属性
但在函数translate(distance,axis)中改变了position等变量(或者直接改变position等属性)后并没有立刻更新matrix值,这时应该手动调用updateMatrix()。
{ 1, 0, 0, 0 }
{ 0, 1, 0, 0 }
{ 0, 0, 1, 0 }
{ 0, 0, 0, 1 }
{ x, 0*xy, 0*yz, 0*xyz }
{ 0, y, 0, 0 }
{ 0, 0*x, z, 0 }
{ 0, 0, 0, 1 }
xyz表示相乘之后的符号位,负号会改变原先的material中的side参数。这是因为这里的0实际上是一个很小非零的值。
{ 1, 0, -0 }
{ -0, 1, 6.123 }
{ 0, -6.123, 1 }
{ x, 0*x*z, -0*x }
{ -0*xy, y, 6.123*y }
{ 0*x*y*z, -6.123*z, 1*z }
Error: WebGL: texImage2D: Incurred CPU-side conversion, which is very slow.
Error: WebGL: texImage2D: Chosen format/type incurred an expensive reformat 0x1908/0x1401
Multiplies the current matrix by the one specified through the parameters.
This is very slow because it will try to calculate the inverse of the transform, so avoid it whenever possible.
The equivalent function in OpenGL is glMultMatrix().
通过一个指定的参数乘以当前矩阵,这是非常慢的,因为它会尝试计算逆变换,所以如果可能的话尽量避免使用它
至于 mesh.applyMatrix 中为什么会计算出符号位,还有怎么计算的,这个过程我也还没参透!!!
范例:
矩阵变换知识点:
http://www.opengl-tutorial.org/cn/beginners-tutorials/tutorial-3-matrices/
Function.apply(obj,args)方法接收两个参数
obj:这个对象将代替Function类里this对象
args:这个是数组,它将作为参数传给Function(args–>arguments)
Function.call(obj,[param1[,param2[,…[,paramN]]]])
obj:这个对象将代替Function类里this对象
params:这个是一个参数列表
apply方法能劫持另外一个对象的方法,继承另外一个对象的属性。而call和apply的作用是一样的,只不过是一个传的是数组一个传的是参数列表不一样。
Array.prototype.push.apply(a, b)的作用是连接数组,相当于a.concat(b)。
由于concat不用像apply一样去改变数组上下文,所以效率更高
范例:
如果频繁添加删除,使用json;如果频繁取数据,使用array。
THREE.Line使用WebGL中的gl.LINE_STRIP(一系列的连续直线,即折线)渲染
THREE.LineSegments使用WebGL中的gl.LINES(每一对顶点被解释为一条直线,即线段)渲染
范例:
要么安装个谷歌VR支持插件,要么stereoeffect来代替vreffect
setClearColor,字体height就无效了范例:
贝塞尔曲线只会穿过首尾两个控制点而不过中间的控制点,在某些场合希望曲线穿过所有控制点的话可以使用catmull-rom spline(简称CR-Spline)
CR-Spline需要至少4个控制点,首尾两个控制点为辅助点,曲线不会穿过,其余控制点在t=[0,1]之间平滑地穿过,t=0时值等于第2个顶点,而t=1时值等于倒数第2个顶点
如果传入的控制点首尾相等形成闭合环,那么不用计算,直接取值p0=pN-1,pN=p1就会成为一条光滑的曲线了。
范例:
<a target="_blank" rel="noopener" href="https://www.baidu.com"/>
它是chrome 49+,Opera 36+的新特性,如果没有这个属性,新页面(钓鱼网站)就可以通过window.opener来访问你的window对象。
打开添加了rel=noopener的链接,window.opener 会为null。也可以使用下面代码打开一个新的页面
var otherWindow = window.open('http://www.baidu.com');
otherWindow.opener = null;
otherWindow.location = url;
对于多面体:面数+顶点数=棱数+2(称为欧拉定律)
正十二面体有12个面,每面都是正五边形,各有5条边,每条边被2个面共用,所以一共有12*5/2=30条棱。
这样,顶点就是20个。
例如:
正四面体,每个面3个顶点,共4个顶点,6条棱
正六面体,每个面4个顶点,共8个顶点,12条棱
正八面体,每个面3个顶点,共6个顶点,12条棱
正十二面体,每个面5个顶点,共20个顶点,30条棱
比如:如果一个模型有两层,最终渲染出来结果是前面一层挡住了了后面一层,各位看官可能会觉得挡住就挡住啊,反正看不见,可是当前面一层是带透明度的时候呢,怎么办,这时候计算机会将前面一层模型的像素在缓冲区里取代后面一层模型之前在缓冲区中的缓存,也就是说渲染完这个模型后,计算机记录下来的像素就是前面一层的像素,可是前面一层的像素是带透明度的,那么计算机就会把这个模型的这一部分当成了透明的来处理了。
alphatest直接舍弃颜色值,当透明度小于阈值的时候,直接舍弃透明的颜色,计算机自然不会记录下透明颜色。
来源:
http://blog.csdn.net/lj820348789/article/details/50628887
escape()除了 ASCII 字母、数字和特定的符号外,对传进来的字符串全部进行转义编码,因此如果想对URL编码,最好不要使用此方法。而encodeURI() 用于编码整个URI,因为URI中的合法字符都不会被编码转换。encodeURIComponent方法在编码单个URIComponent(指请求参 数)应当是最常用的,它可以讲参数中的中文、特殊字符进行转义,而不会影响整个URL。
在JavaScript中,我们不能为变量定义特定的块作用域,但可以定义其所属的函数域。也就是说,如果变量是在某个函数中定义的,那么它在函数以外的地方是不可见的。而如果该变量是定义在if或者for这样的代码块中的,它在代码块之外是可见的。另外,在JavaScript中,术语"全局变量"指的是声明在所有函数之外的变量,而与之相对的是"局部变量",所指的则是在某个函数中定义的变量。其中,函数内的代码可以像访问自己的局部变量那样访问全局变量,反之则不行。
来源:
《JavaScript面向对象编程指南》第3章(函数)-3.3(变量的作用域)
插件 | 功能 |
---|---|
three.js | JavaScript编写的WebGL第三方库,封装了大部分常用的3D显示功能 |
Detector.js | 检测支持(canvas,webgl,workers,fileApi) |
UVsDebug.js | 通过给定的几何形状,在Canvas中画出其UV纹理贴图 |
stats.min.js | 统计插件(FPS,渲染时间,chrome内存使用率,而且支持自定义) |
dat.gui.min.js | 参数控制器,可以向场景中添加控制条,随时调整参数 |
CombinedCamera.js | 可以在透视和正交相机上切换,默认为透视相机 |
Projector.js | 将三维的场景投影到二维 |
CanvasRenderer.js | Canvas 2D Context API 进行渲染 |
SoftwareRenderer.js | 不依赖GPU进行渲染 |
CSS3DRenderer.js | 使用CSS3渲染3D的DOM元素 |
OrbitControls.js | 轨道控制,鼠标左键旋转(与鼠标方向相同,用于非触摸屏上),右键平移,中键靠近或远离;也可以使用键盘控制 |
TrackballControls.js | 轨迹控制,鼠标左键旋转(与鼠标方向相反,用于触摸屏上),右键平移,中键靠近或远离;也可以使用键盘控制 |
DeviceOrientationControls.js | 设备朝向控制,仅对移动设备有效。根据设备朝向调整被控制元素朝向 |
FirstPersonControl.js | 支持许多第一人称视角(FPV)游戏玩家所熟悉的用户交互模式 |
FlyControl.js | 支持飞行模拟器式摄像机控制,支持滚动和俯仰 |
AsciiEffect.js | ASCII文本画渲染效果 |
Bird.js | 鸟的形状 |
hilbert2D.js | 希尔伯特2D曲线 |
tween.js | 对属性的改变,生成平滑的补间动画效果 |
ConvexGeometry.js | 凸几何体 |
相关博客推荐
范例推荐
Note: 如果GitHub的当前页没有index.html的话,GitHub会按设置好的模板加载README.md