@@ -209,6 +209,49 @@ Primitive 的复数即为 Primitives。
209
209
210
210
211
211
212
+ <br >
213
+
214
+ > 以下内容更新于 2021.11.27
215
+
216
+ ** 特别补充说明:内置的图元实际上也是变化多端的!**
217
+
218
+ 为什么这么说呢?
219
+
220
+ 例如:圆柱(Cylinder),字面上它是用于创建圆柱体的,但是实际上认真阅读官方文档你会发现是这样描述它的构造函数的
221
+
222
+ > CylinderGeometry 官方文档:https://threejs.org/docs/index.html#api/zh/geometries/CylinderGeometry
223
+
224
+ ```
225
+ CylinderGeometry(radiusTop : Float, radiusBottom : Float, height : Float, radialSegments : Integer, heightSegments : Integer, openEnded : Boolean, thetaStart : Float, thetaLength : Float)
226
+ radiusTop — 圆柱的顶部半径,默认值是1。
227
+ radiusBottom — 圆柱的底部半径,默认值是1。
228
+ height — 圆柱的高度,默认值是1。
229
+ radialSegments — 圆柱侧面周围的分段数,默认为8。
230
+ heightSegments — 圆柱侧面沿着其高度的分段数,默认值为1。
231
+ openEnded — 一个Boolean值,指明该圆锥的底面是开放的还是封顶的。默认值为false,即其底面默认是封顶的。
232
+ thetaStart — 第一个分段的起始角度,默认为0。(three o'clock position)
233
+ thetaLength — 圆柱底面圆扇区的中心角,通常被称为“θ”(西塔)。默认值是2*Pi,这使其成为一个完整的圆柱。
234
+ ```
235
+
236
+ 请注意最后的 2 个参数:
237
+
238
+ 1 . thetaStart(默认值为0)
239
+ 2 . thetaLength(默认值为2* Pi)
240
+
241
+ 也就是说,你不修改这 2 个默认值,** 那么默认创建出的是一个完整的圆柱体** ,但是假设你修改了这 2 个值,比如 将 thetaLength 修改成 0.3* Pi (54°),那么最终将创建出一个 夹角为 54° 的** 扇形** (体)。
242
+
243
+ 如果感兴趣,可以看一下我发布的这个项目,由数据生成3D饼图:https://github.com/puxiao/pie-3d
244
+
245
+ > 提醒:最好你在看完本系列教程后(不仅是本小节),再去看上面提到的 pie-3d 。
246
+
247
+ 通过上面对 CylinderGeometry 的描述,我们可以知道 Three.js 默认自带的图元实际上是可以产生很多变化的,得到的不一定仅仅是图元的 "字面" 物体。
248
+
249
+ > 以上内容更新于 2021.11.27
250
+
251
+
252
+
253
+ <br >
254
+
212
255
### BufferGeometry 与 Geometry 的区别
213
256
214
257
从上面的图元表格中不难发现,除了 Edges、WireframeGeometry 以外,其他图元的构造函数都是成对出现的。
@@ -231,4 +274,88 @@ Primitive 的复数即为 Primitives。
231
274
232
275
233
276
277
+ <br >
278
+
279
+ > 以下内容更新于 2021.11.27
280
+
281
+ ** 上面关于 BufferGeometry 和 Geometry 的区别这段话已经过时了** ,因为在较新的 Three.js 版本中已经将 Geometry 从核心类中移除。
282
+
283
+ 目前你接触到的都应该只有 BufferGeometry。
284
+
285
+ #### 一些心里话:
286
+
287
+ 首先非常抱歉得说一句:一年前在写本系列文章时,我是一个对图形学一无所知,对 Three.js 好奇但又非常小白的人,我是一边学习一边写下本系列文章的。
288
+
289
+ ** 所以本系列教程绝对不是好的教程——假设 Three.js 是一座大山的话,而我是站在山脚下向你讲述上山道路的那个人,但我自己也未曾上过这座山。**
290
+
291
+ 随着我对图形学、webgl、Three.js、Canvas 的一些认知提升,我深深觉得想要写出好教程,一定要站在更高的维度,拥有更高的视野才可以更好向别人指明方向,写出好教程。
292
+
293
+ 但是本教程对于那些完全小白,完全对 Three.js 一无所知的人,多少还是有些帮助的(尽管我指明的道路并不是最佳道路),** 很感谢那些 Star 本教程的人** 。
294
+
295
+ 即使看完全部的本教程,那么最多你也仅仅算是学会了个皮毛,简单入门而已,真正复杂难的是 图形学 中的一些知识点,例如 向量,矩阵,齐次坐标,点乘,叉乘,球极坐标,当然最复杂的莫过于 自定义渲染器(shader)。
296
+
297
+ 关于3D 技术栈,虽然不够严谨,但是大体上可以这样表述:** 图形学(CG) > OpenGL > OpenGL ES 2.0 > WebGL > Three.js**
298
+
299
+ 所以 Three.js 仅仅是 web 3D 最基础,表层的知识技术栈,想要深入学习,你会发现这是一条几乎不到头的道路,学秃。
300
+
301
+ > 图形学就是那种 从入门到放弃 的知识体系。
302
+ >
303
+ > 但是别灰心,我们实际上并不会真正需要那么深入高深的,学会 Three.js 可以做一些基础的 网页 3D 还是会比一般前端要显得厉害很多。
304
+
305
+ <br >
306
+
307
+ #### BufferGeometry的重要知识点:position、normal、uv
308
+
309
+ > 先普及个基础知识:在 3D 中 Vector3 既可以表示一个 三维坐标,也可以表示一个三维方向。
310
+
311
+ 一个完整的 BufferGeometry 是由若干个 点(Vector3) 构成的:
312
+
313
+ > 上面提到的 点 准确说应该是 3维 点坐标,对应的是 Vector3 :https://threejs.org/docs/index.html#api/zh/math/Vector3
314
+
315
+ 下面的知识实际上是针对 图形学 和 OpenGL 的。
316
+
317
+ 1 . position:坐标(每个坐标就是一个 vector3,由 3 个数字组成),所有的坐标就是组成该 BufferGeometry 的所有 点 的信息(对于底层的 BufferGeometry 而言 3维点的 (x,y,z) 坐标是分开存储值的)。
318
+
319
+ > 这就是 Three.js 针对 webgl 进行的封装,实际上我们平时更多时候都使用的是 Vector3,而不是具体的 3 个值。
320
+
321
+ 2 . normal:法线(每个法线就是一个 vector3,由 3 个数字组成),用于存储每个 3D 坐标点的朝向,用于计算 反光。
322
+
323
+ 3 . uv:纹理映射坐标(每个uv就是一个 vector2,由 2 个数字组成),用于存储每个 3D 坐标点对应渲染纹理时对应的 位置点信息,用于计算 贴图。
324
+
325
+ > 对于纹理而言,它都是 二维的平面,因此 uv 的值对应的是 Vector2,由 x,y 2 个坐标值组成,且每个值的取值范围都是 0 - 1。
326
+ >
327
+ > 你可以简单把 0 - 1 理解成 0% - 100%,对应的是一个百分比的值。
328
+
329
+ 通过上面的讲述,我们大致可以作出以下结论,如果我们自定义一个 BufferGeometry,那么:
330
+
331
+ > 对于初学者而言几乎不需要、也做不到 可以 自定义 BufferGeometry 这一步,我这里只是超前提一下。
332
+
333
+ 1 . 假设这个 BufferGeometry 不需要考虑 反光 和 纹理贴图,那么它只需要拥有(设置) positon 就可以了。
334
+
335
+ > this.setAttribute('position', new BufferAttribute(this._ vertices, 3))
336
+
337
+ 2 . 假设这个 BufferGeometry 需要考虑反观,但不需要考虑纹理贴图,那么它需要设置 postion 和 normal。
338
+
339
+ > this.setAttribute('position', new BufferAttribute(this._ vertices, 3))
340
+ >
341
+ > this.setAttribute('normal', new BufferAttribute(this._ normals, 3))
342
+
343
+ 3 . 假设这个 BufferGeometry 需要考虑反光和纹理贴图,那么它的 postion 、normal、uv 都需要设置。
344
+
345
+ > this.setAttribute('position', new BufferAttribute(this._ vertices, 3))
346
+ >
347
+ > this.setAttribute('normal', new BufferAttribute(this._ normals, 3))
348
+ >
349
+ > this.setAttribute('uv', new BufferAttribute(this._ uvs, 2))
350
+
351
+ 4 . ** 特别强调,上面提到的 position 是一个 BufferGeomerty 所有点信息的集合,它并不是 Mesh(网格,3D物体) 的 位置信息。**
352
+
353
+ 如果你理解不了我说的这段话,完全没有关系,忽略这段我补充的知识点,我也是学习 Three.js 快 1 年后才明白的。对于现在的你而言不理解是正常的。
354
+
355
+ 忽略我上面的这段话,继续本教程后面的学习吧。
356
+
357
+ > 以上内容更新于 2021.11.27
358
+
359
+
360
+
234
361
图元理论上的知识就先讲到这里,在下一节中,会编写一些图元示例。
0 commit comments