requestbody前端怎么传_前端图形学(二十七)——从源码下手去撬开threejs的大门

欢迎来到【畅哥聊技术】前端图形学相关技术文章,更多精彩内容持续更新中,敬请关注。

a5e2d515a2d6e40f0a8e629154149090.png

由于很多人反应看不懂“万恶”的原生webgl,所以其更新将告一段落,接下来我们将矛头转向你们心心念念的threejs分享啦~

写在前面

由于互联网上有很多有关于threejs的入门教程,我这里也是入门级的,但是我会深入源代码去分析其核心功能的实现原理。

所以我希望在看此文章的你:

  1. 有扎实的js基础,尤其是面向对象
  2. 有一些threejs的基础
  3. 有大概了解过原生的webgl(不太明白的可以去看一下我前几篇关于wegbl的文章)

几乎所有的threejs基础教程都会教你怎么去生成一个立方体,然后在那转来转去的。那么接下来我们也实现一个,然后再去分析其源码。

示例:

90e902d5b47fd83cb3cc2b613a5a7e57.gif

完整的代码:

fbb39e41132aec26dd63067593d7cb32.png

下面来介绍上面的示例中的核心类的源代码,threejs里面所有的类都是挂载在THREE命名空间下。下面的源码不再提THREE域了。

场景(Scene)

这应该是所有的threejs项目的第一个要用到的类了,接下来我们看下它的源代码。

d23059e5f1051fbd40bf3e3f8a56ac04.png

打开github上的它的源码,通过我圈出来的两行代码不难发现,Scene继承于Object3D这个类。那我们再往里面去看下这个Object3D是怎么写的。

1e71bf1c0d5b098ce8bcdc5050715e26.png

我们发现,Object3D这个类已经是最顶级的父类了,Object3D通过Object.defineProperties定义了很多的属性,position,rotation 等。

6b1c4e7fa33097d8b56f01b764c84399.png

因此所有继承自Object3D的类都具有这些属性。

在上面的demo的源代码中,我们可以看到,scene.add方法,是将我们的物体添加到场景中去,具体添加到了场景中的children数组中去了,下面我再去找找这个add方法的定义。不难发现,这个add方法的定义就是在Object3D这个类中。

c5e7bb927ece42f1b6e90dcc912ffc61.png

这个方法第一步就是判断参数的个数。

if ( arguments.length > 1 ) {for ( var i = 0; i < arguments.length; i ++ ) {this.add( arguments[ i ] );}return this;}

从这几句我们可以看出来,我们可以这样去调用scene.add(object1,object2....),大家请再回头看下我的示例代码,我就是这样来调用的。

接下来我们来看下这段代码

ed4d942bc96b2b7308195a10398cceb2.png

什么意思?就是说如果我们将自己添加到自己中 [ scene.add(scene) ],这时候就是抛出异常。

接着往下看:

baa82bfb0361256b18d140f8822a119d.png

如果被添加的对象不是Object3D的子类的对象,那么也将不能添加到Object3D中去。值得注意的是:如果被添加的obeject已经在其它的Object3D对象中,那么先要将其从之前的Object3D对象中移除掉。然后再将其添加到当前的OBject3D中来。并将对象的的parent指向当前的Object3D的实例。

除了add方法,那么对应的也应该有remove方法。其实现原理和add差不多。不再赘述了。

远景相机(PerspectiveCamera)

b640bdeefa7041ac35ee72f7ccdb8011.png

近大远小的特性和我们的眼睛看到的一样。它的构造方法中需要传入四个参数。

  • fov 相机视锥体垂直视角,从下到上的观察角度。
  • zoom 获取或设置相机缩放因子(zoom factor)(一般用画布的宽/画布的高)
  • near 相机视锥体近裁剪面。
  • far 相机视锥体远裁剪面。

继续看它的源代码:

982c0aa9d8871a71a28b4969f3772c15.png

我圈出来的两行代码,不难发现,它是继承自 Camera 类。那么继续看Camera类。

a7ec5c5c49a97c7d4b977cbaa4283755.png

不难发现,这货最终也是继承Object3D,那我们看下,相机类它做了什么事情。

我在camera.js中找到了这一句:

this.projectionMatrix = new Matrix4(); //创建一个四维矩阵。

在PerspectiveCamera.js中找到了

7a530f705ad82c80f333d2902113f198.png

大概知道了,相机其实就是矩阵的不断变化的过程,比如,我们移动相机的时候,内部其实就是在做矩阵变化。

这里需要注意的是。相机的position默认是 new Vector3() 也就是贴在了我们的电脑屏幕上。默认我们看不到任何的场景中的物体,所以我们在不要忘了设置相机的position.z的值。

bfb25d9a4d2f1e56267fb3080c85cdda.png

本示例中,还有涉及到点光源和渲染器几何体的的使用。后面我们结合源代码继续分析。今天就到这。下期再见


总结

1、threejs中的场景和相机都是由Object3D衍生而来,大家在学习的过程不要忘了去查看下它的源代码。

2、通过对场景实例的add方法的分析,我们知道它可以传一个参数,也可以传多个参数。

3、相机中位置的移动其实就是内部在做一些矩阵的变换,这个我们在之前的原生的webgl中绘制立方体的时候有在着色器中对各种顶点进行了旋转。把这些联想到一起,threejs中的一些概念也不是那么难以理解了~

以上是今天所有的分享内容。喜欢的请点赞关注,不喜欢的解散。。。

这里是【畅哥聊技术】前端图形学相关技术文章,更多精彩内容持续更新中。。。

未完待续。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值