webGL-three.js入门笔记

webGL-demo.gif

webGL的3D世界主要由三大要素构成:场景(scene)、相机(camera)和渲染器(renderer),三者缺一不可。渲染的原理是:我们将创建的物体,添加到场景中,再通过相机(可以理解为人的视角)渲染到渲染器,从而呈现在网页中。three.js是webGL一款比较热门的类库,本文以"three.js": "^0.77.1"为例,通过网上教程和自身实践整理成这篇笔记。

1.场景(scene)
场景就是所有物体的容器,只需创建一个。假设我们要显示一个苹果,那么就将苹果加入到场景中即可,多个物体可加入到一个场景。
构造函数:

var scene = new THREE.Scene();

2.相机(camera)
相机决定了场景中哪个角度的景色会显示出来,就像人的视角,分为正投影相机(THREE.OrthographicCamera)和透视投影相机(THREE.PerspectiveCamera),正投影和透视投影的区别是:透视投影有一个基本点,就是远处的物体比近处的物体小,一般我们采用透视投影相机的情况比较多。
构造函数:

//正投影相机
var camera = new THREE.OrthographicCamera(left, right, top, bottom, near, far);
//参数详解:
//left:左平面距离相机中心点的垂直距离
//right:右平面距离相机中心点的垂直距离
//top:顶平面距离相机中心点的垂直距离
//bottom:底平面距离相机中心点的垂直距离
//near:近平面距离相机中心点的垂直距离
//far:远平面距离相机中心点的垂直距离
//透视投影相机
var camera = new THREE.PerspectiveCamera(fov, aspect, near, far)
//参数详解:
//视角fov:可以理解为视角的大小,如果设置为0,相当于没有了视角,什么也看不到;如果为180,那么可以认为你的视界很广阔,但在180度的时候,往往物体很小,因为物体在你整个可视区域中的比例变小了
//近平面near:表示近处的裁面的距离,也可以认为是眼睛到近处的距离,不能为负数
//远平面far:表示远处的裁面的距离
//纵横比aspect:实际窗口的纵横比,即宽度除以高度,这个值越大,说明宽度越大

3.渲染器(renderer)
渲染器决定了渲染结果应挂接在页面的什么元素上,并以怎样的方式绘制。
构造函数:

var renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);//设置渲染区域大小
document.body.appendChild(renderer, domElement);//渲染在domElement并挂接到body下
renderer.render(scene, camera); //将场景通过相机视角渲染出来

如果要让物体动起来,那么我们可以利用循环渲染:requestAnimationFrame

4.光源
光是我们看见物体的关键,用Light表示,是所有光源的基类,底下还有很多分类,我举几个最常用的:

环境光:环境光是经过多次反射惹来的光,无法确定其最初的方向,是一种无处不在的光。环境光源放出的光线被认为来自任何方向。因此,当你仅为场景设定环境光时,所有的物体无论法向量如何,都将表现为同样的明暗程度。
构造函数:

THREE.AmbientLight(hex); //hex为一个16进制的颜色值

平行光:是一组没有衰减的平行的光线,类似太阳光的效果

THREE.DirectionalLight(hex, intensity)

点光源:由这种光源放出的光线来自同一点,且方向辐射自四面八方

THREE.PointLight(color, intensity, distance);
//color代表光的颜色
//intensity:代表光的强度,默认1.0,表示100%强度的灯光
//distance:代表光的距离,从光源所在的位置,经过distance这段距离之后,光的强度将从Intensity衰减为0,默认0.0,表示光源强度不衰减

聚光灯:这种光源的光线从一个椎体中射出,在被照射的物体上产生聚光的效果

THREE.SpotLight(hex, intensity, distance, angle, exponent)
//angle:聚光灯着色的角度,用弧度作为单位,这个角度是和光源的方向形成的角度
//exponent:光源模型中,衰减的一个参数,越大衰减越快

5.物体
创建一个物体可以包含多种元素,几何体,材质,纹理等,创建一个小球的简单示例:

let geometry =new THREE.SphereGeometry(3, 16, 16);   //球体
let material = new THREE.MeshPhongMaterial({color:0x48D1CC,specular:0xffffff,shininess:100});     //材质
var ball = new THREE.Mesh(geometry, material); //两者共同组成一个球体
scene.add(ball); //将球体添加至场景中

关于几何体,材质等种类非常多,具体可以参考[three.js源码]:https://github.com/mrdoob/three.js/

6.动画
总结上述步骤:

创建场景、相机、渲染器
创建光源
创建物体并添加至场景中
渲染出场景

这样就构成了一个完整的但也是最基础的流程,网页中能看到我们创造的物体,接下来说到动画,3D世界中的运动方式总结为三种:移动,旋转和缩放。
运动是相对的,场景动起来有两种方式:
1). 物体在坐标系中移动,相机不动

function animate(){
  ball.position.x += 1;
  renderer.render(scene, camera);
  requestAnimationFrame(animation);
}

2). 相机在坐标系中移动,物体不动

function animate(){
  camera.position.x += 1;
  renderer.render(scene, camera);
  requestAnimationFrame(animation);
}

[demo展示中心]:https://yomonah.github.io/project/app.html#/webGL-icosahedron
[源码]:https://github.com/yomonah/react-demo/tree/master/src/components/webGL_ball

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,529评论 5 475
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,015评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,409评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,385评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,387评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,466评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,880评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,528评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,727评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,528评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,602评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,302评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,873评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,890评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,132评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,777评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,310评论 2 342

推荐阅读更多精彩内容

  • 本文主要是讲解 Three.js 的相关概念,帮助大家对 Three.js 以及相关知识形成比较完整的理解。今年来...
    Simon王小白阅读 8,428评论 2 9
  • 之前用qunee做了一个2.5d的机房监控,丑的闪瞎我的卡姿兰大眼,后来含泪用three.js做个3d的换...
    我得有妖气阅读 1,578评论 1 2
  • 385张定金单,离目标差一点点,不过已经很完美,睡觉了。明天有活了。
    罗召伟阅读 193评论 1 5
  • 看到这个题目,大家可能都知道,这一期的写作群又要接近尾声了。 今天想说的是,如果没有人喝彩,你还会坚持写下去么? ...
    文晓玲阅读 346评论 14 14
  • 苍翠的野地上一座石橋。 一個孩子站着。他望着流水。 遠處:一匹马,背拖善一抹夕陽。 它静静地飲水, 鬃毛散落在河中...
    东丰林波阅读 141评论 0 1