webgl对数学要求高吗(webgl难学吗)
WebGL之绘制三维地球
通过Three.js也许可以很方便的展示出3D模型,但是你知道它是怎么一步一步从构建网格到贴图到最终渲染出3D模型的吗?现在我们直接使用底层的webgl加上一点点的数学知识就可以实现它。
本节实现的效果: WebGL三维地球
内容大纲
首先我们要建立球体的三维模型,三维网格模型包括如下属性(不熟悉请复习webgl教程):
最后要构建出如下所示的经纬球模型
首先可以从xy平面构建圆形,接着再从xz平面将圆形转化为圆球,这其中只需使用到三角函数而已,是不是非常简单。
下面就是构建网格模型的基本逻辑:
和普通着色器相比,只是增加了uv坐标,uv直接通过顶点着色器差值透传到片段着色器即可,在片段着色器使用texture2D函数获取uv坐标对应的颜色,整体上也是比较基础。
最后实现部分就和之前的webgl基本逻辑一致,不过要准备好地球贴图
图片加载完将构建好的贴图sampler传入着色器即可,其他都是基础业务逻辑,不再详述,这样我们就将三维地球实现了
学习web前端开发,一定要会计算机专业知识吗
这里说的『高大上』的专业课,主要指算法、数据结构、操作系统、编译原理、线性结构、离散数学等等。对于大学不是计算机专业,但以后想要从事前端开发工作的同学来说,这些『高大上』的计算机专业课是否有必要花时间去了解呢?
观点一:
如果你只希望做一个普通的码页面的前端,一点一点的积累一些经验和技巧以谋求生活,那么是不需要的。
如果你热爱代码,热爱前端,希望让自己的工作越来越有趣,越来越有意义,那么非常有用的。
随着时代的变革,前端的职能已经不仅仅只是简单的切图制作页面了。前端工程师的职能也开始越大越全越深入,而且前端技术的发展也迫使我们需要有更高的职业素养。这个时候的前端工程师,首先,是一名工程师。
要学习这些基础课程的原因有三点:
前端的职能在发生转变,我们需要应对桌面端web,桌面端应用,移动端web,hybrid,node应用等等不同的挑战。虽然说这些可能是可以继续细分下去的,但是我觉得作为一个称职的前端,理应有可以自己掌控这些知识的能力。
前端的技术,工具发展速度极快。例如我们现在常用的babel,eslint,如果你想自己写一些loader,plugin,是不是需要一些编译原理相关的知识?常用的node,如果不了解服务器端开发,那么写出来的代码一定非常糟糕。至于webgl之类的就更不用说了。
高新技术的门槛的不断下降。在过去,图像识别,机器学习等的门槛都相对较高,但是在现在,完善的工具库已经给了普罗大众一个非常低的使用门槛。而随之而来的,就是别的技术对于这些技术的低成本应用。你是否有考虑过用图像识别来做一定程度的界面生成或者测试?或者机器学习对于前端的应用。这些都是令人兴奋的场景。
观点二:
『基础决定你可能达到的高度,而业务决定了你的最低瓶颈』,两者不可偏废。
前端的发展非常快,以至于你今天关注的新东西,明年再看可能就截然不同甚至被废弃了。所以保持高的学习力来应对这种变化非常重要。高的学习力在很大程度上和你的计算机基础紧密相关(先抛开智力等不可抗因素)。
现在纯前端范畴里还几乎没有出现新创的知识领域。但是反过来说,从来没有一个领域有Web前端这么飞速发展,不断的有在旧知识体系在它上面重演。我记得有一句名言大概是这个意思:所有东西都会用js实现一遍。 我现在深以为然。 我相信在很多人也看出来了,前端这些年看似发展的非常蓬勃,但其实并没有太多新鲜的东西,一切都是重演。计算机基础是以不变应万变的秘诀。现在的前端现在已经不再需要『我会写java后台代码』等等愚蠢的强调来站直腰板了,成熟的公司已经开始重视前端带来的实际价值,。所以前端本身当然不能固步自封,巩固计算机基础,用以灵活应用到日常业务,用以吸收新鲜技术,也就是自然而然的事情。
总结:
你应该学什么知识,会用到什么知识,几乎只和你做的工作有关。
如果你目的是成为基础扎实,技能门槛很高(甚至无所不能)的工程师,那么学那些没什么不好的,甚至是必须的。
但如果你就是想做个discuz、百度贴吧、淘宝、支付宝的前端,那么投入那些就不一定真的划算了。
另一方面,在学好目标技能,感觉很难进展的情况下,学习更深更广的领域,不失为一条突破瓶颈的好办法。前提是,你真属于那10%甚至1%。
ThreeJS简介
近年来web得到了快速的发展。随着HTML5的普及,网页的表现能力越来越强大。网页上已经可以做出很多复杂的动画,精美的效果。 但是,人总是贪的。那么,在此之上还能做什么呢?其中一种就是通过WebGL在网页中绘制高性能的3D图形。
OpenGL 它是最常用的跨平台图形库。
WebGL 是基于 OpenGL 设计的面向web的图形标准,提供了一系列JavaScript API,通过这些API进行图形渲染将得以利用图形硬件从而获得较高性能。
而 Three.js 是通过对 WebGL 接口的封装与简化而形成的一个易用的图形库。
简单点的说法 threejs=three + js ,three表示3D的意思,js表示javascript的意思。那么合起来,three.js就是使用javascript 来写3D程序的意思。而javascript的计算能力因为google的V8引 擎得到了迅猛的增强,做3D程序,做服务器都没有问题。
WebGL 门槛相对较高,需要相对较多的数学知识(线性代数、解析几何)。因此,想要短时间上手 WebGL 还是挺有难度的。 Three.js 对 WebGL 提供的接口进行了非常好的封装,简化了很多细节,大大降低了学习成本。并且,几乎没有损失 WebGL 的灵活性。
因此,从 Three.js入 手是值得推荐的,这可以让你在较短的学习后就能面对大部分需求场景。
Three.js 的入门是相对简单的,但是当我们真的去学的时候,会发现一个很尴尬的问题:相关的学习资料很少。
通常这种流行的库都有很完善的文档,很多时候跟着官方的文档或官方的入门教程学习就是最好的路线。但Three不是的,它的文档对初学者来说太过简明扼要。
不过官方提供了非常丰富的examples,几乎所有你需要的用法都在某个example中有所体现。但这些example不太适合用来入门,倒是适合入门之后的进一步学习。
这里推荐一些相对较好的教程:
当然,实际的学习过程中这些资料肯定是不太够的,遇到问题还是要自己去查资料。不过这里要提醒一下,Three.js的更新是相当频繁的,现在是r80版本,自2010年4月发布r1以来,这已经是第72个版本了(中间有的版本号跳过了)。因此,在网上找到的资料有些可能是不适合当前版本的,需要注意甄别(前面推荐的资料也都或多或少存在这样的问题)。
要在屏幕上展示3D图形,思路大体上都是这样的:
1、构建一个三维空间
Three中称之为场景(Scene)
2、选择一个观察点,并确定观察方向/角度等
Three中称之为相机(Camera)
3、在场景中添加供观察的物体
Three中的物体有很多种,包括Mesh,Line,Points等,它们都继承自Object3D类
4、将观察到的场景渲染到屏幕上的指定区域
Three中使用Renderer完成这一工作
场景是所有物体的容器,也对应着我们创建的三维世界。
Camera是三维世界中的观察者,为了观察这个世界,首先我们要描述空间中的位置。 Three中使用采用常见的右手坐标系定位。
Three中的相机有两种,分别是正投影相机THREE.OrthographicCamera和透视投影相机THREE.PerspectiveCamera。
这里补充一个视景体的概念:视景体是一个几何体,只有视景体内的物体才会被我们看到,视景体之外的物体将被裁剪掉。这是为了去除不必要的运算。
正交投影相机的视景体是一个长方体,OrthographicCamera的构造函数是这样的:
Camera本身可以看作是一个点,left则表示左平面在左右方向上与Camera的距离。另外几个参数同理。于是六个参数分别定义了视景体六个面的位置。
可以近似地认为,视景体里的物体平行投影到近平面上,然后近平面上的图像被渲染到屏幕上。
2)透视投影相机
fov对应着图中的视角,是上下两面的夹角。aspect是近平面的宽高比。在加上近平面距离near,远平面距离far,就可以唯一确定这个视景体了。
透视投影相机很符合我们通常的看东西的感觉,因此大多数情况下我们都是用透视投影相机展示3D效果。
有了相机,总要看点什么吧?在场景中添加一些物体吧。
Three中供显示的物体有很多,它们都继承自Object3D类,这里我们主要看一下Mesh和Points两种。
1)Mesh
我们都知道,计算机的世界里,一条弧线是由有限个点构成的有限条线段连接得到的。线段很多时,看起来就是一条平滑的弧线了。
计算机中的三维模型也是类似的,普遍的做法是用三角形组成的网格来描述,我们把这种模型称之为Mesh模型。
geometry是它的形状,material是它的材质。
不止是Mesh,创建很多物体都要用到这两个属性。下面我们来看看这两个重要的属性。
2)Geometry
Geometry,形状,相当直观。Geometry通过存储模型用到的点集和点间关系(哪些点构成一个三角形)来达到描述物体形状的目的。
Three提供了立方体(其实是长方体)、平面(其实是长方形)、球体、圆形、圆柱、圆台等许多基本形状;
你也可以通过自己定义每个点的位置来构造形状;
对于比较复杂的形状,我们还可以通过外部的模型文件导入。
3)Material
Material,材质,这就没有形状那么直观了。
材质其实是物体表面除了形状以为所有可视属性的集合,例如色彩、纹理、光滑度、透明度、反射率、折射率、发光度。
这里讲一下材质(Material)、贴图(Map)和纹理(Texture)的关系。
材质上面已经提到了,它包括了贴图以及其它。
贴图其实是‘贴’和‘图’,它包括了图片和图片应当贴到什么位置。
纹理嘛,其实就是‘图’了。
Three提供了多种材质可供选择,能够自由地选择漫反射/镜面反射等材质。
4)Points
讲完了Mesh,我们来看看另一种Object——Points。
Points其实就是一堆点的集合,它在之前很长时间都被称为ParticleSystem(粒子系统),r68版本时更名为PointCloud,r72版本时才更名为Points。更名主要是因为,Mr.doob认为,粒子系统应当是包括粒子和相关的物理特性的处理的一套完整体系,而Three中的Points简单得多。因此最终这个类被命名为Points。
5)Light
神说:要有光!
光影效果是让画面丰富的重要因素。
Three提供了包括环境光AmbientLight、点光源PointLight、 聚光灯SpotLight、方向光DirectionalLight、半球光HemisphereLight等多种光源。
只要在场景中添加需要的光源就好了。
6)Renderer
在场景中建立了各种物体,也有了光,还有观察物体的相机,是时候把看到的东西渲染到屏幕上了。这就是Render做的事情了。
Renderer绑定一个canvas对象,并可以设置大小,默认背景颜色等属性。
调用Renderer的render函数,传入scene和camera,就可以把图像渲染到canvas中了。
现在,一个静态的画面已经可以得到了,怎么才能让它动起来?
很简单的想法,改变场景中object的位置啊角度啊各种属性,然后重新调用render函数渲染就好了。
那么重新渲染的时机怎么确定?
HTML5为我们提供了requestAnimFrame,它会自动在每次页面重绘前调用传入的函数。
如果我们一开始这样渲染:
只需要改成这样:
object就可以动起来了!
下面我们用一个简单的例子来梳理一下这个过程。
首先写一个有Canvas元素的页面吧。
下面来做Javascript的部分
首先初始化Renderer
初始化场景:
初始化相机:
要唯一确定一个相机的位置与方向,position、up、lookAt三个属性是缺一不可的。
这里我们创建了一个正交投影相机,这里我将视景体大小与屏幕分辨率保持一致只是为了方便,这样坐标系中的一个单位长度就对应屏幕的一个像素了。
我们将相机放在Z轴上,面向坐标原点,相机的上方向为Y轴方向,注意up的方向和lookAt的方向必然是垂直的(类比自己的头就知道了)。
下面添加一个立方体到场景中:
注意我们使用了法向材质 MeshNormalMaterial ,这样立方体每个面的颜色与这个面对着的方向是相关的,更便于观察/调试。
在这个简单的demo里我不打算添加光影效果,而法向材质对光也是没有反应的。 最后来创建一个动画循环吧
每次重绘都让这个立方体转动一点点。 当页面加载好时,调用前面这些函数就好了。
WebGL中文网 强烈推荐!!
WebGL中文教程网
在学JavaScript,webGL是什么东西,有用吗?
webgl是一种3d图形编程语言,基于html5平台,可以用于制作生动的3d游戏。编写者同时也做好具有opengl es语言的编程基础和数学图形学基础。但是也可以使用babylon.js等有用的框架已减少代码量
数学很差可以学webgl吗
数学很差不建议学webg。其中的算法要用到很多且复杂的数学知识。