初识WEBGL
WEBGL (全写Web Graphics Library)是一种3D绘图协议,这种绘图技术标准允许把JavaScript和OpenGL ES 2.0结合在一起,通过增加OpenGL ES 2.0的一个JavaScript绑定,WebGL可以为HTML5 Canvas提供硬件3D加速渲染,这样Web开发人员就可以借助系统显卡来在浏览器里更流畅地展示3D场景和模型了,还能创建复杂的导航和数据视觉化。显然,WebGL技术标准免去了开发网页专用渲染插件的麻烦,可被用于创建具有复杂3D结构的网站页面,甚至可以用来设计3D网页游戏等等。
创建一个场景
本节的目的是简要介绍three.js。我们将首先使用旋转立方体设置场景。页面底部提供了一个工作示例,以防您遇到困难并需要帮助。
在我们开始之前
在使用three.js之前,您需要在某处显示它。将以下HTML保存到计算机上的文件中,以及js /目录中的three.js副本,并在浏览器中打开它。
<!DOCTYPE html>
<html>
<head>
<meta charset=utf-8>
<title>My first three.js app</title>
<style>
body { margin: 0; }
canvas { width: 100%; height: 100% }
</style>
</head>
<body>
<script src="js/three.js"></script>
<script>
// Our Javascript will go here.
</script>
</body>
</html>
就这样。下面的所有代码都进入空<script>标记。
创建场景
为了能够显示任何带有three.js的东西,我们需要三件事:场景,相机和渲染器,这样我们就可以用相机渲染场景。
var scene = new THREE.Scene();
var camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 );
var renderer = new THREE.WebGLRenderer();
renderer.setSize( window.innerWidth, window.innerHeight );
document.body.appendChild( renderer.domElement );
我们花一点时间来解释这里发生了什么。我们现在已经设置了场景,我们的相机和渲染器。
在three.js中有几个不同的相机。现在,让我们使用PerspectiveCamera。
第一个属性是视野。FOV是在任何给定时刻在显示器上看到的场景的范围。该值以度为单位。
第二个是宽高比。您几乎总是希望使用元素的宽度除以高度,或者您将得到与在宽屏电视上播放旧电影时相同的结果 - 图像看起来很紧。
接下来的两个属性是近剪裁平面和远剪裁平面。这意味着,远离相机的物体远远超过近或远的物体将不会被渲染。您现在不必担心这一点,但您可能希望在应用中使用其他值以获得更好的性能。
接下来是渲染器。这就是魔术发生的地方。除了我们在这里使用的WebGLRenderer之外,three.js还有其他几个,通常用作旧浏览器用户的后备或者由于某些原因没有WebGL支持的用户。
除了创建渲染器实例之外,我们还需要设置我们希望它渲染应用程序的大小。使用我们想要用我们的应用填充的区域的宽度和高度是个好主意 - 在这种情况下,浏览器窗口的宽度和高度。对于性能密集型应用程序,您还可以为setSize提供较小的值,例如window.innerWidth / 2和window.innerHeight / 2,这将使应用程序渲染为一半大小。
如果您希望保持应用程序的大小但是以较低的分辨率呈现它,可以通过调用setSize并将其作为updateStyle(第三个参数)来调用。例如,假设您的<canvas>具有100%的宽度和高度,setSize(window.innerWidth / 2,window.innerHeight / 2,false)将以半分辨率呈现您的应用。
最后但并非最不重要的是,我们将渲染器元素添加到HTML文档中。这是渲染器用于向我们显示场景的<canvas>元素。
“这一切都很好,但你承诺的那个立方体在哪里?” 我们现在加上吧。
var geometry = new THREE.BoxGeometry( 1, 1, 1 );
var material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );
var cube = new THREE.Mesh( geometry, material );
scene.add( cube );
camera.position.z = 5;
要创建一个立方体,我们需要一个BoxGeometry。这是一个包含多维数据集的所有点(顶点)和填充(面)的对象。我们将来会更多地探讨这个问题。
除了几何外,我们还需要一种材料来为它着色。Three.js有几种材料,但我们暂时坚持使用MeshBasicMaterial。所有材料都采用将应用于它们的属性对象。为了使事情变得非常简单,我们只提供0x00ff00的颜色属性,它是绿色的。这与CSS或Photoshop(十六种颜色)中的颜色相同。
我们需要的第三件事是网格。网格是一个采用几何体的对象,并将一个材质应用于它,然后我们可以将其插入到场景中,并自由移动。
默认情况下,当我们调用scene.add()时,我们添加的东西将被添加到坐标(0,0,0)中。这会导致相机和立方体彼此在一起。为了避免这种情况,我们只需将相机移出一点。
渲染场景
如果您将上面的代码复制到我们之前创建的HTML文件中,您将无法看到任何内容。这是因为我们实际上还没有渲染任何东西。为此,我们需要所谓的渲染或动画循环。
function animate() {
requestAnimationFrame( animate );
renderer.render( scene, camera );
}
animate();
这将创建一个循环,使渲染器在每次刷新屏幕时绘制场景(在典型的屏幕上,这意味着每秒60次)。如果您不熟悉在浏览器中编写游戏,您可能会说“我们为什么不创建一个setInterval?” 问题是 - 我们可以,但requestAnimationFrame有许多优点。也许最重要的一点是当用户导航到另一个浏览器标签时它会暂停,因此不会浪费他们宝贵的处理能力和电池寿命。
动画多维数据集
如果您将上面的所有代码插入到我们开始之前创建的文件中,您应该会看到一个绿色框。让旋转它让它变得更有趣。
在animate函数中的renderer.render调用上方添加以下内容:
cube.rotation.x += 0.01;
cube.rotation.y += 0.01;
这将在每一帧(通常每秒60次)运行,并为立方体提供一个很好的旋转动画。基本上,在应用程序运行时您想要移动或更改的任何内容都必须通过动画循环。你当然可以从那里调用其他函数,这样你就不会得到数百行的动画函数。
结果
恭喜!您现在已经完成了第一个three.js应用程序。这很简单,你必须从某个地方开始。
完整代码如下。玩弄它以更好地了解它的工作原理。
<html>
<head>
<title>My first three.js app</title>
<style>
body { margin: 0; }
canvas { width: 100%; height: 100% }
</style>
</head>
<body>
<script src="js/three.js"></script>
<script>
var scene = new THREE.Scene();
var camera = new THREE.PerspectiveCamera( 75, window.innerWidth/window.innerHeight, 0.1, 1000 );
var renderer = new THREE.WebGLRenderer();
renderer.setSize( window.innerWidth, window.innerHeight );
document.body.appendChild( renderer.domElement );
var geometry = new THREE.BoxGeometry( 1, 1, 1 );
var material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );
var cube = new THREE.Mesh( geometry, material );
scene.add( cube );
camera.position.z = 5;
var animate = function () {
requestAnimationFrame( animate );
cube.rotation.x += 0.01;
cube.rotation.y += 0.01;
renderer.render( scene, camera );
};
animate();
</script>
</body>
</html>
初识WEBGL的更多相关文章
- WebGL入门教程(一)-初识webgl
一.WebGL和传统网页的区别: 普通网页组成成分:HTML.JavaScript: WebGL网页组成成分:HTML5.JavaScript和GLSL ES(着色器语言 OpenGL ES): 二. ...
- WEBGL学习【一】初识WEBGL
<html lang="zh-CN"> <head> <title>NeHe's WebGL</title> <meta ch ...
- WebGL入门教程(五)-webgl纹理
前面文章: WebGL入门教程(一)-初识webgl WebGL入门教程(二)-webgl绘制三角形 WebGL入门教程(三)-webgl动画 WebGL入门教程(四)-webgl颜色 这里就需要用到 ...
- WebGL入门教程(四)-webgl颜色
前面文章: WebGL入门教程(一)-初识webgl WebGL入门教程(二)-webgl绘制三角形 WebGL入门教程(三)-webgl动画 颜色效果图: 操作步骤: 1.创建HTML5 canva ...
- WebGL入门教程(三)-webgl动画
前面文章: WebGL入门教程(一)-初识webgl WebGL入门教程(二)-webgl绘制三角形 WebGL动画有移动.旋转和缩放,我们将移动.旋转和缩放图形,然后将其绘制到屏幕上,称为变换(tr ...
- WebGL入门教程(二)-webgl绘制三角形
前面已经介绍过了webgl,WebGL入门教程(一)-初识webgl(http://www.cnblogs.com/bsman/p/6128447.html),也知道了如何绘制一个点,接下来就用web ...
- WebGL之通过外部传入a_PontSize值改变点着色器vshader内置变量gl_PointSize的值
最近分配到一个看起来非常简单的优化需求.通过地图上设置工具来改变地图上显示的点的大小和透明度.无非过程就是从控件面板获取到用户设置的值保存到数据库中.然后地图上画点的时候取出设置的值渲染出点即可.前端 ...
- 一篇文章理清WebGL绘制流程
转自:https://www.jianshu.com/p/e3d8a244f3d9 目录 初始化WebGL环境 顶点着色器(Vertex Shader)与片元着色器(Fragment Shader) ...
- 初识webgl--我的webgl学习第一课(基于threeJs)
一,我为什么要学习webgl 一个偶然的机会,在和朋友的聊天过程中,听说了webgl,也许过去也看到过,但是没有特别在意过.原来,JavaScript也可以很好的渲染并在网页上显示三维动画,不用借助插 ...
随机推荐
- HTTP 请求的组成 方法 已经 请求的状态码
HTTP请求是指从客户端到服务器端的请求消息. 包括:消息首行中,对资源的请求方法.资源的标识符及使用的协议.从客户端到服务器端的请求消息包括,消息首行中,对资源的请求方法.资源的标识符及使用的协议. ...
- HDU 1207 汉诺塔II (简单DP)
题意:中文题. 析:在没有第四个柱子时,把 n 个盘子搬到第 3 个柱子时,那么2 ^ n -1次,由于多了一根,不知道搬到第四个柱子多少根时是最优的, 所以 dp[i] 表示搬到第4个柱子 i 个盘 ...
- NYOJ8——一种排序
一种排序 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述:现在有很多长方形,每一个长方形都有一个编号,这个编号可以重复:还知道这个长方形的宽和长,编号.长.宽都是整数: ...
- sublime text3 注册码
—– BEGIN LICENSE —– TwitterInc 200 User License EA7E-890007 1D77F72E 390CDD93 4DCBA022 FAF60790 61AA ...
- PJzhang:lijiejie的敏感目录爆破工具BBScan
猫宁!!! 参考链接: https://www.freebuf.com/sectool/85729.html https://segmentfault.com/a/1190000014539449 这 ...
- c++计算程序时间
#include<iostream.h> #include<time.h> void main() { clock_t start,finish; double totalti ...
- MySQL varchar 最大长度,text 类型占用空间剖析
MySQL 表中行的最大大小为 65,534(实际行存储从第二个字节开始)字节.每个 BLOB 和 TEXT 列只占其中的 5 至 9 个字节. 那么来验证下 varchar 类型的实际最大长度: 测 ...
- 使用selesium和pytesseract识别验证码,达到登录网页目的
关于验证码问题,大多可以在网上了解到目前有四种解决方案:1.开发注释验证码2.开发开一个“后门”,设置一个万能码,输入万能码则通过3.通过cookies绕过验证码4.图形识别技术 前三种是比较快速也是 ...
- centos7上使用locate命令-文件查找
centos7上使用locate命令 小贴士:在centOS7以上的系统中使用“locate”文件查找命令,发现该命令不可用. 检查了下,原来是centos7默认没有安装该命令,在联网状态运行“y ...
- ssh公私密钥的生成
ssh密钥的生成 root账号密钥的生成: 这里我们切换到root账号下,执行ssh-keygen命令: ssh-keygen -t dsa 然后一路回车即可 """ [ ...