星辰宇宙动态页面vue版,超好看的前端页面。附源码与应用教程(若依)

本代码的html版本,来源自“山羊の前端小窝”作者,我对此进行了vue版本转换以及相关应用。特此与大家一起分享~

1、直接上效果图:

带文字版:文字呼吸式缩放。

纯净版:

默认展示效果:

缩放与旋转后:

2、代码

话不多说,直接上代码

<template><div id="threejs-scene"><div class="header-text" ref="headerText">万千星辰,<span @click="redirectToPage" style="font-weight: bold">我</span>,会归于何方?</div></div>
</template><!--//我在上方做了个跳转,这是在若依中设置的,不需要的直接删除即可--><script>
import * as THREE from "three";
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls";//需要npm install相关插件,一般会有提示,请直接安装export default {mounted() {console.clear();// 创建场景this.scene = new THREE.Scene();this.scene.background = new THREE.Color(0x160016);// 创建相机this.camera = new THREE.PerspectiveCamera(60,window.innerWidth / window.innerHeight,1,1000);this.camera.position.set(0, 4, 21);// 创建渲染器this.renderer = new THREE.WebGLRenderer();// 设置渲染器大小this.renderer.setSize(window.innerWidth, window.innerHeight);// 把渲染器加入到页面中this.$el.appendChild(this.renderer.domElement);// 监听窗口大小变化事件window.addEventListener("resize", this.handleWindowResize);// 创建控制器this.controls = new OrbitControls(this.camera, this.renderer.domElement);// 开启阻尼效果this.controls.enableDamping = true;// 禁用面板this.controls.enablePan = false;// 创建全局uniformthis.gu = {time: { value: 0 },};// 创建时钟this.clock = new THREE.Clock();// 生成点云数据this.generatePointCloud();// 设置渲染循环this.renderer.setAnimationLoop(this.animate);},methods: {redirectToPage() {// 页面跳转this.$router.push({path:"/loginForUser"});},handleWindowResize() {this.camera.aspect = window.innerWidth / window.innerHeight;this.camera.updateProjectionMatrix();this.renderer.setSize(window.innerWidth, window.innerHeight);},generatePointCloud() {let pts = [];let sizes = [];let shift = [];// 创建移动函数const pushShift = () => {shift.push(Math.random() * Math.PI,Math.random() * Math.PI * 2,(Math.random() * 0.9 + 0.1) * Math.PI * 0.1,Math.random() * 0.9 + 0.1);};// 创建点的顶点数组(中间的球体)for (let i = 0; i < 50000; i++) {sizes.push(Math.random() * 1.5 + 0.5);pushShift();pts.push(new THREE.Vector3().randomDirection().multiplyScalar(Math.random() * 0.5 + 9.5));}// 添加更多的点(旁边围绕的)for (let i = 0; i < 100000; i++) {let r = 10,R = 40;let rand = Math.pow(Math.random(), 1.5);let radius = Math.sqrt(R * R * rand + (1 - rand) * r * r);pts.push(new THREE.Vector3().setFromCylindricalCoords(radius,Math.random() * 2 * Math.PI,(Math.random() - 0.5) * 2));sizes.push(Math.random() * 1.5 + 0.5);pushShift();}// 创建点云几何体let geometry = new THREE.BufferGeometry().setFromPoints(pts);geometry.setAttribute("sizes", new THREE.Float32BufferAttribute(sizes, 1));geometry.setAttribute("shift", new THREE.Float32BufferAttribute(shift, 4));// 创建点云材质let material = new THREE.PointsMaterial({size: 0.125,transparent: true,depthTest: false,blending: THREE.AdditiveBlending,onBeforeCompile: (shader) => {shader.uniforms.time = this.gu.time;shader.vertexShader = `uniform float time;attribute float sizes;attribute vec4 shift;varying vec3 vColor;${shader.vertexShader}`.replace(`gl_PointSize = size;`, `gl_PointSize = size * sizes;`).replace(`#include <color_vertex>`,`#include <color_vertex>float d = length(abs(position)/vec3(40.,10.,40));d=clamp(d,0.,1.);vColor = mix(vec3(220., 84., 190.),vec3(67., 11., 245.),d)/255.;`)//上文vColor为调整颜色的东西,可自定义!.replace(`#include <begin_vertex>`,`#include <begin_vertex>float t = time;float moveT = mod(shift.x + shift.z * t,PI2);float moveS = mod(shift.y + shift.z * t,PI2);transformed += vec3(cos(moveS) * sin(moveT),cos(moveT),sin(moveS)*sin(moveT)) * shift.w;`);shader.fragmentShader = `varying vec3 vColor;${shader.fragmentShader}`.replace(`#include <clipping_planes_fragment>`,`#include <clipping_planes_fragment>float d = length(gl_PointCoord.xy - 0.5);`).replace(`vec4 diffuseColor = vec4( diffuse, opacity );`,`vec4 diffuseColor = vec4(vColor, smoothstep(0.5, 0.1, length(gl_PointCoord.xy - 0.5))/* * 0.5+0.5*/);`);},});// 创建点云对象并添加到场景中this.points = new THREE.Points(geometry, material);this.points.rotation.order = "ZYX";this.points.rotation.z = 0.2;this.scene.add(this.points);},animate() {this.controls.update();// 获取时钟对象(clock)的已经流逝的时间(t)并将他乘0.5let t = this.clock.getElapsedTime() * 0.5;this.gu.time.value = t * Math.PI;this.points.rotation.y = t * 0.05;this.renderer.render(this.scene, this.camera);// 更新文字的缩放比例//如果不想要文字,请注释掉文字所在的div,以及下面两行:let scale = 1 + 0.2 * Math.sin(t);this.$refs.headerText.style.transform = `scale(${scale})`;},},beforeDestroy() {window.removeEventListener("resize", this.handleWindowResize);this.renderer.setAnimationLoop(null);},
};
</script><style scoped>
.header-text {position: absolute;top: 45%;left: 35%;transform: translate(-50%, -50%);font-size: 50px;font-weight: bold;color: #f8df70;opacity: 90%;text-shadow: 0 0 10px rgba(0, 0, 0, 0.5);z-index: 10;font-family: 'Comic Sans MS', 'Comic Sans', cursive;text-align: center;cursor: pointer; /* 让文本在鼠标悬停时显示光标,表明可以点击 */
}#threejs-scene {overflow: hidden;margin: 0;
}
</style>

