给自己打个小广告 《前端百题斩》pdf版已经更新完毕,内容包括JS基础篇、浏览器篇、网络篇,共计50个章节,5万多字,即将面试的小伙伴必备神器,欢迎关注“前端点线面”获取。

今天正值中国的传统节日——七夕节,在此祝所有有情人终成眷属。这个节日很美好,但是对于很多男士来说是一个煎熬的日子,毕竟礼物买不好轻则跪搓衣板,重则口袋空空,有同样困扰的我也不知道如何处理,最终搞了束玫瑰花给媳妇(如下),但是最终还是没有摆脱跪搓衣板这一酷刑(被人家嫌弃太程序员了,,Ծ‸Ծ,,)。

一、基础实现

Three.js将WebGL底层的图形接口进行封装,这样就无需掌握复杂的图形学和复杂的数学知识,提高开发效率,本次就漂亮的玫瑰就是利用Three.js实现整。为了利用Three.js将模型展示在浏览器中,需要结合渲染器、场景、相机、模型和光照等。Three.js创建流程如图所示,其创建流程包括以下几个步骤:

微信图片_20210814175743.png

为了方便看懂下面的代码,可以先下载本节所对应的代码包 (提取码6666)

1.1 获取Canvas节点

获取DOM树中的Canvas节点,该节点是图形绘制的容器,是最终展示三维模型的载体。

<div><canvas id="rose" width="500px" height="500px"></canvas>
</div>

1.2 设置渲染器

渲染器决定了场景中内容渲染的最终结果,通过设置渲染器,为后续的渲染工作起到了准备作用。

// 设置渲染器(为WebGLRenderer渲染器)
this.renderer = new THREE.WebGLRenderer({canvas,antialias: true // 抗锯齿
});
// 设置尺寸
this.renderer.setSize(canvasWidth, canvasHeight);
// 设置背景颜色
this.renderer.setClearColor(0x6495ED);

1.3 创建场景

场景就是一个很大的三维空间,类似于一个容器,是用于保存相机、光源和模型等对象的场所。

// 设置场景
this.scene = new THREE.Scene();

1.4 往场景内添加元素

将相机、模型、光照添加到场景中。相机是为了将三维空间中的模型映射到二维平面上,模型是最终希望在页面上呈现的物体,光照是为了增加更好的视觉体验,为整个场景增添真实感。

// 设置相机
this.camera = new THREE.PerspectiveCamera(60 ,canvasWidth / canvasHeight, 1,10000);
this.camera.position.set(800, 800, 800);
this.camera.lookAt(new THREE.Vector3(0, 0, 0));
this.scene.add(this.camera);// 添加光源
const pointLight = new THREE.PointLight(0xffffff, 1, 0);
pointLight.position.set(1000, 1000, 1000);
this.scene.add(pointLight);
const ambientLight = new THREE.AmbientLight(0x404040);
this.scene.add(ambientLight);// 添加模型
models.forEach(model =>{const {obj, position} = model;obj.position.set(...position);this.group.add(obj);this.scene.add(this.group);
});

注意:模型部分是通过加载器(OBJLoader+MTLLoader)加载的obj+mtl格式的文件,加载代码如下所示:

loadModule(model) {const {objUrl, mtlUrl} = model;let mtlLoader = new THREE.MTLLoader;let objLoader = new THREE.OBJLoader;return new Promise((resolve, reject) => {mtlLoader.load(mtlUrl, material =>{objLoader.setMaterials(material);objLoader.load(objUrl, obj =>{obj.traverse(child =>{if (child instanceof THREE.Mesh) {child.material.side = THREE.DoubleSide;}});model.obj = obj;resolve(model);});});});
}

1.5 渲染模型

通过调用渲染器的渲染函数将模型渲染到页面上进行展示。

this.renderer.render(this.scene, this.camera);

二、进阶

通过上述五个步骤就可以实现一个静态部分的玫瑰花了,但是并不能仅仅如此就完事了,还是要有一定精益求精的精神的,下面在原有基础上我们旋转渲染动效和轨道控制能力。

2.1 旋转动效

所谓旋转动效其实就是上面看到按照y坐标旋转的效果,其是怎么实现的呢?其实归结起来可以分为两个步骤:

  1. 利用requsetAnimationFrame进行循环调用渲染动作;

  2. 每次渲染时修改几何模型的y轴方向的角度。

Animate();
function Animate() {window.requestAnimationFrame(Animate);this.group.rotation.y += 0.01;this.renderer.render(self.scene, self.camera);
}

2.2 轨道控制能力

轨道控制使用了OrbitControls.js库,使摄像机可以围绕目标旋转,实现几何体的滚动、缩放、拖动等能力。

function useOribitControls(camera, renderDom) {const controls = new THREE.OrbitControls(camera, renderDom);controls.enableRotate = true;controls.rotateSpeed = 0.8;controls.enableZoom = true;controls.zoomSpeed = 1.2;controls.enableDamping = true;return controls;
}

然后通过在requestAnimationFrame总更新其控制实例即可

Animate();
function Animate() {window.requestAnimationFrame(Animate);this.controls.update();this.renderer.render(self.scene, self.camera);
}

1.如果觉得这篇文章还不错,来个分享、点赞、在看三连吧,让更多的人也看到~

2.关注公众号前端点线面,领取学习资料,定期为你推送原创深度好文

3. 《前端百题斩(上)》pdf版新鲜出炉,关注公众号回复“百题斩”获取。

[1] 五万字前端面试宝典——前端百题斩(上)新鲜出炉

