Three.js--》穿越虚拟门槛打造的3D登录界面

news2024/12/23 11:47:11

今天简单实现一个three.js的小Demo,加强自己对three知识的掌握与学习,只有在项目中才能灵活将所学知识运用起来,话不多说直接开始。

目录

项目搭建

初始化three代码

添加背景与地球

星星动画效果

星云动画效果

实现登录框效果


项目搭建

本案例还是借助框架书写three项目,借用vite构建工具搭建vue项目,vite这个构建工具如果有不了解的朋友,可以参考我之前对其讲解的文章:vite脚手架的搭建与使用。搭建完成之后,用编辑器打开该项目,在终端执行 npm i 安装一下依赖即可。接下来对项目进行一些初始化操作:

重置默认样式:在项目中我们都会用到一些标签,但是这些标签可能本身自带一些默认样式,这些默认样式可能会影响我们的排版布局,如果每次引用就去清除一遍默认样式有点太过繁琐,因此这里需要我们清除一下默认样式。执行如下命令安装第三方包: 

npm install reset.css --save

配置scss预处理器:SASS是一种预编译的CSS,作用类似于Less,这里我们在vue项目中采用该预处理器进行处理样式,终端执行如下命令安装相应的插件: 

npm install sass

配置element-plus组件库:因为本项目需要采用 element-plus 组件库进行创建项目,其官方地址为:element-plus ,所以接下来需要对组件库进行一个安装配置,具体的实现过程如下,终端执行如下安装命令:  

npm install element-plus @element-plus/icons-vue

安装完成之后,在入口文件main.js对element的插件进行一个挂载,这里顺便配置一下国家化:   

import { createApp } from 'vue'
import 'reset.css'
import App from './App.vue'
import ElementPlus from 'element-plus' // 引入element-plus插件与样式
import 'element-plus/dist/index.css'
import zhCn from 'element-plus/dist/locale/zh-cn.mjs'
 
createApp(App)
    .use(ElementPlus, { locale: zhCn }) // 安装element-plus插件并进行国际化配置
    .mount('#app')

路由配置:因为本项目主要展示的是3D场景的登陆页面,所有这里也是需要配置一些路由的,先我们要先创建几个路由作为路由模块,在src目录下新建一个pages文件夹,其用于存放路由组件相关的内容,如下:

不清楚vue路由的使用,推荐看一下我之前讲解过的文章:Vue 3 路由进阶 接下来正式开始配置项目的路由,首先终端执行如下命令安装vue路由:

npm i vue-router

安装完插件之后,接下来就可以对路由进行相关配置了,在src,目录下新建router文件,如下:

import { createRouter, createWebHistory } from "vue-router"
 
const routes = [
    {
        path: '/', 
        redirect: '/index', // 重定向
    },
    {
        path: '/index',
        name: 'home',
        component: () => import('../pages/home/index.vue'),
        meta: {
            title: '首页'
        }
    },
    {
        path: '/login',
        name: 'login',
        component: () => import('../pages/login/index.vue'),
        meta: {
            title: '登录页'
        }
    }
]
 
// createRouter用于创建路由器实例,可以管理多个路由
const router = createRouter({
    // 路由的模式的设置
    history: createWebHistory(),
    routes
})
 
export default router

配置完路由组件之后,我们需要在入口文件 main.js 中进行引入安装,如下: 

import { createApp } from 'vue'
import 'reset.css'
import App from './App.vue'
import router from './router' // 引入路由组件
import ElementPlus from 'element-plus' // 引入element-plus插件与样式
import 'element-plus/dist/index.css'
import zhCn from 'element-plus/dist/locale/zh-cn.mjs'
 
createApp(App)
    .use(router) // 安装路由插件
    .use(ElementPlus, { locale: zhCn }) // 安装element-plus插件并进行国际化配置
    .mount('#app')

安装完成之后,我们需要设置一下路由的出口位置,接下来只需要在根组件App.vue设置出口即可

最终呈现的效果如下所示:

初始化three代码

本次项目使用three.js代码必须要基于下面的基础代码才能实现:

初始化场景

import * as THREE from 'three'

const scene = new THREE.Scene()
scene.fog = new THREE.Fog(0x000000, 0, 10000) // 添加雾的效果

初始化相机