3、在若依登录前的应用:

当前我实现的效果为:前端页面运行后,直接跳转到星辰页,再靠点击触发登录跳转。

(1)创建页面

复制原有的login.vue页面,将副本命名为:loginForUser用于放原有的登录页面,原有页面替换为上文代码👆

(2)找到router路由位置:添加路由

  {path: '/loginForUser',component: () => import('@/views/loginForUser'),hidden: true},{path: '',component: Layout,redirect: 'loginForUser',children: [{path: 'loginForUser',component: () => import('@/views/loginForUser'),name: 'Index',meta: { title: '首页', icon: 'dashboard', affix: true }}]},//请将上文loginForUser,替换为你的当前登录页面的名称

注意,做到这一步,一般还是无法跳转的,需要下一步修改:

(3)找到permission.js页面,修改访问白名单,实现跳转逻辑。

permission.js代码参考:

import router from './router'
import store from './store'
import { Message } from 'element-ui'
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
import { getToken } from '@/utils/auth'
import { isRelogin } from '@/utils/request'NProgress.configure({ showSpinner: false })const whiteList = ['/login', '/loginForUser','/register']
//添加了:'/loginForUser',router.beforeEach((to, from, next) => {NProgress.start()if (getToken()) {to.meta.title && store.dispatch('settings/setTitle', to.meta.title)/* has token*/if (to.path === '/login'|| to.path === '/loginForUser')  {//添加了: to.path === '/loginForUser'next({ path: '/' })NProgress.done()} else if (whiteList.indexOf(to.path) !== -1) {next()} else {if (store.getters.roles.length === 0) {isRelogin.show = true// 判断当前用户是否已拉取完user_info信息store.dispatch('GetInfo').then(() => {isRelogin.show = falsestore.dispatch('GenerateRoutes').then(accessRoutes => {// 根据roles权限生成可访问的路由表router.addRoutes(accessRoutes) // 动态添加可访问路由表next({ ...to, replace: true }) // hack方法 确保addRoutes已完成})}).catch(err => {store.dispatch('LogOut').then(() => {Message.error(err)next({ path: '/' })})})} else {next()}}} else {// 没有tokenif (whiteList.indexOf(to.path) !== -1) {// 在免登录白名单,直接进入next()} else {next(`/login?redirect=${encodeURIComponent(to.fullPath)}`) // 否则全部重定向到登录页NProgress.done()}}
})router.afterEach(() => {NProgress.done()
})

