WebGL入门demo

WebGL入门demo

three.js入门

开场白

哇哦,绘制气球耶,在网页上?对啊!厉害了!3D效果图也能在网页上绘制出来啊,这么好玩的事情,赶紧来看看!

这里是属于WebGL的应用,webGL可以让我们在canvas上实现3D效果。而three.js是一款webGL框架,由于其易用性被广泛应用。如果要学习webGL,抛弃那些复杂的原生接口从这款框架入手是一个不错的选择。跟着我一起走!

👉:three.js参考文档 英文

👉:three.js参考文档 中文

看地球咯!

哈哈,别说了。先看地球:

GIF1.gif

怎么画?

首先要理清逻辑。three.js框架是个法宝,要画东西的工具,模块,材料等等里面都有,找到API去用。所以,我们只需要:

  • 一张图片,也就是包裹地球身体的那张图片,
  • 一个球模型,
  • 把图片贴到球模型上去,地球就出来了,
  • 再给球加上一些动画效果,完工!

开始画!

上面讲完了画的大致流程,现在要开始画了。但是你还需要知道,不止这么简单!远不止这么简单!你需要:

1.设置three.js渲染器-renderer

2.设置摄像机camera

3.设置场景scene br>

4.设置物体object-地球

5.设置组织者

是不是一脸懵逼?别怕,来讲个故事😁

其实,就是拍电影啦。需要相机,演员(这里是地球),场景(scene),导演(group)。导演组织这些活动,导演也要看场景的,他受场景的约束,演员也要听导演的。最后拍好了戏交给渲染器(renderer)来制片,发布。

好吧,这么形象估计懂了,来,我们具体来讲讲。

一步步画:

每个元素都是再定义了之后,在初始化函数内部执行。

做准备:

用到three.js框架,要先引入以下:

<script src="https://threejs.org/build/three.js"></script>
<script src="https://threejs.org/examples/js/renderers/Projector.js"></script>
<script src="https://threejs.org/examples/js/renderers/CanvasRenderer.js"></script>
<script src="https://threejs.org/examples/js/libs/stats.min.js"></script>

画地球:

看代码:

// 加载材质
var loader = new THREE.TextureLoader();
    loader.load('https://threejs.org/examples/textures/land_ocean_ice_cloud_2048.jpg',
     function(texture) {
        //画球体 形状
        var geometry = new THREE.SphereGeometry(200, 20, 20);
        // 贴图 材质纹理
        var material = new THREE.MeshBasicMaterial({
            map: texture,
            overdraw: 0.5
        })
        // 地球
        var mesh = new THREE.Mesh(geometry, material);
        group.add(mesh);
        }

画地球需要地球外面那张图片,还需要球模型geometry。图片需要裁剪之后变成material。再用这两个元素来new地球mesh,把地球交给group.

设置场景:

var scene;
scene = new THREE.Scene();
scene.add(group);

设置分组(导演):

var group;
group = new THREE.Group();

设置相机:

var camera;
// 准备好镜头
    camera = new THREE.PerspectiveCamera(60, window.innerWidth/window.innerHeight,1,2000);//相机摆上 设置相机摆放位置 产生镜头
    camera.position.z = 500;//拍的景物离我500px

先设置一下相机,把他放到里面去。

设置渲染器:

var renderer;
renderer = new THREE.CanvasRenderer();
        renderer.setClearColor(0xffffff);//设置canvas背景颜色
        renderer.setPixelRatio(window.devicePixelRatio);
        renderer.setSize(window.innerWidth, window.innerHeight);//container展示的大小
        container.appendChild(renderer.domElement)//追加 【canvas】 元素到 【container】 元素中
        stats = new Stats();
        container.appendChild(stats.dom);

先设置一下渲染器,设置在画布上面显示的属性,再把画布添加到浏览器页面上面去。还有在动画过程中的循环渲染在下面讲解。

加动画啦!

var container,stas;
var mouseX=0,mouseY=0;
var windowHalfX=window.innerWidth/2;
var windowHalfY=window.innerHeight/2;
animate();
document.addEventListener('mousemove', onDocumentMouseMove, false);//用鼠标拖
window.addEventListener('resize',onWindowResize,false);

function onDocumentMouseMove (event) {
    mouseX = event.clientX - windowHalfX;//鼠标基于中心点的偏移量;
    mouseY = event.clientY - windowHalfY;//鼠标基于中心点的偏移量;
}

function onWindowResize (event) {
    windowHalfX = window.innerWidth / 2;
    windowHalfY = window.innerHeight / 2;
    camera.aspect = window.innerWidth / window.innerHeight;
    camera.updateProjectionMatrix();
    renderer.setSize(window.innerWidth,window.innerHeight);
}

function animate () {
// 每秒60针递归调用 使地球旋转
    requestAnimationFrame(animate);
    render();
    stats.update();
}
function render () {
    camera.position.x
     += (mouseX-camera.position.x)*0.05;//在x轴上,相机根据鼠标的位置移动来移动的距离
    camera.position.y 
    += (-mouseY - camera.position.y)*0.05;//在y轴上,相机根据鼠标的位置移动来移动的距离
    camera.lookAt(scene.position);//设置视野的中心坐标
    group.rotation.y -= 0.005;//让它饶着y轴旋转 (间接的得到旋转的速度)
    renderer.render(scene, camera);//将webgl视图往外输出
}

设置在鼠标动的时候监听到,而且此时camera随即改变而改变。camera要改变根据鼠标的移动来移动它的距离在函数onDocumentMouseMove中得到,而且地球要有一种远小近大的感觉。随着鼠标移动,camera变化,地球的大小也在改变,也就是前面说的远小近大的感觉。在函数onWindowResize中实现。然后地球要动画起来要调用animate函数,每秒60针递归调用 使地球旋转,然后render函数就一直在不停的循环。状态也在不停的更新。

小结:

WebGL是是一种3D绘图标准,这种绘图技术里面用了JavaScript,所以会JavaScript,走遍天下都不怕啊😄

👉:源码

思考好逻辑,就可以动手的!好玩就要去尝试,就在慢慢成长。大家共同进步吧!

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

推荐阅读更多精彩内容

  • 本文主要是讲解 Three.js 的相关概念,帮助大家对 Three.js 以及相关知识形成比较完整的理解。今年来...
    Simon王小白阅读 8,440评论 2 9
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,832评论 25 707
  • 人其实挺奇怪的,有的时候明明不喜欢做一件事但是却也碍于情面勉强做了,心中抱怨着,嘴里却说“没关系啊不客气啊咱俩啥关...
    溯沼沧沧阅读 201评论 0 0
  • 我知道我快死了,就在不久后的某天,也许就在今晚,我的牙齿很脆,我的皮肤也是脆的,我的胃从未有过的舒服,还有,我嘎嘣...
    碧落_7113阅读 353评论 0 2