从零开始搭建开源智慧城市项目(六)飞线,飞点。

前言

上一节实现了天空盒、扩散墙、扩散圆,这一节来添加飞线,飞点。

思路

主要思路是通过两个点和高度创建贝塞尔曲线,然后把该曲线的点构造成MeshLine(这个插件可以生成有宽度的线),然后把想要效果的图贴到线上。

  • 飞点:

    image.png

image.png

  • 飞线

image.png

image.png

这里用到了别人写的MeshLine插件(github.com/spite/THREE… ),对这个代码做了一点点修改,可进行模型材质的uv移动(THREE高版本有问题,我这边用的是127版本没有问题)。

image.png

这个修改是借鉴的deckgl(deck.gl/ )具体的修改就是把UV偏移量传进去实现偏移。

代码

import * as THREE from 'three';
import { Geometry } from 'three/examples/jsm/deprecated/Geometry';
import { MeshLine, MeshLineMaterial } from './THREE.MeshLine';THREE.Geometry = Geometry;
/*** 波纹散射图层* @param  options.img 照片地址* @param  options.lineWidth 线宽度* @param  options.side 贴图样式* @param  options.camera 相机* @param  options.height 高度* @param  options.v0 点一* @param  options.v1 点二* @param  options.speed 流动速度* @param  options.el 节目场景元素* @param  options.type 线类型分run和top* @param  options.maxheight 当类型为top时最高上升高度* @param  options.line 存储线* @param  options.thing 存储setInterval事件* @example*/
class RunLine {constructor(option) {this.img = option.img || '';this.lineWidth = option.lineWidth || 1;this.side = option.side || THREE.FrontSide;this.camera = option.camera || '';this.height = option.height || 100;this.v0 = option.v0 || new THREE.Vector3(0, 0, 0);this.v1 = option.v1 || new THREE.Vector3(0, 0, 0);this.speed = option.speed / 100 || 0.01;this.el = option.el || '';this.scene = option.scene || '';this.type = option.type || 'run';this.maxheight = option.maxheight || 300;this.line = '';this.thing = '';this.creatline();}creatline() {const textureLoader = new THREE.TextureLoader();textureLoader.load(this.img, (texture) => {this.texture = texture;this.texture.anisotropy = 16;this.texture.wrapS = THREE.RepeatWrapping; // 每个都重复this.texture.wrapT = THREE.RepeatWrapping;const resolution = new THREE.Vector2(this.el.offsetWidth, this.el.offsetHeight);const material1 = new MeshLineMaterial({color: '',map: this.texture,useMap: true,lineWidth: this.lineWidth,resolution,dashArray: 0, // 破折号之间的长度和间距。(0 -无破折号)dashRatio: 0.7, // 定义可见和不可见之间的比率(0 -更可见,1 -更不可见)。dashOffset: 1,transparent: true,sizeAttenuation: 1, // 使线宽不变,不管距离(1个单位是屏幕上的1px)(0 -衰减,1 -不衰减)side: THREE.FrontSide,depthTest: false,blending: THREE.AdditiveBlending,near: this.camera.near,far: this.camera.far,});this.line = this.createAnimateLine({kind: 'sphere', // 默认不填 为普通 ; 如为sphere,则表示球面建点type: 'line', // 默认不填 为MeshLine ; 如为pipe,则表示管道线sphereHeightPointsArgs: [this.v0, this.v1],material: material1,number: 50,radius: 3, // 默认});if (this.type === 'run') {this.line1 = this.createAnimateLine({kind: 'sphere', // 默认不填 为普通 ; 如为sphere,则表示球面建点type: 'line', // 默认不填 为MeshLine ; 如为pipe,则表示管道线sphereHeightPointsArgs: [this.v0, this.v1],material: material1,number: 50,radius: 3, // 默认});}this.scene.add(this.line);this.scene.add(this.line1);const { speed } = this;if (this.type === 'run') {this.thing = setInterval(() => {this.line.material.uniforms.offset.value.x -= speed;this.line1.material.uniforms.offset.value.x -= speed;}, 30);} else if (this.type === 'top') {this.thing = setInterval(() => {if (this.line.position.y < this.maxheight) {this.line.position.y += this.speed * 100;} else {this.line.position.y = 0;}}, 30);}});}createAnimateLine(option) {let curve;if (option.kind === 'sphere') {// 由两点之间连线成贝塞尔曲线const { sphereHeightPointsArgs } = option;const vX = (sphereHeightPointsArgs[1].x + sphereHeightPointsArgs[0].x) / 2;const vZ = (sphereHeightPointsArgs[1].z + sphereHeightPointsArgs[0].z) / 2;if (this.type === 'run') {curve = new THREE.CubicBezierCurve3(sphereHeightPointsArgs[0],new THREE.Vector3(vX, this.height, vZ),new THREE.Vector3(vX, this.height, vZ),sphereHeightPointsArgs[1],);} else {curve = new THREE.CubicBezierCurve3(sphereHeightPointsArgs[0],new THREE.Vector3(vX, this.height, vZ),new THREE.Vector3(vX, this.height, vZ),sphereHeightPointsArgs[1],);}}if (option.type === 'line') {const geo = new THREE.Geometry();geo.setFromPoints(curve.getPoints(100));// const geo = new Geometry();// geo.vertices = option.sphereHeightPointsArgs;const meshLine = new MeshLine();meshLine.setGeometry(geo);return new THREE.Mesh(meshLine.geometry, option.material);} // 使用 meshLinereturn '';}delete() {if (this.line) {this.scene.remove(this.line);this.scene.remove(this.line1);}if (this.thing) {clearInterval(this.thing);}}
}export default RunLine;

调用代码

 this.runline5 = new RunLine({img: "n.png",camera: camera,height: 140,v0: new THREE.Vector3(614, 18, 130),v1: new THREE.Vector3(-17.5, 111.5, -23),el: document.getElementById("scene"),scene: scene,speed: 1,lineWidth: 12,type: "run",});

效果图

完整项目源码获取:关注公众号「码农园区」,回复 【智慧城市】,即可获取完整项目源

附送250套精选项目源码

源码截图

 源码获取:关注公众号「码农园区」,回复 【源码】,即可获取全套源码下载链接

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1451138.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Introducing Index-1.9B

简介 大家好&#xff0c;今天我们很高兴首次发布Index系列模型中的轻量版本&#xff1a;Index-1.9B系列 本次开源的Index-1.9B 系列包含以下模型&#xff1a; Index-1.9B base : 基座模型&#xff0c;具有 19亿 非词嵌入参数量&#xff0c;在2.8T 中英文为主的语料上预训练&…

flutter开发实战-创建一个微光加载效果

flutter开发实战-创建一个微光加载效果 当加载数据的时候&#xff0c;loading是必不可少的。从用户体验&#xff08;UX&#xff09;的角度来看&#xff0c;最重要的是向用户展示加载正在进行。向用户传达数据正在加载的一种流行方法是在与正在加载的内容类型近似的形状上显示带…

Android Room数据库使用介绍

1.简介 Room是Google提供的Android架构组件之一&#xff0c;旨在简化数据库操作。它是SQLite的一个抽象层&#xff0c;提供了更易用和安全的API。 Room的总体架构: 2.Room数据库的基础概念 Entity Entity是Room中的数据表&#xff0c;每个Entity类对应一个SQLite表。 DAO …

队列——Acwing.829模拟队列

队列 定义 队列是一种特殊的线性表&#xff0c;遵循先进先出&#xff08;First In First Out&#xff0c;FIFO&#xff09;的原则。可以进行入队&#xff08;在队尾添加元素&#xff09;和出队&#xff08;从队首移除元素&#xff09;操作。 运用情况 任务调度&#xff1a;…

ES6+Vue

ES6Vue ES6语法 ​ VUE基于是ES6的&#xff0c;所以在使用Vue之前我们需要先了解一下ES6的语法。 1.什么是ECMAScript6 ECMAScript是浏览器脚本语言的规范&#xff0c;基于javascript来制定的。为什么会出现这个规范呢&#xff1f; 1.1.JS发展史 1995年&#xff0c;网景工…

大模型赛道有前景吗?

前言 随着人工智能技术的飞速发展&#xff0c;大模型作为新一代AI技术的核心驱动力&#xff0c;正在全球范围内掀起一场科技革命。在这个浪潮中&#xff0c;大模型赛道以其巨大的发展潜力、广泛的应用前景&#xff0c;成为了众多企业和投资者关注的焦点。本文将从多个角度探讨…

【STM32进阶笔记】GPIO端口

前段时间由于其他原因&#xff0c;专栏暂停更新了较长一段时间&#xff0c;现在恢复更新&#xff0c;争取继续为大家创造有价值的内容&#xff0c;期待大家的订阅关注&#xff0c;欢迎互相学习交流。 在STM32速成笔记系列专栏中其实已经对GPIO的一些必要知识进行了介绍&#xf…

tvm实战踩坑

今天玩了一下tvm的安装 我要安装v0.14.0的版本 所以按照官网的方法 https://tvm.apache.org/docs/install/from_source.html#python-package-installation git clone --recursive https://github.com/apache/tvm tvmgit checkout v0.14.0recursive是很重要的 这一步可以替换成…

数栈xAI:轻量化、专业化、模块化,四大功能革新 SQL 开发体验

在这个数据如潮的时代&#xff0c;SQL 已远远超越了简单的查询语言范畴&#xff0c;它已成为数据分析和决策制定的基石&#xff0c;成为撬动企业智慧决策的关键杠杆。SQL 的编写和执行效率直接关系到数据处理的速度和分析结果的深度&#xff0c;对企业洞察市场动态、优化业务流…

[Shell编程学习路线]——探讨Shell中变量的作用范围(export)

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f6e0;️Shell编程专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年6月14日10点14分 &#x1f004;️文章质量&#xff1a;95分 文章目录 ————前言———— 定义变量&#xff1a; 输出变…

SpringBoot3 整合 Mybatis 完整版

本文记录一下完整的 SpringBoot3 整合 Mybatis 的步骤。 只要按照本步骤来操作&#xff0c;整合完成后就可以正常使用。1. 添加数据库驱动依赖 以 MySQL 为例。 当不指定 依赖版本的时候&#xff0c;会 由 springboot 自动管理。 <dependency><groupId>com.mysql&l…

第2章 Rust初体验7/8:错误处理时不关心具体错误类型的下划线:提高代码可读性:猜骰子冷热游戏

讲动人的故事,写懂人的代码 2.6.6 用as进行类型转换:显式而简洁的语法 贾克强:“大家在查看Rust代码时,可能会注意到这一句。在这里,如果我们不使用as i32,编译器会报错,因为它在u32中找不到abs()方法。这是因为prev和sum_of_two_dice都是u32类型,u32类型并不支持abs(…

燃气守护神:燃气管网安全运行监测解决方案

在这个智能科技日新月异的时代&#xff0c;燃气安全却时有发生&#xff0c;严重危害人们的生命财产安全&#xff0c;因此旭华智能根据相关政策要求并结合自身优势&#xff0c;打造了一套燃气管网安全运行监测解决方案&#xff0c;他犹如一位“燃气守护神”&#xff0c;悄然守护…

[深度学习]基于C++和onnxruntime部署yolov10的onnx模型

基于C和ONNX Runtime部署YOLOv10的ONNX模型&#xff0c;可以遵循以下步骤&#xff1a; 准备环境&#xff1a;首先&#xff0c;确保已经下载后指定版本opencv和onnruntime的C库。 模型转换&#xff1a;按照官方源码&#xff1a;https://github.com/THU-MIG/yolov10 安装好yolov…

【linux网络(三)】HTTP协议详解

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; Linux网络 1. 前言2. 序列化和…

新面貌、新功能、新内容!禅道官网改版升级,全面提升用户体验

为了给用户更好的体验&#xff0c;禅道团队于23年6月与艾体验团队达成合作&#xff0c;正式启动了禅道官网改版的项目&#xff0c;历经一年的努力&#xff0c;2024年6月7日&#xff0c;禅道新官网顺利完成改版升级&#xff0c;正式上线与大家见面啦&#xff01; 此次改版上线的…

LeetCode 2813.子序列最大优雅度

给你一个长度为 n 的二维整数数组 items 和一个整数 k 。 items[i] [profiti, categoryi]&#xff0c;其中 profiti 和 categoryi 分别表示第 i 个项目的利润和类别。 现定义 items 的 子序列 的 优雅度 可以用 total_profit distinct_categories^2 计算&#xff0c;其中 t…

腾讯云EdgeOne对比普通CDN的分别

EdgeOne架构图 普通CDN架构图 ​​​​​​​ 腾讯云EdgeOne对比普通CDN的不同点 服务范围和集成度 腾讯云EdgeOne是一体化的综合平台&#xff0c;不仅提供内容分发功能&#xff0c;还包括安全防护、性能优化和边缘计算等服务。EdgeOne提供了DDoS防护、WAF&#xff08;Web应…

Tailwind CSS 响应式设计实战指南

title: Tailwind CSS 响应式设计实战指南 date: 2024/6/13 updated: 2024/6/13 author: cmdragon excerpt: 这篇文章介绍了如何运用Tailwind CSS框架创建响应式网页设计&#xff0c;涵盖博客、电商网站及企业官网的布局实例&#xff0c;包括头部导航、内容区域、侧边栏、页脚…

Java-多线程

概念 进程&#xff1a;程序的基本执行实体 线程&#xff1a;操作系统能够进行运算调度的最小单位&#xff0c;被包含在进程之中&#xff0c;是进程的实际运作单位 并发&#xff1a;同一时刻&#xff0c;多个指令在单个CPU上交替执行。 并行&#xff1a;同一时刻&#xff0c;多…