星辰宇宙动态页面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.mzph.cn/bicheng/41842.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql5.6的安装步骤

1.下载mysql 下载地址&#xff1a;https://downloads.mysql.com/archives/community/ 在这里我们下载zip的包 2.解压mysql包到指定目录 3. 添加my.ini文件 # For advice on how to change settings please see # http://dev.mysql.com/doc/refman/5.6/en/server-configurat…

tongweb+ths6011测试websocket(by lqw)

本次使用的tongweb版本7049m4&#xff0c;测试包ws_example.war&#xff08;在tongweb安装目录的samples/websocket下&#xff09;&#xff0c;ths版本6011 首先在tongweb控制台部署一下ws_example.war,部署后测试是否能访问&#xff1a; 然後ths上的httpserver.conf的參考配…

本地部署到服务器上的资源路径问题

本地部署到服务器上的资源路径问题 服务器端的源代码的静态资源目录层级 当使用Thymeleaf时&#xff0c;在templates的目录下为返回的html页面&#xff0c;下面以两个例子解释当将代码部署到tomcat时访问资源的路径配置问题 例子一 index.html&#xff08;在templates的根目录…

VBA初学:零件成本统计之三(获取材料外协的金额)

第三步&#xff0c;从K3的数据库中获取金额 我这里是使用循环&#xff0c;通过任务单号将金额汇总出来&#xff0c;如果使用数组的话&#xff0c;还要按任务单写GROUP&#xff0c;还要去对应&#xff0c;不如循环直接一点 获取材料和外协金额的表格Sub getje()Dim rowcount A…

leetcode-每日一题

3101. 交替子数组计数https://leetcode.cn/problems/count-alternating-subarrays/ 给你一个 二进制数组 nums 。 如果一个 子数组 中 不存在 两个 相邻 元素的值 相同 的情况&#xff0c;我们称这样的子数组为 交替子数组 。 返回数组 nums 中交替子数组的数量。 示例 …

3-2 梯度与反向传播

3-2 梯度与反向传播 主目录点这里 梯度的含义 可以看到红色区域的变化率较大&#xff0c;梯度较大&#xff1b;绿色区域的变化率较小&#xff0c;梯度较小。 在二维情况下&#xff0c;梯度向量的方向指向函数增长最快的方向&#xff0c;而其大小表示增长的速率。 梯度的计算 …

如何第一次从零上传项目到GitLab

嗨&#xff0c;我是兰若&#xff0c;今天想给大家说下&#xff0c;如何上传一个完整的项目到与LDAP集成的GitLab&#xff0c;也就是说这个项目之前是不在git上面的&#xff0c;这是第一次上传&#xff0c;这样上传上去之后&#xff0c;其他小伙伴就可以根据你这个项目的git地址…

Lua语言入门

目录 Lua语言1 搭建Lua开发环境1.1 安装Lua解释器WindowsLinux 1.2 IntelliJ安装Lua插件在线安装本地安装 2 Lua语法2.1 数据类型2.2 变量全局变量局部变量命名规范局部变量作用域 2.3 注释单行注释多行注释 2.4 赋值2.5 操作符数学操作符比较操作符逻辑操作符连接操作符取长度…

moonlight+sunshine+ParsecVDisplay ipad8-windows 局域网串流

1.sunshine PC 安装 2.设置任意账户密码登录 3.setting 里 network启用UPNP IPV4IPV6 save apply 4.ParsecVDisplay虚拟显示器安装 5.ipad appstore download moonlight 6.以ipad 8 为例 2160*1620屏幕分辨率 7.ParsecVDisplay里面 custom设置2160*1620 240hz&#xff0c;…

银河麒麟V10 SP1 审计工具 auditd更新

前言 银河麒麟V10 SP1 审计工具 auditd 引发的内存占用过高&#xff0c; 内存使用率一直在 60% 以上&#xff0c; 内存一直不释放 排查 可以使用ps或者top查看系统进程使用情况 ps -aux|sort -k4nr|head -n 5 发现银河麒麟审计工具 auditd 一直占用内存不释放 解决 办法一…

进程的初步认识

