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

简介: 七夕哄女朋友神器——送她一束玫瑰花

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

640.gif

一、基础实现



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

640.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);
}



相关文章
|
10月前
|
自然语言处理 IDE 测试技术
通义灵码——有了它让我的编程效率和质量直线上升!
作为一名大数据开发工程师,我每天与代码和数据打交道,享受解决复杂问题的乐趣。最近,我遇到了一位超级“码”力助手——通义灵码。它不仅是一个简单的代码补全工具,更像是一个拥有高度智慧的编程伙伴,能够理解我的编程意图,给出最合适的建议,大大提升了我的工作效率和编程体验。本文将分享如何在VsCode中安装和使用通义灵码,以及它在我的实际编程工作中发挥的重要作用。
|
12月前
|
数据可视化 Java Windows
Elasticsearch入门-环境安装ES和Kibana以及ES-Head可视化插件和浏览器插件es-client
本文介绍了如何在Windows环境下安装Elasticsearch(ES)、Elasticsearch Head可视化插件和Kibana,以及如何配置ES的跨域问题,确保Kibana能够连接到ES集群,并提供了安装过程中可能遇到的问题及其解决方案。
Elasticsearch入门-环境安装ES和Kibana以及ES-Head可视化插件和浏览器插件es-client
|
缓存 运维 关系型数据库
PolarDB产品使用问题之如何进行PolarDBX的本地部署
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
9月前
|
人工智能 容器
三句话开发一个刮刮乐小游戏!暖ta一整个冬天!
本文介绍了如何利用千问开发一款情侣刮刮乐小游戏,通过三步简单指令实现从单个功能到整体框架,再到多端优化的过程,旨在为生活增添乐趣,促进情感交流。在线体验地址已提供,鼓励读者动手尝试,探索编程与AI结合的无限可能。
三句话开发一个刮刮乐小游戏!暖ta一整个冬天!
|
10月前
|
SQL 数据可视化 关系型数据库
开源低代码平台推荐!10款优秀的开源低代码平台!
本文介绍了10款免费开源低代码开发平台,包括JeeLowCode、Ample、WaveMaker、JeecgBoot、Jabdp、华炎魔方、NocoBase、Appsmith、NodeRED和Budibase。这些平台通过减少代码编写量,提供灵活的开发工具,支持企业快速构建应用,满足不同开发需求和应用场景。文章详细列出了各平台的核心特点、适用场景及推荐指数,为企业选择最适合的开发工具提供了全面指导。
|
11月前
|
人工智能 JSON 数据格式
Dify开发工作流
这篇文章详细介绍了如何使用Dify平台进行工作流的创建与配置,包括设置变量、条件分支以及集成不同工具和服务来自动化任务处理流程。
3189 1
Dify开发工作流
|
11月前
|
前端开发 JavaScript 编译器
2024最新VSCode实用插件推荐,开发效率遥遥领先!超全面,快收藏~
【10月更文挑战第11天】2024最新VSCode实用插件推荐,开发效率遥遥领先!超全面,快收藏~
2196 0
2024最新VSCode实用插件推荐,开发效率遥遥领先!超全面,快收藏~
|
JSON 前端开发 数据格式
@RequestBody、@RequestParm、@PathVariable三个注解的区别
@RequestBody、@RequestParm、@PathVariable三个注解的区别
794 2
|
并行计算 安全 Java
Java Lambda表达式:原理、应用与深入解析
Java Lambda表达式:原理、应用与深入解析
490 1
|
人工智能 Java
通过okhttp调用SSE流式接口,并将消息返回给客户端
通过okhttp调用SSE流式接口,并将消息返回给客户端