一、webgl与three.js 

 我们知道canvas、svg等是2D绘图的,那么如果想要使用js进行3D绘图,可以吗? 答案是肯定的!实际上主流的3D开发使用的是c++,但是随着技术的发展,JavaScript目前已经是无孔不入了,包括web(vue/react)、移动端(RN/weex)、客户端(electron/nw)、后端(nw)、人工智能(tensorflow.js),而three.js就是使用JavaScript进行3d绘图的框架了,而three.js是对webgl进行封装的,所以,实际上webgl是3D绘图的基础,但我们使用three.js开发会更加高效。遗憾的是,目前仅有部分主流浏览器支持webgl,但还是值得我们探索和在合适的场景下使用的。而three.js也是非常容易从字面理解的,three就是3d,js就是JavaScript,所以three.js就是使用JavaScript进行3d开发。

   在github上可以找到three.js,可以看到,three.js目前star数已经达到了4万之多,足以说明其流行程度。 下面是three.js的github目录:

  可以看到,three.js更新非常频繁,这里主要介绍一下各个目录。 build目录是生成的我们直接引用的three.js和three.min.js文件;docs目录中罗列了three.js相关文档;editor目录是一些简单编辑程序;example目录是three.js实现的一些例子; src目录是该项目的源代码;test目录是项目的测试代码;utils目录存放一些脚本。

