ThreeJS简介

      最后更新:2022-08-04 02:14:00 手机定位技术交流文章

      近年来,网络的发展迅速。随着HTML5的普及,网页的性能越来越强大。许多复杂的动画已经可以在网络上进行,精美的效果。 但是,人总是贪的。那么,除此之外,还能做些什么呢?其中一种是使用WebGL在网页中创建高性能3D图形。

      OpenGL,WebGL到Three.js
      OpenGL是最常用的跨平台图形库。
      WebGL是基于OpenGL设计的面向Web的图形标准,提供一系列JavaScript API,通过这些API可以使用图形硬件实现图形渲染,以达到更高的性能。
      three.js是一个易于使用的图形库,由包和简化WebGL接口组成。
      简单的公式是: threejs=three + js,三表示三维。js代表javascript。那么合起来,three.js意味着使用JavaScript来编写一个3D程序。而javascript的计算能力因为google的V8引 擎得到了迅猛的增强,做3D程序,做服务器是没问题的。
      WebGL阈值相对较高,它需要较多的数学知识(线性代数、分析几何)。因此,在短期内很难在WebGL上表现得很好。Three.js对WebGL提供的接口进行了很好的封印,简化了很多细节,它大大降低了学习的成本。并且,WebGL的灵活性几乎没有损失。
      因此,从三点开始。 js的可用性是推荐的,它使你能够在较短的学习期间处理最复杂的场景。

      学习JS的问题
      到学校的门相对简单,但当我们真正去学校时,我们发现一个非常尴尬的问题:关于学校的资料很少。
      通常这种流行的库都有很完善的文档,很多时候跟着官方的文档或官方的入门教程学习就是最好的路线。但Three不是的,它的文档对初学者来说太过简明扼要。
      不过官方提供了非常丰富的examples,几乎所有你需要的用法都在某个example中有所体现。但这些example不太适合用来入门,倒是适合入门之后的进一步学习。
      这里有一些相对好的教程:

      Three.js入门指南 :这是一份很好的Three.js 轻量级入门教程,作者文笔很好,基础知识讲解得简明易懂。
      Three.js开发指南(中文版I)
      Learning Three.js- Second Edition
      Learning Three.js:The JavaScript 3D Library for WebGL是现在不多的也是最好的Three.js入门书,这些三个函数的解释更为全面,Js的各个功能。 如果有能力的话,建议阅读英文版本2,出版于2015年,现在是三点。 差别很小。中文版自2012年首次出版的原版出版以来一直被翻译。大多数概念都是适用的,但许多细节都发生了变化。
      Three.js入门教程 :这是对国外一份教程的翻译,一共六篇文章。讲解不多,更多的是展示各个基本功能怎么用。更适合有一些图形基础的同学。
      当然,在实际学习过程中,这些信息绝非足够,如果有问题, 请亲自查找信息.但这里有一个提醒,Three.js更新非常频繁,现在是r80版本,自2010年4月 r1发布以来,这是第72版(一些中版本的数字已经跳过了)。因此,互联网上所找到的一些信息可能不适合当前版本,小心选择(在先前建议的信息中有一些类似的问题)。

      剖析源目录结构
      首先下载代码及其地址是: https://github."com/mrdoob/three".js。如图所示:
      在这里插入图片描述

      用压缩软件解封源包。每个目录如下显示:
      在这里插入图片描述

      Build目录:包含两个文件,three.js 和three.min.js 。这是three.js最终被引用的文件。一个已经压缩,一个没有压缩的js文件。
      Docs目录:这里是three.js的帮助文档,里面是各个函数的api,可惜并没有详细的解释。试图用这些文档来学会three.js是不可能的。
      编辑目录:类似于3D-max的简单编辑程序,可以创建一些3D对象。
      例如目录:一些非常有趣的实例演示,不幸没有文档描述。 学习的成本非常高,对于那些不深入理解图形的学生。
      Src目录: 包含所有源代码的源代码目录.
      测试目录: 一些测试代码, 基本上毫无用处.
      Utils目录:用于保存一些脚本、Python文件的工具目录。例如,转换一个3D - Max模型到3.js有一个特殊的json模型。
      .gitignore文件:Git工具的滤波规则文件,没有用处。
      CONTRIBUTING.md文件:说明如何报告错误和如何获得帮助的文档。
      著作权文件: 版权信息.
      README.md文件:三.A js文件的介绍,它也包含每个版本的更新列表。
      一些概念在Js中
      为了在屏幕上显示3D图形,这个想法一般是如下:
      建立一个3D空间
      Three中称之为场景(Scene)
      选择观察点,确定观察方向/角度
      Three中称之为相机(Camera)
      在现场观察的对象
      在三维中有许多类型的对象,包括 Mesh 、 Line 、 Points 等,它们都来自Object3D类
      4.将观察到的场景映射到屏幕上的指定区域
      使用 Renderer完成任务

      Scene
      场景是所有物体的容器,和我们创造的三维世界相符。

      Camera
      坐标系
      Camera是三维世界中的观察者,为了观察这个世界,首先我们要描述空间中的位置。 Three中使用采用常见的右手坐标系定位。

      在这里插入图片描述

      三维投影
      Three中的相机有两种,分别是正投影相机THREE.OrthographicCamera和透视投影相机THREE.PerspectiveCamera。
      在这里插入图片描述

      正交投影与透视投影的区别如上图所示,左图是正交投影,物体发出的光平行地投射到屏幕上,远近的方块都是一样大的;右图是透视投影,近大远小,符合我们平时看东西的感觉。
      1)正交投影相机
      在这里插入图片描述

      注:图中的“视角”与三维相机相符。
      这里是可视对象的概念的补充:可视对象是几何对象,只有可视对象内部的对象会被看见,而可视对象以外的对象会被切断,这是为了消除不必要的操作。

      正交投影相机的视景体是一个长方体,OrthographicCamera的构造函数是这样的:

      OrthographicCamera( left, right, top, bottom, near, far )
      摄像机本身可以被看作一个点,而左边显示左平面与摄像机之间的距离是左方向和右方向。 许多其他参数都是相同的,因此六个参数分别定义了视觉对象的六面的位置。

      类似地,视觉对象中的对象被投影平行于近平面,而近平面上的图像被渲染到屏幕上。
      2)透视投影相机
      在这里插入图片描述

      镜头投影仪的视角是矩形平台,其施工功能如下:
      PerspectiveCamera( fov, aspect, near, far )
      fov对应着图中的视角,是上下两面的夹角。aspect是近平面的宽高比。在加上近平面距离near,远平面距离far,就可以唯一确定这个视景体了。
      透镜投影相机非常符合我们通常看到的事物感,所以在大多数情况下,我们都用透镜投影相机显示3D效果。

      Objects
      用摄像机, 你总是想看到什么? 把一些东西添加到场景中.
      在“三”中显示的对象很多,它们都继承了Object3D类,这里我们主要看 Mash 和 Points。
      1)Mesh
      我们都知道,计算机的世界里,一条弧线是由有限个点构成的有限条线段连接得到的。线段很多时,看起来就是一条平滑的弧线了。
      计算机中的三维模型也是类似的,普遍的做法是用三角形组成的网格来描述,我们把这种模型称之为Mesh模型。
      在这里插入图片描述

      这是著名的斯坦福兔,它在3D图形中的地位与著名的莱娜在数字图像处理领域的地位相似。
      看这只兔子,随着三角形的数量增加,它的表面变得更加平滑和精确。
      在三维中,梅什的构造函数如下:
      Mesh( geometry, material )
      geometry是它的形状,material是它的材质。
      除了 Mash 之外, 许多对象都是使用这两个属性创建的.让我们看下面的两个重要属性.
      2)Geometry
      Geometry,形状,相当直观。Geometry通过存储模型用到的点集和点间关系(哪些点构成一个三角形)来达到描述物体形状的目的。
      三个提供许多基本形状,如三角形(实际上是矩形),平面(实际上是矩形),球形,圆形,柱形,表格等;
      还可以通过定义每个点的位置来构造形状;
      对于更复杂的形状, 我们也可以通过外部模型文件导入.
      3)Material
      材料,材料,它没有那种直观的形状。
      材料实际上是所有视觉属性的集合,如颜色、纹理、滑度、透明度、反射率、折射率和发光,除了形状之外。
      这里讲一下材质(Material)、贴图(Map)和纹理(Texture)的关系。
      上面提到的材料, 包括贴纸和其他.
      卡片实际上是“卡片”和“图片”,包括图片和该贴在哪里。
      这是纹身,实际上是一张照片。
      三个提供广泛的材料选择,并可以自由选择材料如扩散反射/镜反射。
      4)Points
      讲完了Mesh,我们来看看另一种Object——Points。
      点实际上是点的集合,它在之前很长时间都被称为ParticleSystem(粒子系统),r68版本时更名为PointCloud,r72版本时才更名为Points。更名主要是因为,在杜布的意见中,粒子系统应该是一个完整的系统,包括处理粒子和相关物理性质。这些三点都比较简单。因此,该班最终被命名为Points。
      5)Light
      神说:要有光!
      光学效应是丰富屏幕的重要因素.
      Three提供了包括环境光AmbientLight、点光源PointLight、 聚光灯SpotLight、方向光DirectionalLight、半球光HemisphereLight等多种光源。
      只要把所需的光源添加到现场.
      6)Renderer
      在场景中,各种物体被创造出来,有光线,还有摄像机观察这些物体,现在是将你看到的物体映入屏幕的时候了。
      Renderer绑定一个canvas对象,并可以设置大小,默认背景颜色等属性。
      调用Renderer的render函数,传入scene和camera,就可以把图像渲染到canvas中了。

      让画面动起来
      现在一个静态的屏幕已经获得, 如何使它移动?
      很简单的想法,改变场景中object的位置啊角度啊各种属性,然后重新调用render函数渲染就好了。
      那么你如何确定重新交还的时间?
      HTML5提供了 requestAnimFrame,它在每页重新绘制之前自动调用功能。
      如果我们用这个渲染开始:

      function render()
      {
      renderer.render(scene, camera);
      }
      只需要改成这样:

      function render()
      {
      requestAnimationFrame(render);
      object.position.x += 1;
      renderer.render(scene, camera);
      }
      这个对象可以移动!

      举个例子
      这里是一个简单的例子来说明这个过程。
      首先用Canvas元素写一页。

      立方体让我们做下面的 Javascript 部分. 首先启动 Render

      function initRenderer() {
      width = document.getElementById(‘three_canvas’).clientWidth;
      height = document.getElementById(‘three_canvas’).clientHeight;
      renderer = new THREE.WebGLRenderer({
      //将Canvas绑定到渲染器
      canvas: document.getElementById(‘three_canvas’)
      });
      renderer.setSize(width, height);//将渲染的大小设为与Canvas相同
      renderr.SetClearColor(0xFF, 1.0);//设置默认的颜色和透明度
      }
      初始化场景:

      function initScene() {
      scene = new THREE.Scene();
      }
      初始化相机:

      function initCamera() {
      //简单的正交投影相机,正对着视口的中心,视口大小与Canvas大小相同。
      camera = new THREE.OrthographicCamera(width / -2, width / 2, height / 2, height / -2, 1, 1000);
      //设置相机的位置
      camera.position.x = 0;
      camera.position.y = 0;
      camera.position.z = 200;
      //设置摄像机
      camera.up.x = 0;
      camera.up.y = 1;
      camera.up.z = 0;
      //设置摄像机的焦点(事实上,确定方向)
      camera.lookAt({
      x: 0,
      y: 0,
      z: 0
      });
      }
      为了确定一个相机的位置和方向,三个属性位置、上、和LookAt都无法使用。
      这里我们创建了一个正交投影相机,我将视角的大小与屏幕分辨率保持一致,只是为了方便,所以坐标系统中的一个单位长度与屏幕的一个像素相符。
      我们将把摄像机放在Z轴上,面向坐标源点,摄像机的上方向是Y轴方向,并且注意,上方向和LookAt方向必须垂直(类比自己的头更了解)。
      下面将一个方形添加到场景:

      function initObject() {
      //创建一个边界100的矩形
      var geometry = new THREE.CubeGeometry(100, 100, 100);
      object = new THREE.Mesh(geometry, new THREE.MeshNormalMaterial());
      scene.add(object);
      }
      注意,我们使用方法性材料 MashNormalMaterial,使方块的每个面部的颜色与面部的方向有关,这更容易观察/调试。
      在这个简单的演示中,我不会添加照片效果,而且定位材料也不会对光作出反应。最后,创建一个动画循环

      function render() {
      requestAnimationFrame(render);
      object.rotation.x += 0.05;
      object.rotation.y += 0.05;
      renderer.render(scene, camera);
      }
      每次重新绘制时,立方体会稍微移动。当页面被正确加载时,请在其前面调用函数。

      function threeStart() {
      initRenderer();
      initCamera();
      initScene();
      initObject();
      render();
      }
      window.onload = threeStart();

      本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/31480.html

          热门文章

          文章分类