目录 一、硬件方面介绍 1.冯诺依曼体系结构 2.存储分级 二、软件 方面 1.操作系统是一款进行管理的软件&#xff0c;它可以管理硬件也可以管理软件 2.操作系统如何管理&#xff1f; 三、进程 1.概念 总结 四、linux中对进程的管理 1.task_ struct内容分类 2.查看进…

PageCache页缓存

一.PageCache基本结构 1.PageCache任务 PageCache负责使用系统调用向系统申请页的内存,给CentralCache分配大块儿的内存,以及合并前后页空闲的内存,整体也是一个单例,需要加锁. PageCache桶的下标按照页号进行映射,每个桶里span的页数即为下标大小. 2.基本结构 当每个线程的…

如何使用uer做多分类任务

如何使用uer做多分类任务 语料集下载 找到这里点击即可 里面是这有json文件的 因此我们对此要做一些处理&#xff0c;将其转为tsv格式 # -*- coding: utf-8 -*- import json import csv import chardet# 检测文件编码 def detect_encoding(file_path):with open(file_path,…

Vatee万腾平台:智能生活的新选择

在科技飞速发展的今天&#xff0c;智能生活已经不再是遥不可及的梦想&#xff0c;而是逐渐渗透到我们日常生活的方方面面。Vatee万腾平台&#xff0c;作为智能科技领域的佼佼者&#xff0c;正以其创新的技术、丰富的应用场景和卓越的用户体验&#xff0c;成为智能生活的新选择&…

vue学习笔记(购物车小案例)

用一个简单的购物车demo来回顾一下其中需要注意的细节。 先看一下最终效果 功能&#xff1a; &#xff08;1&#xff09;全选按钮和下面的商品项的选中状态同步&#xff0c;当下面的商品全部选中时&#xff0c;全选勾选&#xff0c;反之&#xff0c;则不勾选。 &#xff08…

51单片机嵌入式开发:2、STC89C52操作GPIO口LED灯

STC89C52操作GPIO口LED灯 1 芯片介绍1.1 芯片类型1.2 芯片系列说明 2 GPIO引脚寄存器说明3 GPIO操作3.1 GPIO输入3.2 GPIO输出3.3 GPIO流水灯3.4 Protues仿真 4 总结 1 芯片介绍 1.1 芯片类型 芯片采用宏晶科技品牌下的STC89C52RC单片机 选择STC89C52RC系列STC89C58RD系列单片…

Pycharm远程连接GPU(内容:下载安装Pycharm、GPU租借、配置SSH、将代码同步到镜像、命令行操控远程镜像、配置远程GPU解释器)

目录 windows下载安装pycharmGPU租借网站AutoDlfeaturize好易智算 GPU租借GPU选择选择镜像充值 然后创建镜像创建成功 复制SSH登录信息 远程进入镜像 在Pycharm中进行ssh连接新建SFTP配置SSH复制ssh根据复制的信息填写ssh配置测试连接 将代码同步到远程镜像上设置mappings将本地…

大语言模型与知识图谱结合发展方向

引言 在人工智能的发展历程中&#xff0c;大语言模型&#xff08;LLM&#xff09;的出现标志着一个重要的转折点。随着深度学习技术的突破和计算能力的提升&#xff0c;LLM以其前所未有的规模和复杂性&#xff0c;开启了迈向人工通用智能&#xff08;AGI&#xff09;的新浪潮。…

STM32利用FreeRTOS实现4个led灯同时以不同的频率闪烁

在没有接触到FreeRTOS时&#xff0c;也没有想过同时叫两个或两个以上的led灯闪烁的想法&#xff0c;接触后&#xff0c;发现如果想叫两个灯同时以不同的频率闪烁&#xff0c;不能说是不可能&#xff0c;就算是做到了也要非常的麻烦。但是学习了FreeRTOS后&#xff0c;发现要想同…

使用WinSCP工具连接Windows电脑与Ubuntu虚拟机实现文件共享传输

一。环境配置 1.首先你的Windows电脑上安装了VMware虚拟机&#xff0c;虚拟机装有Ubuntu系统&#xff1b; 2.在你的windows电脑安装了WinSCP工具&#xff1b; 3.打开WinSCP工具默认是这样 二。设置WinSCP连接 打开WinSCP&#xff0c;点击新标签页&#xff0c;进入到如下图的…