七夕哄女朋友神器——送她一束玫瑰花相关推荐

  1. 七夕节,程序员们都怎么哄女朋友开心?

    大家好,马上就七夕节了,七夕节是牛郎织女鹊桥相会的相会的日子. 这篇文章的前提是,你得有个女朋友,没有就先收藏着吧! 一.七夕节的由来 七夕节的来源是梁山伯与祝英台的美丽传说,化成了一对蝴蝶~ 美丽的 ...

  2. Python制作哄女友神器,再也不怕女朋友生气了!

    哄女朋友最高的境界是什么? 除了用心之外,每天不重复的甜言蜜语必然是少不了的.虽然语文老师上学的时候也教了一些东西,但是日子长了必然"江郎才尽". 大家都是混科技圈的,借助自动化的 ...

  3. 七夕节马上要到了,前端工程师,后端工程师,算法工程师都怎么哄女朋友开心?

    这篇文章的前提是,你得有个女朋友,没有就先收藏着吧! 七夕节的来源是梁山伯与祝英台的美丽传说,化成了一对蝴蝶~ 美丽的神话!虽然现在一般是过214的情人节了,但是不得不说,古老的传统的文化遗产,还是要 ...

  4. ChatGPT 大智近妖,从宇宙人生到手搓光刻机,从哄女朋友到写年终总结我们聊得非常开心,反而让人越来越忧心...

    都说 ChatGPT 要干掉程序员,清理搜索引擎,取代Stack Overflow,还能消灭人类,这些有些言过其实了.ChatGPT 的定位是一个人工智能助理,它说,它的主要目的是通过回答用户的问题, ...

  5. GitHub 标星 6k,拿这个开源项目做个哄女友神器吧!

    本文转自大数据文摘,作者:诗风悠存.蒋宝尚 哄女朋友最高的境界是什么? 除了用心之外,每天不重复的甜言蜜语必然是少不了的.虽然语文老师上学的时候也教了一些东西,但是日子长了必然"江郎才尽&q ...

  6. 手把手教你用Python做一个哄女友神器,小白可上手

    大数据文摘出品 作者:诗风悠存.蒋宝尚 哄女朋友最高的境界是什么? 除了用心之外,每天不重复的甜言蜜语必然是少不了的.虽然语文老师上学的时候也教了一些东西,但是日子长了必然"江郎才尽&quo ...

  7. 顶级开发师教你用Python做一个哄女友神器,小白可上手

    哄女朋友最高的境界是什么? 除了用心之外,每天不重复的甜言蜜语必然是少不了的.虽然语文老师上学的时候也教了一些东西,但是日子长了必然"江郎才尽". 大家都是混科技圈的,借助自动化的 ...

  8. OSChina 周四乱弹 —— 我掌握了两千多种哄女朋友的方法了

    2019独角兽企业重金招聘Python工程师标准>>> Osc乱弹歌单(2018)请戳(这里) [今日歌曲] @胖达panda  :分享藤田恵美的单曲<Down By the ...

  9. 哄女朋友玩的c语言编程,在线教学:哄女朋友陪你玩游戏的真正秘诀

    原标题:在线教学:哄女朋友陪你玩游戏的真正秘诀 约稿. 大概,每个男生都试图哄过女朋友喜欢上打游戏吧? 不,不是各色萌萌的消除游戏.纸牌游戏.扫雷游戏. 而是大东西:动作.角色扮演.模拟.策略类. 我 ...

最新文章

  1. 在java中建个jsp文件_第一个jsp页面
  2. R语言可视化包ggplot2绘制线性回归模型曲线实战( Linear Regression Line)
  3. 谈服务发现的背景、架构以及落地方案
  4. python selenium 等待页面加载_python selenium 三种等待方式详解(实战常用)
  5. haproxy 作为反向代理被攻击
  6. windows挂载ext4_使用 UEFI 双启动 Windows 和 Linux | Linux 中国
  7. Android studio Github 断开连接
  8. 搭建亿级时间线数据的监控系统,我有绝招!
  9. MATLAB计算13195的约数,最大约数算法 | Delphi论坛 | Delphi Forum - We Delphi
  10. java使用水晶报表,java水晶报表实例教程
  11. 鼠标滚轮控制页面滚动(山寨苹果官网iPhone5s的滚屏动画实例)
  12. 1582年日历怎么了_1582年从10月5日到15日到底发生了什么?为何所有日历全是空白?...
  13. 天问:《三体》世界真的存在吗?(太阳系与银河系简介)
  14. python xlrd获取excel行数_Python 使用xlrd库读取excel,获取最大行和最大列等
  15. 实验吧 天网管理系统writeup
  16. Helicon Focus Pro(景深合成软件)官方中文版V7.6.6 | helicon focus中文版下载 | 含helicon focus使用方法
  17. 每日一库之Go 强大而灵活的电子邮件库:email
  18. Piggy-Bank
  19. 从左上角到右下角 棋盘问题_分治算法之棋盘问题
  20. Git - 从远程仓库中拉取指定分支到本地

热门文章

  1. 秦九昭算法——MATLAB实现
  2. 国内网络下的网络搭建调整细节(六)
  3. 【论文学习】行人检测——CVPR:通过MIMS在低分辨率图像中做行人检测
  4. 人脸识别人证比对技术SDK
  5. 时隔1年半的迭代产品,华为移动路由Pro评测:月享2000G流量
  6. 公路施工过程中作业重点和技术完善
  7. 杭州西湖|杭州西湖简介| 杭州西湖景点介绍| 杭州西湖十景| 杭州西湖图片
  8. 三菱PLC FX3U源码,原理图,PCB全套资料
  9. 一篇很好的关于创业的指导意见的文章
  10. 新用户创作打卡挑战赛正在进行中