(4)星辰页面(login.vue)加入路由跳转:

<template><div id="threejs-scene"><div class="header-text" ref="headerText">万千星辰,<span @click="redirectToPage"             style="font-weight: bold">我</span>,会归于何方?</div></div>
</template>
<!--页面中,引入点击事件:@click="redirectToPage"-->
<script>//……其它代码methods: {    redirectToPage() {this.$router.push({path:"/loginForUser"});// path就是你在router文件中写的,我的为 /loginForUser},}</script>

最后贴一个原作者的视频地址:希望大家也可以支持一下原作者~

【JS】星辰宇宙教学 或许这就是代码的魅力 (附源码)

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

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

相关文章

anaconda中下载压缩包并用conda安装包

有时直接conda安装包时会出错&#xff1b;报错PackagesNotFoundError: The following packages are not available from current channels 比如 conda install -y bioconda::ucsc-gtftogenepred #直接安装报错 #直接下载压缩包安装https://blog.csdn.net/weixin_45552562/ar…

02:C语言数据类型

C语言数据类型 1、整型变量2、浮点型变量3、字符型变量4、有符号数和无符号数 1、整型变量 #include <stdio.h>int main(void) { /* int a; //定义一个整型变量aint b; //定义一个整型变量bint c; //定义一个整型变量c */ /* int a,b,c; //也可以这样定义a 25;b 6; *…

liunx文件系统,日志分析

文章目录 1.inode与block1.1 inode与block概述1.2 inode的内容1.3 文件存储1.4 inode的大小1.5 inode的特殊作用 2.硬链接与软链接2.1链接文件分类 3.恢复误删除的文件3.1 案例:恢复EXT类型的文件3.2 案例:恢复XFS类型的文件3.2.1 xfsdump使用限制 4.分析日志文件4.1日志文件4.…

Windows如何查看端口是否占用,并结束端口进程

需求与问题&#xff1a;前后端配置了跨域操作&#xff0c;但是仍然报错&#xff0c;可以考虑端口被两个程序占用&#xff0c;找不到正确端口或者后端接口书写是否规范&#xff0c;特别是利用Python Flask书写时要保证缩进是否正确&#xff01; Windows操作系统中&#xff0c;查…

Linux多进程和多线程(六)进程间通信-共享内存

多进程(六) 共享内存共享内存的创建 示例: 共享内存删除 共享内存映射 共享内存映射的创建解除共享内存映射示例:写入和读取共享内存中的数据 写入: ### 读取: 大致操作流程: 多进程(六) 共享内存 共享内存是将分配的物理空间直接映射到进程的⽤户虚拟地址空间中, 减少数据在…

ubuntu22 sshd设置

专栏总目录 一、安装sshd服务 sudo apt updatesudo apt install -y openssh-server 二、配置sshd 使用文本编辑器打开/etc/ssh/sshd_config sudo vi /etc/ssh/sshd_config &#xff08;一&#xff09;配置sshd服务的侦听端口 建议将ssh的侦听端口改为7000以上的端口&#…

图的应用之最短路径

引入 应用 算法思想 Dijistra算法 用于解决单个顶点间的最短路径问题 将顶点看成两部分&#xff1a; 最短路径顶点集合A与尚未确定最短路径顶点集合B。 先将顶点按最短路径由小到大依次加入到A中&#xff0c;选择由源点到A中最短的顶点&#xff0c;并记录距离与顶点&#xf…

DB-GPT-PaperReading

DB-GPT: Empowering Database Interactions with Private Large Language Models 1. 基本介绍 DB-GPT 旨在理解自然语言查询,提供上下文感知响应,并生成高精度的复杂 SQL 查询,使其成为从新手到专家的用户不可或缺的工具。DB-GPT 的核心创新在于其私有 LLM 技术,该技术在…

20240706 每日AI必读资讯

&#x1f680;Meta 发布 AI 重磅炸弹&#xff1a;多标记预测模型现已开放研究 - 新技术采用多标记预测方法&#xff0c;有望提高性能并缩短训练时间。 - 模型同时预测多个未来单词&#xff0c;可能改善语言结构和上下文理解。 - multi-token prediction模型是Facebook基于大…

2024 年第十四届亚太数学建模竞赛(中文赛项)浅析