const camera = new THREE.PerspectiveCamera(15, window.innerWidth / window.innerHeight, 1, 30000)
// 计算相机距离物体的位置
const distance = window.innerWidth / 2 / Math.tan(Math.PI / 12)
const zAxisNumber = Math.floor(distance - 1400 / 2)
camera.position.set(0, 0, zAxisNumber) // 设置相机所在位置
camera.lookAt(0, 0, 0) // 看向原点
scene.add(camera)

初始化渲染器

const renderer = new THREE.WebGLRenderer({ antialias: true })
renderer.setSize(window.innerWidth, window.innerHeight)

监听屏幕大小的改变,修改渲染器的宽高和相机的比例

window.addEventListener("resize",()=>{ 
  renderer.setSize(window.innerWidth, window.innerHeight)
  camera.aspect = window.innerWidth / window.innerHeight
  camera.updateProjectionMatrix()
})

导入轨道控制器

// 添加轨道控制器
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'

// 添加控制器
const controls = new OrbitControls(camera, renderer.domElement)
controls.enabled = true // 设置控制是否可用
// 设置缩放范围
controls.minDistance = zAxisNumber // 设置最小缩放距离
controls.maxDistance = zAxisNumber + 500 // 设置最大缩放距离
controls.enableDamping = true // 设置控制阻尼

设置渲染函数:  

// 设置渲染函数
const render = (time) =>{ 
  controls.update()
  renderer.render(scene,camera)
  requestAnimationFrame(render)
}

页面加载调用

<template>
    <div class="loginBg">
        <div class="login" ref="login"></div>
    </div>
</template>

<script setup>
import { ref, onMounted } from 'vue'

// 获取div实例对象
let login = ref(null)
onMounted(() => {
    login.value.appendChild(renderer.domElement) // 添加渲染器到div中
    render()    
})
</script>

ok,写完基础代码之后,接下来开始具体的Demo实操。  

添加背景与地球

接下来开始加载背景贴图和地球模型,首先我们需要先将背景和地球的贴图导出来:

// 加载图片
const SKYIMG = new URL('../../assets/images/sky.png', import.meta.url).href
const EARTHIMG = new URL('../../assets/images/earth_bg.png', import.meta.url).href

接下来我们借助three提供的TextureLoader库用于加载和处理纹理,给物体表面增添细节和真实感的图像渲染3D场景中的物体,如下:

// 添加背景
let texture = new THREE.TextureLoader().load(SKYIMG)
const geometry = new THREE.BoxGeometry(window.innerWidth, window.innerHeight, 1400) // 创建立方体
const material = new THREE.MeshBasicMaterial({ // 创建材质
    map: texture, // 纹理贴图
    side: THREE.BackSide, // 背面
})
const mesh = new THREE.Mesh(geometry, material) // 创建网格模型
scene.add(mesh) // 添加到场景

因为我设置了控制器的缩放范围,使得我们只能在生成的背景盒子里面转动:

接下来添加地球模型,这里仍然采用贴图的模型进行:

// 添加球体
let SphereTexture = new THREE.TextureLoader().load(EARTHIMG)
const SphereGeometry = new THREE.SphereGeometry(50, 60, 32) // 创建球体几何体
const Spherematerial = new THREE.MeshPhongMaterial()
Spherematerial.map = new THREE.TextureLoader().load(EARTHIMG) // 创建材质
const sphere = new THREE.Mesh(SphereGeometry, Spherematerial) // 创建网格模型
sphere.position.set(-400, 200, -200) // 设置位置
scene.add(sphere) // 添加到场景

达到的效果如下,因为场景是没有光源的,所有加载的模型是黑色的,没问题。

接下来我们给场景添加环境光和点光源,让加载的模型有点反光的效果,代码如下:

// 添加光源
const ambientlight = new THREE.AmbientLight(0xffffff, 1) // 创建环境光源
scene.add(ambientlight) // 添加到场景
const positLight = new THREE.PointLight(0x0655fd, 5, 0) // 创建点光源
positLight.position.set(0, 200,100) // 设置位置
scene.add(positLight) // 添加到场景

这里顺便设置一下地球模型的自传效果,代码如下我们在render渲染函数中调用一下:

// 球体自转
const renderSphereRotate = () => {
    sphere.rotateY(0.001)
}
// 设置渲染函数
const render = () =>{ 
  controls.update()
  renderer.render(scene, camera)
  requestAnimationFrame(render)
  renderSphereRotate() // 自转
}

最终呈现的效果如下:

星星动画效果

接下来我们给正对我们电脑屏幕的角度后面添加星星,让其向着我们的角度进行运动,这里我们要先引入一下星星的图片,这里准备了两张星星的图片,如下:

