星辰宇宙动态页面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的參考配…

腾讯centos mysql安装

腾讯centos mysql安装 腾讯云提供了一系列的云计算服务&#xff0c;包括操作系统、数据库、服务器等。在腾讯云上安装CentOS操作系统和MySQL数据库可以按照以下步骤进行&#xff1a; 登录腾讯云控制台&#xff08;登录 - 腾讯云&#xff09;。在控制台页面上方的搜索框中输入…

vue数组变化的侦测***

数组变化的侦测 变更方法 vue能够侦听响应式数组的变更方法&#xff0c;并在他们被调用时触发相关更新。这些变更方法包括&#xff1a; push()pop()shift()unshift()splice()sort()reverse() 替换一个数组 变更方法&#xff0c;顾名思义&#xff0c;就是会对调用他们的原数组进…

Vue 路由传参 query方法 bug 记录

问题描述 vue 路由传参 踩坑 this.$router.push({path: "xxxxxxx",query: {opportunity_id:row.opportunity_id,constructor:row.constructor,},});解决方案&#xff1a; 上述方法传入新页面时&#xff0c;访问的 this.$route.query 会有bug 每一次刷新都会在最后一…

DNS服务器

DNS服务器 一、DNS简介&#xff1a; DNS&#xff08;Domain Name System&#xff09;是一种用于将域名解析为IP地址的系统。 在DNS中&#xff0c;正向解析将域名转换为IP地址&#xff0c;而反向解析将IP地址转换为域名。正向解析是DNS系统最常用的解析方式&#xff0c;它允许…

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

本地部署到服务器上的资源路径问题 服务器端的源代码的静态资源目录层级 当使用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 中交替子数组的数量。 示例 …

算法力扣刷题 三十四【71.简化路径】

前言 栈和队列篇。 记录 三十四【71.简化路径】 一、题目阅读 给你一个字符串 path &#xff0c;表示指向某一文件或目录的 Unix 风格 绝对路径 &#xff08;以 ‘/’ 开头&#xff09;&#xff0c;请你将其转化为更加简洁的规范路径。 在 Unix 风格的文件系统中&#xff0c…

3-2 梯度与反向传播

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

使用Python实现深度学习模型:模型解释与可解释人工智能

在深度学习领域,模型解释和可解释性人工智能(XAI)正变得越来越重要。理解深度学习模型的决策过程对于提高模型的透明度和可信度至关重要。本文将详细介绍如何使用Python实现模型解释和可解释性人工智能,包括基本概念、常用方法、代码实现和示例应用。 目录 模型解释与可解…

docker使用镜像jms_all部署jumpserver

创建容器需要挂载出来的服务器对应目录 mkdir -p /data/redis/data mkdir -p /opt/mysql/{data,conf,logs}docker安装redis docker run -d -it --name redis -p 6379:6379 -v /data/redis/data:/data --restart=always

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

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

3. train_encoder_decoder.py

train_encoder_decoder.py #__future__ 模块提供了一种方式&#xff0c;允许开发者在当前版本的 Python 中使用即将在将来版本中成为标准的功能和语法特性。此处为了确保代码同时兼容Python 2和Python 3版本中的print函数 from __future__ import print_function # 导入标准库…

Lua语言入门

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

Leetcode秋招冲刺--(专题7-9)

专题7&#xff1a;字符串匹配 题目459:重复的子字符串&#xff08;NO&#xff09; 解题思路&#xff1a;这里用到了substr获取子串&#xff0c;然后直接堆成相同大小的主串&#xff0c;然后进行比较。 这题主要没做出的原因是时间复杂度一直优化不下去 myself class Soluti…

定个小目标之刷LeetCode热题(41)

338. 比特位计数 给你一个整数 n &#xff0c;对于 0 < i < n 中的每个 i &#xff0c;计算其二进制表示中 1 的个数 &#xff0c;返回一个长度为 n 1 的数组 ans 作为答案。 今天看一下这道简单题&#xff0c;主要考查位运算&#xff0c;代码如下 class Solution {pu…

Vue3路由切换动画

一、安装依赖 需要安装animate.css pnpm i animate.css二、使用transition添加过渡动画 注意&#xff1a;要想使用动画&#xff0c;需要加:key <router-view v-slot"{ Component }"><Transitionappearenter-active-class"animate__animated animate__f…

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;…