Threejs 的快速入门

这篇文章主要为大家Threejs 的快速入门 ,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

现在什么都是3D,看电影3D,打游戏3D,估计3D打车,很快就会面世。那么作为前端开发的标准语言,JS和3D能不能也搞出点大新闻呢?刚好最近在做一个活动时,就遇到了需要播放3D全景视频的需求,顺便就研究了一下Threejs,一个用于在浏览器中绘制3D图像的JS库(https://github.com/mrdoob/three.js),这篇文章算是做个笔记,也希望能帮助到那些想快速入门的同学。

最小环境

首先,在正式学习Threejs前,有几个概念需要说明的。Threejs在底层其实还是调用html5中的canvas api来实现绘图的。但和我们一般绘制2D图像不同,Threejs在底层使用的是canvas的webgl context来实现3D绘图。webgl context本身更多是直接对gpu的操作,用起来相当不直观,为此Threejs在顶层对3D绘图所需的各种元素(例如场景,摄影机,灯光,几何图像,材质等)进行了封装,如果我们需要使用Threejs来绘图,只需要创建一个最小绘图环境即可,这个最小绘图环境包含了三个要素:

1.场景–包含所有需要显示的3D物体以及其他相关元素的容器

2.摄像机–决定3D场景如何投影到2D画布之上

3.渲染器–用于最后绘制的画笔

具体的代码如下:

    import { Scene, PerspectiveCamera, WebGLRenderer } from ‘three’;    var scene = new Scene(); // 创建场景    var camera = new PerspectiveCamera(45, window.innerWidth / window.innerHeight, 1, 1000); // 创建摄影机    camera.position.z = 8;    var renderer = new WebGLRenderer(); // 创建渲染器    renderer.setSize(window.innerWidth, window.innerHeight); // 设置画布大小    renderer.setPixelRatio(window.devicePixelRatio); // 设置像素比,针对高清屏    renderer.setClearColor(0x000000, 1); // 设置默认背景色    document.body.appendChild(renderer.domElement); // 把画笔插入到dom中

登录后复制

简单的几句代码,就可以建立起一个最小绘图环境,之后只要我们向这个环境中放入需要显示的3D对象,这些对象就会被绘制在画布中,显示在屏幕上。

3D**对象**

有了环境,我们还需要告诉Threejs,到底需要显示什么物体。为此,我们首先需要定义这个用于显示的物体,然后把他加入到场景中即可。

    import { Mesh, MeshBasicMaterial, BoxGeometry } from ‘three’;    var geometry = new BoxGeometry(1, 1, 1); // 创建一个长方体,用来定义物体的形状    var material = new MeshBasicMaterial({ color: 0xff0000 }); // 创建一个材质,用来定义物体的颜色    var mesh = new Mesh(geometry, material); // 使用形状和素材,来定义物体    scene.add(mesh);    renderer.render(scene, camera);

登录后复制

先看看效果

Threejs 的快速入门

怎么感觉好无聊,哈哈哈,但不管怎么样,我们已经可以绘制出东西来了。

形状和材质

估计大家看了上面的代码,一定会有一些疑问,那个texture是什么鬼,geometrymaterial又是用来干嘛的。其实Threejs在定义一个3D物体时,需要提供两个信息,第一是形状信息,也就是这个物体上每一个点,每一个面的坐标信息,第二是材质信息,用于告诉Threejs物体的颜色,纹理,反光等信息。有了这些信息,Threejs才知道要如何渲染这个物体。而上面的new BoxGeometry(1, 1, 1),就是告诉Threejs,我要显示一个长宽高各为1的长方形。而new MeshBasicMaterial({ color: 0xff0000}),就是要告诉Threejs,这个长方体是红色的。最后根据形状和素材,new Mesh(geometry, material),生成需要显示的物体。

上面提到在Threejs中如果要生成一个长方体,则需要定义一个BoxGeometry,那除了长方体,Threejs还可以生成形状呢:

1.BoxGeometry–长方体

2.CircleGeometry–圆形平面

3.CylinderGeometry–圆柱体

4.PlaneGeometry–方形平面

5.RingGeometry–环形平面

6.SphereGeometry–球形

7.TextGeometry–文字

8.TorusGeometry–圆环

9.TubeGeometry–圆管

另外上面写到的MeshBasicMaterial,其实是指一个直接就能显示颜色的材质。什么叫直接显示颜色呢?这里要涉及到Threejs里的灯光设置。物体的材质由于确定物体的颜色,纹理,以及反光等属性。要反光,首先需要有一个光源:

    import { SpotLight } from ‘three’;    var light = new SpotLight(0xffffff);    light.position.z = 5;    light.position.x = 5;    light.position.y = 5;    scene.add(light);

登录后复制

这里我们定义了一个白光源,具体的效果如下:

Threejs 的快速入门

为了可以看清楚效果,我在场景中加入了一个绿色平面,可以看到,这个绿色平面上的反光是从下到上减弱,可见,这个光源是在画面的下方。

如果我把光源的强度减弱,那么平面上的反光也会跟着减弱:

Threejs 的快速入门

但不知大家有木有发现,绿色平面上的反光是减弱了,但红色的那个长方体,还是一样的红,完全没有变化。其实这就体现出不同材质的区别了,在红色长方体上,我采用的是MeshBasicMaterial这种材质,而在绿色平面上,我采用的是另一种称为MeshLambertMaterial的材质,这种材质的特点是漫反射强烈,主要用来模拟真实环境下的物体,例如木材,石料等物质的反光情况。另外Threejs还有另外一种材质叫MeshPhongMaterial,这种材质主要是镜面反射强烈,用来模拟镜子金属等拥有高光的物体就比较合适。

MeshLambertMaterialMeshPhongMaterial两种材质,都是需要光照才能看到的,如果场景中没有光源,你将会什么都看不到。相反我们在红色长方体上采用的材质是MeshBasicMaterial,这种材质即使没有光,也可以看到,你可以想象为它自己发光吧,如果用技术一点的话来说,就是MeshLambertMaterialMeshPhongMaterial两种材质需要根据场景光线的数值来计算显示在屏幕上的颜色,而MeshBasicMaterial则忽略光线的作用,是什么颜色,就直接显示什么颜色,但也由于这种材质忽略了光照的作用,那么它也不会有任何阴影的效果。所以这种材质就叫Basic,用来做演示就十分合适。一下就是Threejs提供给我们用到的其他材质

1.MeshBasicMaterial

2.MeshLambertMaterial–漫反射材质

3.MeshPhongMaterial–镜面反射材质

4.MeshDepthMaterial–根据物体上每一点到摄像机的远近来显示颜色,远的显示黑色,近的显示白色

5.MeshNormalMaterial–根据物体上每一面的法向量方向来显示颜色


纹理贴图

如果绘制3D物体时,只能使用纯色,那也未免太单调了,没关系,Threejs提供了接口来帮忙解决这个问题。Threejs的材质,除了可以设置颜色,还支持纹理贴图,我们可以把一个图片,覆盖在3D物体上作为他的纹理,这样就可以利用这些贴图来模拟更真实的场景

    import { TextureLoader, MeshLambertMaterial } from ‘three’;    var texture = new TextureLoader().load(‘./assets/texture/crate.gif’);    var material = new MeshLambertMaterial({ map: texture });

登录后复制

上面的代码中,我们通过TextureLoader来加载一个gif图作为纹理,并且把这个纹理通过map属性映射到了材质上,加上材质后,整个物体就更加真实了

Threejs 的快速入门

3D动画

能绘图了,但如何加入动画呢?其实很简单,在之前的代码中已经讲解过,Threejs是通过渲染器来绘图的,你可以想象成拍照。我们在场景中摆好灯光,摆好道具,渲染器咔嚓一下,就把当前的画面绘制下来了。那如果要做成动画,只需要在渲染器来个定时连拍就可以拉。具体如下。

    function render() {        requestAnimationFrame(render);        update();        renderer.render(scene, camera);    }    function update() {        // update your view    }

登录后复制

这里我们通过requestAnimationFrame接口,来做定时刷新,每次进入render方法,都会先去执行update方法(用于更新场景),然后让渲染器拍照(renderer.render(scene, camera)),最后等待下一次render。在update方法中,我们可以修改场景中所有物体的参数,例如,我们可以试着让盒子在屏幕中转动:

    function update() {        box.rotation.x += 0.005;        box.rotation.y += 0.01;    }

登录后复制

最后的最后,其实Threejs还有很多额外的能力,例如刚刚我们使用图片作为纹理,那么我们也可以使用视频作为纹理,把这个纹理贴到一个盒子上,通过陀螺仪来控制摄像机的拍摄方向,就可以作出一个全景视频啦。Threejs也支持粒子系统,模型数据导入,自定义着色器等一系列高级功能,大家也赶快掌握起来吧。

以上就是Threejs 的快速入门 的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2774081.html

(0)
上一篇 2025年3月8日 14:02:00
下一篇 2025年3月8日 14:02:08

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • js中的基本类型和引用类型

    本篇文章给大家分享的内容是关于js中的基本类型和引用类型,有着一定的参考价值,有需要的朋友可以参考一下 js中的基本类型和引用类型 转载自https://blog.csdn.net/shuidinaozhongyan/article/det…

    2025年3月8日 编程技术
    200
  • 简单实现angularjs遮罩过渡加载

    这篇文章主要介绍了简单实现angularjs遮罩过渡加载,非常不错,具有参考借鉴价值,需要的朋友参考下吧 前言:  很多情况下angularjs 加载页面时,会显示‘{{}}’ 等,带来页面美观性的问题。所以这个时候我们要用到遮罩,也就是页…

    2025年3月8日
    200
  • 实例解析Js中的this

    本篇文章给大家分享的内容是关于实例解析js中的this,有需要的朋友可以参考一下 零 从一个例子说起 前几天在看面试题的时候看到了这样一段程序: obj = {  name: ‘a’,  getName: function () {    …

    2025年3月8日
    200
  • JS中各种对象关系

          一张图让你看懂javascript各类型的关系      这个图来自于《JavaScript语言精髓与编程实践》第三章P184页。最近在改第二版,这张图重做了,需要的可以对照着看。   此外,补充一下图中用到的概念:   1、内…

    2025年3月8日
    200
  • js阻止事件冒泡的两种方法

    本篇文章给大家分享的内容是关于js阻止事件冒泡的两种方法 ,有需要的朋友可以参考一下 一、冒泡事件简介 当我们点击一个控件的时候,如果包括这个控件的父控件也有click事件,则会继续执行。 方法一:event.stopPropagation…

    编程技术 2025年3月8日
    200
  • JS小案例之甩不掉的跟屁虫

    这篇文章主要介绍了js小案例之甩不掉的跟屁虫 ,需要的朋友可以参考下 根本鼠标的XY值,让元素移动 登录后复制      window.onload = function () { var ima = document.getElement…

    编程技术 2025年3月8日
    200
  • 100个常用js函数和语法

    本篇文章给大家分享的内容是100个常用js函数和语法 ,有着一定的参考价值,有需要的朋友可以参考一下 网站特效离不开脚本,javascript是最常用的脚本语言,我们归纳一下常用的基础函数和语法: 1.输出语句:document.write…

    编程技术 2025年3月8日
    200
  • 原生 js 构造函数

    本篇文章给大家分享的内容是关于原生 js 构造函数 ,有着一定的参考价值,有需要的朋友可以参考一下 javascript 是一种基于对象的语言,它包含5中原生数据类型: number(数值类型) boolean(布尔值类型) string(…

    编程技术 2025年3月8日
    200
  • AngularJS中遍历数组

    本篇文章给大家分享的内容是关于AngularJS中遍历数组 ,有着一定的参考价值,有需要的朋友可以参考一下 AngularJS中当我们需要遍历某个数组的时候,我们会用到forEach语法。AngularJS中forEach的用法如下: an…

    编程技术 2025年3月8日
    200
  • angularJs自定义指令

    本篇文章介绍的内容是关于angularjs自定义指令,现在分享给大家,有需要的朋友可以参考一下 1. 定义 对于指令,可以把它简单的理解成在特定DOM元素上运行的函数,指令可以扩展这个元素 的功能。 2.定义指令的方法: 登录后复制登录后复…

    编程技术 2025年3月8日
    200

发表回复

登录后才能评论