const STAR1IMG = new URL('../../assets/images/starflake1.png', import.meta.url).href
const STAR2IMG = new URL('../../assets/images/starflake2.png', import.meta.url).href

这里开始处理星星的坐标、数量以及材质效果,如下:

// 初始位置
let initZposition = -zAxisNumber - 1400
// 声明点的参数
let parameters = []
let materials = [] // 创建材质数组
// 初始化星星效果
const initSceneStar = (initZposition) => {
    const starGeometry = new THREE.BufferGeometry() 
    // 星星位置的坐标
    const starPosition = []
    // 创建纹理
    const starTexture = new THREE.TextureLoader()
    const sprite1 = starTexture.load(STAR1IMG)
    const sprite2 = starTexture.load(STAR2IMG)
    // 星星的数据
    const pointsGeometry = []
    parameters = [
        [ [0.6, 100, 0.75], sprite1, 50 ],
        [ [0, 0, 1], sprite2, 20 ],
    ]
    // 创建1500颗星星
    for (let i = 0; i < 1500; i++) {
        const x = THREE.MathUtils.randFloatSpread(window.innerWidth) // 随机x坐标
        const y = _.random(0, window.innerHeight / 2) // 随机y坐标
        const z = _.random(-1400 / 2, zAxisNumber) // 随机z坐标
        starPosition.push(x, y, z) // 添加到坐标数组
    }
    starGeometry.setAttribute('position', new THREE.Float32BufferAttribute(starPosition, 3)) // 设置坐标
    
    // 创建两种不同的材质
    for (let i = 0; i < parameters.length; i++) {
        const color = parameters[i][0] // 颜色
        const sprite = parameters[i][1] // 纹理
        const size = parameters[i][2] // 点的大小
        materials[i] = new THREE.PointsMaterial({ // 创建材质
            size: size, // 点的大小
            map: sprite, // 纹理
            blending: THREE.AdditiveBlending, // 混合模式
            transparent: true, // 背景透明
            depthTest: true, // 深度测试
        })
        materials[i].color.setHSL(color[0], color[1], color[2]) // 设置颜色
        const points = new THREE.Points(starGeometry, materials[i]) // 创建点
        points.rotation.x = Math.random() * 0.2 - 0.15 // 随机旋转x轴
        points.rotation.y = Math.random() * 0.2 - 0.15 // 随机旋转y轴
        points.rotation.z = Math.random() * 0.2 - 0.15 // 随机旋转z轴 
        points.position.setZ(initZposition) // 设置z轴位置
        pointsGeometry.push(points) // 添加到数组
        scene.add(points) // 添加到场景
    }
    return pointsGeometry // 返回数组
}

最终呈现的效果如下:

接下来我们要对这些星星进行处理,让其运动起来。这里对两种星星的数据进行处理:

// 声明点1,点2在z轴上的移动位置
let zprogress1 = -zAxisNumber - 1400 / 2
let zprogress2 = (-zAxisNumber - 1400 / 2) * 2
// 声明点1,点2的数据
let zprogress_first = []
let zprogress_second = []

// 渲染星星的运动效果
const renderStarMove = () => {
    // 星星颜色交替变化
    const time = Date.now() * 0.00005 // 获取当前时间
    for (let i = 0; i < parameters.length; i++) {
        const color = parameters[i][0] // 颜色 
        const h = ((360 * (color[0] + time)) % 360) / 360 // 计算颜色
        materials[i].color.setHSL(color[0], color[1], parseFloat(h.toFixed(2))) // 设置颜色
    }
    // 完成星星的运动
    zprogress1 += 1
    zprogress2 += 1
    // 判断点1,点2是否到达边界
    if (zprogress1 >= zAxisNumber + 1400 / 2) {
        zprogress1 = -zAxisNumber - 1400 / 2
    } else {
        zprogress_first.forEach(item => {
            item.position.setZ(zprogress1) // 设置z轴位置
        })
    }
    if (zprogress2 >= zAxisNumber + 1400 / 2) {
        zprogress2 = -zAxisNumber - 1400 / 2
    } else {
        zprogress_second.forEach(item => {
            item.position.setZ(zprogress2) // 设置z轴位置
        })
    }
}

在页面刚加载的时候将获取星星的位置数据,然后在渲染函数中进行调用即可:

onMounted(() => {
    login.value.appendChild(renderer.domElement) // 添加渲染器到div中
    initSceneStar(initZposition) // 初始化星星
    zprogress_first = initSceneStar(zprogress1) // 初始化点1
    zprogress_second = initSceneStar(zprogress2) // 初始化点2
    render()    
})

// 设置渲染函数
const render = () =>{ 
  controls.update()
  renderer.render(scene, camera)
  requestAnimationFrame(render)
  renderSphereRotate() // 自转
  renderStarMove() // 星星移动
}

最终实现的效果如下,总体来说还是不错的:

星云动画效果

加载星云的效果和上面讲述的星星类似,这里我们仍然要借助一个贴图来实现,具体代码如下:

// 渲染星云的效果
const renderCloud = (width, height) => {
    const texture = new THREE.TextureLoader().load(CLOUDIMG) // 加载纹理
    const geometry = new THREE.PlaneGeometry(width, height) // 创建平面
    const material = new THREE.MeshBasicMaterial({ // 创建材质
        map: texture, // 纹理
        side: THREE.DoubleSide, // 渲染双面
        transparent: true, // 透明
        depthTest: false, // 深度测试
        blending: THREE.AdditiveBlending, // 混合模式
    })
    const plane = new THREE.Mesh(geometry, material) // 创建平面
    scene.add(plane) // 添加到场景
    return plane
}

在onMounted中调用该函数然后传入宽高即可,如下可以看到我们的星云已经加载出来了:

接下来我们给星云设置运动效果,这里借助three中的CatmullRomCurve3创建3维曲线:

// 渲染星云的运动效果
const renderCloudMove = (cloud, route, speed) => {
    let cloudProgress = 0 // 星云位置
    // 创建三维曲线
    const curve = new THREE.CatmullRomCurve3(route)
    // 创建星云的运动轨迹
    return () => {
        if(cloudProgress <= 1) {
            cloudProgress += speed
            const point = curve.getPoint(cloudProgress) // 获取当前位置
            if (point && point.x) {
                cloud.position.set(point.x, point.y, point.z) // 设置位置
            }
        } else {
            cloudProgress = 0
        }
    }
}

在onMounted中我们调用两片星云被返回两个函数:

onMounted(() => {
    login.value.appendChild(renderer.domElement) // 添加渲染器到div中
    initSceneStar(initZposition) // 初始化星星
    zprogress_first = initSceneStar(zprogress1) // 初始化点1
    zprogress_second = initSceneStar(zprogress2) // 初始化点2
    cloudFirst = renderCloud(400, 200)
    cloudSecond = renderCloud(200, 100)
    renderCloudFirst = renderCloudMove(cloudFirst, [
        new THREE.Vector3(-window.innerWidth / 10, 0, -1400 / 2),
        new THREE.Vector3(-window.innerWidth / 4, window.innerHeight / 8, 0),
        new THREE.Vector3(-window.innerWidth / 4, 0, zAxisNumber),
    ], 0.0002)
    renderCloudSecond = renderCloudMove(cloudSecond, [
        new THREE.Vector3(window.innerWidth / 8, window.innerHeight / 8, -1400 / 2),
        new THREE.Vector3(window.innerWidth / 8, window.innerHeight / 8, zAxisNumber),
    ], 0.0008)
    render()    
})

在渲染函数中,我们调用这两个函数,进行星云的运动:

// 创建两片星云
let cloudFirst
let cloudSecond
// 创建星云的渲染函数
let renderCloudFirst
let renderCloudSecond

// 设置渲染函数
const render = () =>{ 
  controls.update()
  renderer.render(scene, camera)
  requestAnimationFrame(render)
  renderSphereRotate() // 自转
  renderStarMove() // 星星移动
  renderCloudFirst() // 云1运动
  renderCloudSecond() // 云2运动
}

最终达到的效果如下:

实现登录框效果

 ok,3D背景已经完成了,这里我们将上面实现的three场景单独放在一个新的组件login-bg中,在该组件中我们设置一下一个大的背景图片,通过定位设置在底部即可,如下:

<template>
    <div class="loginBg">
        <div class="login" ref="login"></div>
        <div class="bg"></div>
    </div>
</template>

<style scoped lang="scss">
.loginBg {
    width: 100%;
    height: 100vh;
    position: relative;
    .login {
        width: 100%;
        height: 100%;
    }
    .bg {
        position: absolute;
        width: 100%;
        height: 400px;
        background-image: url("../../assets/images/ground.png");
        bottom: 0;
    }
}
</style>

