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

今天简单实现一个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,效果达成!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

软件设计不是CRUD(18):像搭积木一样搭建应用系统(上)——单个应用系统的搭建过程

1、概述 之前的文章本专题花了大量文字篇幅,介绍如何基于业务抽象的设计方式完成应用系统各个功能模块的设计工作。而之所以进行这样的功能模块设计无非是希望这些功能模块在具体的项目实施过程中,能够按照当时的需求快速的、简易的、稳定的、最大可能节约开发成本的形成可用…

提高大型语言模型 (LLM) 性能的四种数据清理技术

原文地址&#xff1a;four-data-cleaning-techniques-to-improve-large-language-model-llm-performance 2024 年 4 月 2 日 检索增强生成&#xff08;RAG&#xff09;过程因其增强对大语言模型&#xff08;LLM&#xff09;的理解、为它们提供上下文并帮助防止幻觉的潜力而受…

关于沃进科技无线模块demo软件移植问题

文章目录 一、无线模块开发测试准备二、开发板硬件三、开发板默认功能上电默认界面功能选择界面数据包发送界面数据包接收显示界面射频性能测试界面参数设置界面固件信息显示界面 四、软件开发软件SDK框图1、射频硬件驱动&#xff08;详见./radio/myRadio_gpio.c&#xff09;2、…

Linux_iptables防火墙学习笔记

文章目录 iptables 概述四表五链iptables 安装启动iptables 配置详解iptables配置文件iptables配置语法iptables常用实例查看规则修改默认规则保存和备份规则恢复备份的规则清空规则放行SSH服务在ubuntu14.04中iptables规则持久化 iptables 概述 主机型 对主机进行保护 网络型…

CSS基础:margin属性4种值类型,4个写法规则详解

你好&#xff0c;我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端的程序媛。大专生&#xff0c;一枚程序媛&#xff0c;感谢关注。回复 “前端基础题”&#xff0c;可免费获得前端基础 100 题汇总&#xff0c;回复 “前端工具”&#xff0c;可获取 Web 开发工具合集 268篇…

pnpm 使用 workspace 报错 ERR_INVALID_THIS

有时候真的感觉如果有一个老师指路&#xff0c;那么遇到的坑真的会少很多。 错误示例&#xff1a; GET https://registry.npmjs.org/rollup%2Fplugin-typescript error (ERR_INVALID_THIS). Will retry in 10 seconds. 2 retries left.原因是什么&#xff1f;原因就是 pnpm 的…

Web中使用Weblogic用户

WebLogic用户&#xff0c;组设置 1. 登录weblogic console, domain结构中选择Security Realms&#xff0c;显示安装时默认创建的Realm &#xff1a; myrealm 2. 点击myrealm, 选择 users and Group&#xff0c; 追加用户和组 选择既存的权限组追加到新规的组中&#xff0c;赋予…

pyenv-win管理windows上多个版本python

pyenv是一款管理多个python版本的工具&#xff0c;可以便捷的切换使用的python版本&#xff0c;但是不支持windows环境&#xff0c;在windows环境需要使用pyenv-win pyenv-win安装 官方介绍的安装方式比较多&#xff0c;在此主要记录一下我习惯的安装方式 下载pyenv-win,可以…

2024-04-15_[UPnP]:详细解析

UPnP 一、论文阅读 1.2 Theory 1.2.1 Geometry of the absolute pose problem α i f i v i R p i t , i 1.. n . \alpha_i \mathbf{f}_i \mathbf{v}_i \mathbf{R} \mathbf{p}_i \mathbf{t} ,i1..n. αi​fi​vi​Rpi​t,i1..n. 其中&#xff1a; P i ∈ R 3 P_i \i…

javaWeb项目-闲置二手物品交易平台功能介绍

项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff1a;Vue、ElementUI 关键技术&#xff1a;springboot、SSM、vue、MYSQL、MAVEN 数据库工具&#xff1a;Navicat、SQLyog 1、Spring Boot框架 …

PHP:IntelliJ IDEA 配置 PHP 开发环境及导入PHP项目

在创建PHP项目之前我们需要安装PHP插件&#xff0c;安装步骤如下&#xff1a;Windows&#xff1a;IntelliJ IDEA Ultimate 安装 PHP 插件-CSDN博客 1、导入已有PHP项目&#xff0c;导入之后选择&#xff0c;File > Setting 选择对应 CLL Interpreter&#xff0c;如果没有操…

麒麟服务器操作系统安装TFTP服务

原文链接&#xff1a;麒麟服务器操作系统安装TFTP服务 Hello&#xff0c;大家好啊&#xff01;今天我们将讨论如何在麒麟服务器操作系统上安装和配置TFTP&#xff08;Trivial File Transfer Protocol&#xff09;服务。TFTP是一种简单的文件传输协议&#xff0c;通常用于无盘工…

9. Spring Boot 日志文件

本篇文章源码位置延续上个章节&#xff1a;SpringBoot_demo 本篇文章内容源码位于上述地址的com/chenshu/springboot_demo/logging包下 1. 日志的作用 发现和定位问题&#xff1a; 日志是程序的重要组成部分&#xff0c;它在系统、程序出现错误或异常时提供诊断和解决问题的线…

07 SQL进阶 -- 集合运算 -- 表的加减法

1. 表的加减法 1.1 什么是集合运算 集合在数学领域表示“各种各样的事物的总和”, 在数据库领域表示记录的集合. 具体来说,表、视图和查询的执行结果都是记录的集合, 其中的元素为表或者查询结果中的每一行。 在标准 SQL 中, 分别对检索结果使用 UNION, INTERSECT, EXCEPT 来…

使用 Tranformer 进行概率时间序列预测实战

使用 Transformers 进行概率时间序列预测实战 通常&#xff0c;经典方法针对数据集中的每个时间序列单独拟合。然而&#xff0c;当处理大量时间序列时&#xff0c;在所有可用时间序列上训练一个“全局”模型是有益的&#xff0c;这使模型能够从许多不同的来源学习潜在的表示。…

神经网络学习笔记——大白话直观理解!

B站梗直哥、梗直哥丶的个人空间-梗直哥丶个人主页-哔哩哔哩视频 什么是神经网络模型?神经网络模型是一种由大量互相连接的神经元构成的算法模型,它受到生物神经元网络的启发,擅长对输入数据进行分类和模式识别。 神经网络模型最擅长的就是个各种分类问题。 神经网络模型最擅…

RN向上向下滑动组件封装(带有渐变色)

这段组件代码逻辑是出事有一个View和下面的块,下面的块也就是红色区域可以按住向上向下滑动,当滑动到屏幕最上面则停止滑动,再向上滑动的过程中,上方的View的背景色也会有个渐变效果,大概逻辑就是这样 代码如下 import React, {useEffect, useRef, useState} from react; impo…

第18天:信息打点-APP资产知识产权应用监控静态提取动态抓包动态调试

第十八天 本课意义 1.如何获取到目标APP信息 2.如何从APP信息中提取资产 一、Web&备案信息&单位名称中发现APP 1.通过查询网站去查询APP信息 https://www.xiaolanben.com/ https://aiqicha.baidu.com/ https://www.qimai.cn/ https://app.diandian.com/ 2.其他…

嵌入式学习day16-22(2024.04.06-13)

文章目录 C语言网络编程socket主机与网络字节序转换inet_addr、inet_aton&#xff08;ip转换&#xff09;inet_ntoa 网络字节序转换为IP字符串端口转换为网络字节序网络字节序转换为端口atoi &#xff08;字符串转换为整数&#xff09; UDP通信流程UDP多进程并发服务器服务端客…