二、如何使用

  使用非常简单,首先我们进入build目录中的three.min.js,然后点击raw按钮,就可以得到一个url(https://raw.githubusercontent.com/mrdoob/three.js/dev/build/three.min.js),最后我们在html文件中引入这个js文件即可,注意:github链接较慢,我们可以复制js代码到本地,然后引入,如下所示:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>three.js</title>
<script src="./three.js"></script>
</head>
<body>
</body>
</html>

  接着,我们在chrome浏览器中打开F12,在console控制台中输入THREE,然后回车,可以得到下面的结果:

  即THREE是three.js暴露出来的一个对象,其中有很多属性和方法可以调用。

三、核心概念

  在three.js中,核心的便是场景(scene)、相机(camera)、渲染器(renderer),有了这三者,才能使用相机将场景渲染到网页上去。

(1)场景

  描述3D使用的就是场景,使用THREE.Scene()构造,注意,THREE是对象,而Scene是构造函数,所以首字母都是大写的。

(2)相机

  相机就像我们的眼睛,从不同的角度看,那么看到的场景也就不一样。另外,场景是一样的,而相机有多种拍照方式,所以,需要我们根据需要调整。而最常用的就是透视相机,即THREE.PerspectiveCamera(),同样的,THREE是对象,PerspectiveCamera是构造函数,首字母大写,且是驼峰式命名方法。

(3)渲染器

  即在网页上显示什么元素,都是需要渲染出来的,使用THREE.WebGLRenderer,且在使用过程中,需要使用domElement挂载到页面上,后面的例子会讲解。  

  

而对于这三者,我们可以认为场景是一个容器,可以将一些物体如cube放在这个容器中;而相机的作用就是对这个选择合适的角度容器拍摄得到一张照片;渲染器的作用是把相机拍到的照片放到浏览器中显示,如下所示:

                                  

四、实例

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>three.js</title>
<style>
* {
margin: ;
padding: ;
}
</style>
<script src="./three.js"></script>
</head>
<body>
<script>
var scene = new THREE.Scene(); var axes = new THREE.AxesHelper();
scene.add(axes); var camera = new THREE.PerspectiveCamera(, window.innerWidth/window.innerHeight, , );
camera.position.x = ;
camera.position.y = ;
camera.position.z = ;
camera.lookAt(scene.position); var renderer = new THREE.WebGLRenderer();
renderer.setClearColor(0x111111);
renderer.setSize(window.innerWidth, window.innerHeight); var geometry = new THREE.CubeGeometry(, , );
var material = new THREE.MeshBasicMaterial({color: 0xff0000});
var cube = new THREE.Mesh(geometry, material);
cube.position.x = ;
cube.position.y = ;
cube.position.z = ;
scene.add(cube); document.body.append(renderer.domElement);
renderer.render(scene, camera);
</script>
</body>
</html>
  • 创立一个Scene(场景),这个场景是three.js所依赖的基础,是需要首先创立。
  • 有了场景 ,我们就可以创建一个AxesHelper(坐标轴,然后add到场景中。
  • 接着创建一个PerspectiveCamera(相机),并且指定相机的位置。
  • 有了场景、坐标轴、相机之后,就可以创建3D物体了,而3D物体的是由Geometry(几何图形Material(材料)组成,然后添加物体到指定的位置,最后添加到场景中
  • 最后,我们需要将DOM与3D结合起来,然后进行渲染即可。

  于是,我们可以看到,使用three.js还是很简单的,就是场景、坐标轴、相机、渲染引擎、事物、挂载。最后结果如下:

  

  如上所示是静态的,如果需要时动态的,就需要用到渲染循环了,主要用到的函数是requestAnimationFrame,如下,仅仅替换了极少的代码:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>three.js</title>
<style>
* {
margin: ;
padding: ;
}
</style>
<script src="./three.js"></script>
</head>
<body>
<script>
var scene = new THREE.Scene(); var axes = new THREE.AxesHelper();
scene.add(axes); var camera = new THREE.PerspectiveCamera(, window.innerWidth/window.innerHeight, , );
camera.position.x = ;
camera.position.y = ;
camera.position.z = ;
camera.lookAt(scene.position); var renderer = new THREE.WebGLRenderer();
renderer.setClearColor(0x111111);
renderer.setSize(window.innerWidth, window.innerHeight); var geometry = new THREE.CubeGeometry(, , );
var material = new THREE.MeshBasicMaterial({color: 0xff0000});
var cube = new THREE.Mesh(geometry, material);
cube.position.x = ;
cube.position.y = ;
cube.position.z = ;
requestAnimationFrame(function () {
cube.position.x++;
});
scene.add(cube); document.body.append(renderer.domElement); function render() {
cube.rotation.x += 0.1;
cube.rotation.y += 0.1;
renderer.render(scene, camera);
requestAnimationFrame(render);
}
render();
</script>
</body>
</html>

  如下所示,通过requestAnimationFrame在配合cude的rotation属性使用,就可以让这个cube旋转起来了。

  另外,对于相机的设置,我们还可以设置up属性,即camera.up.x = 0; camera.up.y = 0; camera.up.z = 0;即camera的position属性可以确定相机位置,lookAt可以确定看的方向,但是相机拍摄是我们这样竖着拍摄还是横着拍摄呢,这就取决于你设置camera的上方了,使用camera.up属性来设置。

webgl介绍的更多相关文章

  1. WebGL three.js学习笔记 创建three.js代码的基本框架

    WebGL学习----Three.js学习笔记(1) webgl介绍 WebGL是一种3D绘图协议,它把JavaScript和OpenGL ES 2.0结合在一起,通过增加OpenGL ES 2.0的 ...

  2. js常用面试题整理

    1.array操作关键字: pop() 删除最后一个:push最后添加一个或者多个:reverse颠倒数组:shift删除第一个元素:unshift首部添加元素:concat衔接两个数组:join把数 ...

  3. Web3D编程入门总结——WebGL与Three.js基础介绍

    /*在这里对这段时间学习的3D编程知识做个总结,以备再次出发.计划分成“webgl与three.js基础介绍”.“面向对象的基础3D场景框架编写”.“模型导入与简单3D游戏编写”三个部分,其他零散知识 ...

  4. WebGL three.js学习笔记 6种类型的纹理介绍及应用

    WebGL three.js学习笔记 6种类型的纹理介绍及应用 本文所使用到的demo演示: 高光贴图Demo演示 反光效果Demo演示(因为是加载的模型,所以速度会慢) (一)普通纹理 计算机图形学 ...

  5. WebGL 着色器偏导数dFdx和dFdy介绍

    本文适合对webgl.计算机图形学.前端可视化感兴趣的读者. 偏导数函数(HLSL中的ddx和ddy,GLSL中的dFdx和dFdy)是片元着色器中的一个用于计算任何变量基于屏幕空间坐标的变化率的指令 ...

  6. WebGL three.js学习笔记 法向量网格材质MeshNormalMaterial的介绍和创建360度全景天空盒的方法

    WebGL学习----Three.js学习笔记(5) 点击查看demo演示 Demo地址:https://nsytsqdtn.github.io/demo/360/360 简单网格材质 MeshNor ...

  7. 使用webgl(three.js)创建3D机房,3D机房微模块详细介绍(升级版二)

    序: 上节课已经详细描述了普通机房的实现过程,文章地址(https://www.cnblogs.com/yeyunfei/p/10473021.html) 紧接着上节课的内容 我们这节可来详细讲解机房 ...

  8. 超简单的OpenGL & WebGL & Three.js介绍_1

    专业解释 什么是OpenGL OpenGL(Open Graphics Library即开放图形库或者“开放式图形库”)是用于渲染2D.3D矢量图形的跨语言.跨平台的应用程序编程接口(API). 这个 ...

  9. 使用webgl(three.js)创建科技版3D机房,3D机房微模块详细介绍(升级版三)—— 1

    上节课已经详细描述了微模块机房的实现过程,文章地址(https://www.cnblogs.com/yeyunfei/p/10484241.html) 紧接着上节课的内容 我们这节可来详细讲解科技版机 ...

随机推荐

  1. c++关键字static的作用

    1.隐藏 当同时编译多个源文件(.cpp)时,在某一个源文件中用static修饰的全局变量或函数,对其他源文件是隐藏的 //1.cpp ; void fun() { cout << < ...

  2. extern声明全局变量用法

    在类之外声明一个成员变量,如: a.h CString name; class a{ }; a.cpp extern CString name; 然后就可以用name这个成员变量了. b.cpp ex ...

  3. 如何在CentOS7上安装Python3及对应问题

    首先一般来说安装好的CentOS是会自带python2.7,但是是没有安装python3的环境的 [root@host bin]# pwd /usr/bin [root@host bin]# ls p ...

  4. 文档/视图(01):第一个Demo

    学习文档视图编程的第一个demo,程序比较简单,主要对文档模板,文档,视图等相互关系的一个了解. 功能:菜单添加一个[操作]项,然后新建四份空白文档,点击[操作]之后,在四份空白文档上面各绘制一个Bu ...

  5. (BestCoder Round #64 (div.2))Array

    BestCoder Round #64 (div.2) Array 问题描述 Vicky是个热爱数学的魔法师,拥有复制创造的能力. 一开始他拥有一个数列{1}.每过一天,他将他当天的数列复制一遍,放在 ...

  6. (最短路)Silver Cow Party --POJ--3268

    题目链接: http://poj.org/problem?id=3268 题意: 先求出所有牛到x的最短路,再求出x到所有牛的最短路,两者相加取最大值(单向图)(可以用迪杰斯特拉,SPFA) 迪杰斯特 ...

  7. JS 对象(Object)和字符串(String)互转方法

    利用原生JSON对象,将对象转为字符串 1 2 3 4 5 6 var jsObj = {}; jsObj.testArray = [1,2,3,4,5]; jsObj.name = 'CSS3'; ...

  8. shell工具-cut

    cut cut的工作就是“剪”,具体说就是在文件中负责剪切数据用的.cut命令从文件的每一行剪切字节.字符.和字段并将这些字节.字符和字段输出 基本用法 cut [参数] filename # 说明: ...

  9. Android学习之可滑动当前的Activity视图看见上一个活动的视图

    先看一下我的效果图吧: 好大的图啊!!! 百度音乐由一个很酷的功能,当前的UI可以滑动,然后看见上一个活动的UI,当时顿时觉得百度的牛人好多啊,能将如此前沿的技术应用到app上.当然如果你熟悉了And ...

  10. mysql-5.7安装、配置

    1.进入到要存放安装包的位置 cd /home/lnmp 2.查看系统中是否已安装 MySQL 服务,以下提供两种方式: rpm -qa | grep mysql yum list installed ...