效果如下:

ok,接下来我们开始设置表单登录框的样式了,效果还不错:

接下来设置一个背景人物,让其悬浮在登录框的右上角,然后通过css动画使其上下运动:

css样式如下:

// 背景人物
.moving-image {
    position: absolute;
    top: 120px; /* 初始位置 */
    left: 1000px; /* 初始位置 */
    z-index: 1000;
    animation: moveUpDown 2s infinite; /* 应用动画,循环播放 */
}
@keyframes moveUpDown {
    0% { transform: translateY(0); }
    50% { transform: translateY(-20px); }
    100% { transform: translateY(0); }
}

最终的效果如下,有那味了!

后面收集一下表单数据,判断登录然后进行页面跳转即可:

// 收集表单数据
let loginForm = reactive({
    username: '',
    password: '',
})
let router = useRouter()

// 路由跳转
const goHome = () => {
    if (loginForm.username === '' || loginForm.password === '') {
        ElNotification({
            type: 'error',
            message: "用户名和密码不能为空",
        })

    } else {
        router.push('/home')
    }
}

效果如下,后面根据token判断登录即可,这里不再赘述,OK,效果达成!

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

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

相关文章

C语言——内存函数的实现和模拟实现

1. memcpy 使用和模拟实现 void * memcpy ( void * destination, const void * source, size_t num ); 函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。 这个函数在遇到 \0 的时候并不会停下来。 如果source和destination有任何的重叠&am…

高级数据结构与算法习题(7)

一、单选题 1、When solving a problem with input size N by divide and conquer, if at each stage the problem is divided into 8 sub-problems of equal size N/3, and the conquer step takes O(N2logN) to form the solution from the sub-solutions, then the overall…

【Docker系列】容器访问宿主机的Mysql

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

flutter material中的Icon组件的IconData 查阅

查阅 https://fonts.google.com/icons?selectedMaterialSymbolsOutlined:expand_less:FILL0;wght300;GRAD0;opsz24&icon.platformandroidhttps://fonts.google.com/icons?selectedMaterialSymbolsOutlined:expand_less:FILL0;wght300;GRAD0;opsz24&icon.platformand…

mysql报错-mysql服务启动停止后,某些服务在未由其他服务或程序使用时将自动停止和数据恢复

启动mysql服务时出现该错误: 本地计算机上的mysql服务启动停止后,某些服务在未由其他服务或程序使用时将自动停止。 我的mysql版本是8.0.18 系统&#xff1a;win10 如何安装mysql&#xff0c;可以看我这一篇文章&#xff1a;mysql的安装 ---必会 - bigbigbrid - 博客园 (cn…

2024 EasyRecovery三分钟帮你恢复 电脑硬盘格式化

随着数字化时代的到来&#xff0c;我们的生活和工作中越来越依赖于电子设备。然而&#xff0c;电子设备中的数据丢失问题也随之而来。数据丢失可能是由各种原因引起的&#xff0c;如硬盘故障、病毒感染、误删除等。面对这种情况&#xff0c;一个高效、可靠的数据恢复工具变得尤…

【御控物联】Java JSON结构转换(1):对象To对象——键值互换

文章目录 一、JSON是什么&#xff1f;二、JSON结构转换是什么&#xff1f;三、核心构件之转换映射四、案例之《JSON对象 To JSON对象》五、代码实现六、在线转换工具七、技术资料 一、JSON是什么&#xff1f; Json&#xff08;JavaScript Object Notation&#xff09;产生于20…

SkyWalking 为所有的API接口增加 tag

背景胡扯 线上接口报错&#xff0c;接着被 SkyWalking 抓到&#xff0c;然后 SkyWalking 触发告警&#xff0c;最后老板你&#xff0c;让你辛苦一下&#xff0c;在明早上班前把这个bug 改了&#xff0c;并告诉你你是全公司的希望。谁说不是呢&#xff1f;为公司业务保驾护航&a…

Opencv3.4+FFMpeg3.4+pkg-config交叉编译arm开发板

Ubuntu16.04 64位 FFmpeg3.4 OpenCv3.4 一、下载FFmpeg https://github.com/FFmpeg/FFmpeg 1.配置 ./configure --prefix/home/zeng/ffmpeg_install --enable-cross-compile --cross-prefixarm-linux-gnueabihf- --ccarm-linux-gnueabihf-gcc --target-oslinux --cpuco…

nginx的启动,systemd管理