需要完整B题资料&#xff0c;请关注&#xff1a;“小何数模”&#xff01; 本次亚太(中文赛)数学建模的赛题已正式出炉&#xff0c;无论是赛题难度还是认可度&#xff0c;该比赛都是仅次于数模国赛的独一档&#xff0c;可以用于国赛前的练手训练。考虑到大家解题实属不易&…

linux下的网络编程

网络编程 1. 网络基础编程知识1.1网络字节序问题1.2 常用socket编程接口1.2.1 sockaddr1.2.2 ip地址转换函数1.2.4 socket()1.2.3 bind()1.2.4 listen()1.2.5 accept()1.2.6 connect() 1.3 以udp为基础的客户端连接服务器的demo1.4 以udp为基础的的服务器聊天室功能demo1.5 基于…

文件上传(本地、OSS)

什么是文件上传&#xff1a;将文件上传到服务器。 文件上传-本地存储 前端 <template> <div><!-- 上传文件需要设置表单的提交方式为post&#xff0c;并设置enctype属性、表单项的type属性设置为file --><form action"http://localhost:8080/wedu/…

easyx图形库

目录 1、绘制简单的图形化窗口 2、设置窗口属性 2.1 颜色设置 2.2 刷新 3、基本绘图函数 3.1 绘制直线 3.2 绘制圆 3.3 绘制矩形 4、贴图 4.1 原样贴图 4.1.1 IMAGE变量去表示图片 4.1.2 加载图片 4.1.3 显示图片 4.2 透明贴图 4.2.1 认识素材 4.3 png贴图 5…

Redission分布式锁-源码解析(手把手解析)

文章目录 1.关于锁的重试机制&#xff1a;2.锁的超时问题 1.关于锁的重试机制&#xff1a; 进一步进入tryLock函数内部 2.锁的超时问题 加入目前获取锁成功了&#xff0c;我有一个剩余的有效期&#xff0c;万一业务阻塞了&#xff0c;TTL到期了&#xff0c;其他线程又进来拿锁…

[数据结构] 基于交换的排序 冒泡排序快速排序

标题&#xff1a;[数据结构] 基于交换的排序 冒泡排序&&快速排序 水墨不写bug &#xff08;图片来源于网络&#xff09; 目录 &#xff08;一&#xff09;冒泡排序 优化后实现&#xff1a; &#xff08;二&#xff09;快速排序 I、实现方法&#xff1a; &#…

移动应用开发课设——原神小助手文档(1)

2023年末&#xff0c;做的移动应用开发课设&#xff0c;分还算高&#xff0c;项目地址&#xff1a;有帮助的话&#xff0c;点个赞和星呗~ GitHub - blhqwjs/-GenShin_imp: 2023年移动应用开发课设 本文按照毕业论文要求来写&#xff0c;希望对大家有所帮助。 xxxx大学课程设计报…

一级指针 二级指针

目录 一级指针 二级指针 通过二级指针打印原数据 一级指针 一级指针就是存放变量的指针 代码演示&#xff1a; #include<stdio.h> int main() {int a 10;int* pa &a;return 0; } pa就是一级指针变量&#xff0c;是变量就会有地址&#xff0c;因为变量都是在…

警惕AI泡沫:巨额投资与回报失衡

尽管高科技巨头们在AI基础设施上投入巨资&#xff0c;但AI带来的收入增长尚未显现&#xff0c;揭示了生态系统末端用户价值的重大缺口。 红杉资本分析师David Cahn认为&#xff0c;AI企业需每年赚取约6000亿美元才能抵消其AI基础设施&#xff08;如数据中心&#xff09;的成本&…

Docker部署Seata与Nacos整合

本文来自 Apache Seata官方文档&#xff0c;欢迎访问官网&#xff0c;查看更多深度文章。 本文来自 Apache Seata官方文档&#xff0c;欢迎访问官网&#xff0c;查看更多深度文章。 Docker部署Seata与Nacos整合 Docker 部署 Seata 与 Nacos 整合 运行所使用的 demo项目地址 …

测试环境:使用OpenSSL生成证书并配置Https

文章目录 需求1、安装OpenSSL1.1、安装包下载1.2、安装&#xff08;以window 64位为例&#xff09;1.3、配置环境变量&#xff08;非必须&#xff09; 2、生成证书2.1、新建文件夹2.2、生成根证书2.2.1、生成私钥2.2.2、生成根证书&#xff0c;并且自签名 2.3、服务端证书生成2…