service unit file文件通常由三部分组成&#xff1a; [Unit]&#xff1a;定义与Unit类型无关的通用选项&#xff1b;用于提供unit的描述信息、unit行为及依赖关系等 [Service]&#xff1a;与特定类型相关的专用选项&#xff1b;此处为Service类型 [Install]&#xff1a;定义…

CTFshow-PWN-前置基础(pwn6-pwn9)

1、pwn6 立即寻址方式结束后eax寄存器的值为&#xff1f; 截取关键代码 ; 立即寻址方式mov eax, 11 ; 将11赋值给eaxadd eax, 114504 ; eax加上114504sub eax, 1 ; eax减去1 mov 用于赋值&#xff0c;将右边立即数加载到左边的寄存器 eax 中&#xff1b…

电商的未来:回归传统的力量

引言 随着拼多多的崛起&#xff0c;淘宝的市场地位受到了挑战。马云在阿里巴巴内网发表的《致改革 致创新》一文中&#xff0c;呼吁直面问题与未来&#xff0c;但具体的改革与创新方向尚未明晰。本文将探讨电商的未来&#xff0c;提出一个观点&#xff1a;电商的真正未来不在于…

网络安全-自学笔记

一、自学网络安全学习的误区和陷阱 1.不要试图先成为一名程序员&#xff08;以编程为基础的学习&#xff09;再开始学习 我在之前的回答中&#xff0c;我都一再强调不要以编程为基础再开始学习网络安全&#xff0c;一般来说&#xff0c;学习编程不但学习周期长&#xff0c;而…

leaflet知识点:地图窗格panes的应用

一&#xff0c;需求背景 地图中存在无人机&#xff0c;停机坪&#xff0c;航线三个图层&#xff0c;需要实现无人机图层显示在最上面&#xff0c;停机坪图层显示在最下面&#xff0c;航线图层显示在中间。 二&#xff0c;遇到问题 由下图可知航线图层所在overlayPane窗格的z-…

基于SSM项目高校在线请假与审批系统

采用技术 基于SpringBoot框架实现的web的智慧社区系统的设计与实现~ 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringMVCMyBatis 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 简介 本系统实现了管理员&#xff0c;教师&#xff0c;学生三个模…

OpenHarmony开发实例:【分布式游戏鉴权应用】

1.介绍 本文将介绍分布式游戏鉴权应用。操作过程为&#xff1a; 设备A点击“开始游戏”按钮&#xff0c;开始搜索周边设备。 设备A显示周边设备&#xff0c;点击设备B并发起连接请求&#xff0c;远程拉起设备B的FA。 设备B收到请求后&#xff0c;选择是否允许“开启游戏”。…

【大语言模型】基础:TF-IDF

TF-IDF (Term Frequency-Inverse Document Frequency) 是一种用于信息检索与文本挖掘的统计方法&#xff0c;用来评估一个词对于一个文件集或一个语料库中的其中一份文件的重要性。它是一种常用于文本处理和自然语言处理的权重计算技术。 原理 TF-IDF 由两部分组成&#xff1…

获取淘宝京东商品详情API接口返回数据解析说明(可测试,批量获取)

获取淘宝和京东的商品详情API接口返回数据并解析通常需要遵循以下几个步骤&#xff1a; 淘宝商品详情API 淘宝的API接口通常对商家和合作伙伴开放&#xff0c;并且需要经过严格的申请和审核流程。普通用户或未经授权的开发者通常无法直接访问淘宝的商品详情API。 如果你已经…

广东莱斯广告,6.8米UV喷印推动粤东喷绘产业升级

广东莱斯广告作为汕头市大型的广告服务运营商,近日迎来了一件值得庆祝的事情:彩神6.8米UV喷印机运行一周年,销售服务商深圳嘉豪总经理李伟特地前来回访。该设备是深圳润天智数字设备股份有限公司开发的全球首台搭载XTRA6800H柯尼卡喷头的设备,设备特点是:1.色彩艳丽;2.超宽喷印…

【YOLOV5 入门】——Pyside6/PyQt5可视化UI界面后端逻辑

声明&#xff1a;笔记是做项目时根据B站博主视频学习时自己编写&#xff0c;请勿随意转载&#xff01; 一、环境安装 VScode/Pycharm终端进入虚拟环境后&#xff0c;输入下面代码安装pyside6&#xff0c;若用的Pycharm作为集成开发环境&#xff0c;也下载个pyqt5&#xff1a; …