当前位置: 首页 > news >正文

wordpress 访客 用户/seo排名赚挂机

wordpress 访客 用户,seo排名赚挂机,好的网站模板,公司注册代办的坑什么是three.js Three.js是一款运行在浏览器中的 3D 引擎(基于WebGL的API的封装) 什么是WebGL? WebGL(英语:Web Graphics Library)是一种3D绘图协议,这种绘图技术标准允许把JavaScript和Open…

什么是three.js

Three.js是一款运行在浏览器中的 3D 引擎(基于WebGL的API的封装)

什么是WebGL?

WebGL(英语:Web Graphics Library)是一种3D绘图协议,这种绘图技术标准允许把JavaScript和OpenGL ES 2.0结合在一起,通过增加OpenGL ES 2.0的一个JavaScript绑定,WebGL可以为HTML5 Canvas提供硬件3D加速渲染,这样Web开发人员就可以借助系统显卡来在浏览器里更流畅地展示3D场景和模型了,还能创建复杂的导航和数据视觉化。显然,WebGL技术标准免去了开发网页专用渲染插件的麻烦,可被用于创建具有复杂3D结构的网站页面,甚至可以用来设计3D网页游戏等等。

three.js

本地环境搭建,因为spring的官方文档是访问起来比较慢,所以我们在本地搭建起来three.js的官方文档和案例

首先访问https://github.com/mrdoob/three.js 通过 git或者压缩包把代码下载到本地

使用parcel搭建three.js开发环境

为什么需要使用parcel 因为parcel不需要配置。webpack需要去进行配置。

第一个Three.js小demo

import * as THREE from "three";
//轨道控制器
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls";//创建场景const scence=new THREE.Scene();//创建相机const camera=new THREE.PerspectiveCamera(75,window.innerWidth/window.innerHeight,0.1,1000
)//设置相机位置camera.position.set(0,0,10);//添加相机到场景
scence.add(camera);//创建物体//创建几何体
const geometry=new THREE.BoxGeometry(1,1,1);
//创建材质
const meterial=new THREE.MeshBasicMaterial({color:0x00ff00});//根据几何体和材质,创建物体
const  cube=new THREE.Mesh(geometry,meterial);//控制物体移动let x=0,y=1,z=0;console.log(cube);//缩放cube.scale.set(.5,1,1.5);//旋转//   cube.rotation.set(Math.PI/2,Math.PI*2,Math.PI/3,"YXZ");
cube.rotation.set(Math.PI/4,0,0,"YZX");
//将物体添加到场景中scence.add(cube);//初始化渲染器const renderer=new THREE.WebGLRenderer();//设置渲染器的尺寸大小renderer.setSize(window.innerWidth,window.innerHeight);//将webgl渲染的fcanvas内容添加到bodydocument.body.append(renderer.domElement);
//添加坐标轴辅助器const axesHelper = new THREE.AxesHelper( 5 );
scence.add( axesHelper );//添加控制器,只有添加了控制器才能拖动查看const controller=new OrbitControls(camera,renderer.domElement);//每一帧渲染一次
const render=()=>{x+=0.01;y+=0.01;z+=0.01;if(x >5|| y >5 || z>5){x=0;y=0;z=0;}cube.position.set(x,y,z);cube.rotation.x+=0.01;//使用渲染器,通过相机将场景渲染出来renderer.render(scence,camera);// requestAnimationFrame函数是浏览器提供了,浏览器每次请求一帧则执行一次回调requestAnimationFrame(render);
}
render();

应用requestAnimationFrame

import * as THREE from "three";
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls";
const scence=new THREE.Scene();
const camera=new THREE.PerspectiveCamera(75,window.innerWidth/window.innerHeight,0.1,1000
)
camera.position.set(0,0,10);
scence.add(camera);
const geometry=new THREE.BoxGeometry(1,1,1);
const meterial=new THREE.MeshBasicMaterial({color:0x00ff00});
const  cube=new THREE.Mesh(geometry,meterial);let x=0,y=1,z=0;console.log(cube);cube.scale.set(.5,1,1.5);
cube.rotation.set(Math.PI/4,0,0,"YZX");
scence.add(cube);
const renderer=new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth,window.innerHeight);
document.body.append(renderer.domElement);
const axesHelper = new THREE.AxesHelper( 5 );
scence.add( axesHelper );
const controller=new OrbitControls(camera,renderer.domElement);
const render=(time)=>{/*** time参数表示每一帧的时间* * * x+=0.01;y+=0.01;z+=0.01;* * 像这样每次加0.1是不对的,因为电脑的性能问题,会导致物体运动的不一样。* 所以我们需要让物体有规律的运行* * *///比如设置1秒运动多少const t=time/1000 %5;cube.rotation.x=t*1;x=t*1,y=t*1,z=t*1;cube.position.set(x,y,z);renderer.render(scence,camera);requestAnimationFrame(render);
}
render();

Gsap动画库(简单使用)

是一个功能十分强大的动画平台,能够帮助我们实现大部分的动画需求,构建高性能的适用于所有主流浏览器的高性能动画。

首先进行安装

  • yarn add gsap
import * as THREE from "three";
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls";
import gsap from "gsap";//创建场景const scence=new THREE.Scene();//创建相机const camera=new THREE.PerspectiveCamera(75,window.innerWidth/window.innerHeight,0.1,1000
)//设置相机位置camera.position.set(0,0,10);//添加相机到场景
scence.add(camera);//创建物体//创建集合体
const geometry=new THREE.BoxGeometry(1,1,1);
//创建材质
const meterial=new THREE.MeshBasicMaterial({color:0x00ff00});//根据几何体和材质,创建物体
const  cube=new THREE.Mesh(geometry,meterial);//控制物体移动let x=0,y=1,z=0;console.log(cube);//缩放cube.scale.set(.5,1,1.5);//旋转//   cube.rotation.set(Math.PI/2,Math.PI*2,Math.PI/3,"YXZ");
cube.rotation.set(Math.PI/4,0,0,"YZX");
//将物体添加到场景中scence.add(cube);//初始化渲染器const renderer=new THREE.WebGLRenderer();//设置渲染器的尺寸大小renderer.setSize(window.innerWidth,window.innerHeight);//将webgl渲染的fcanvas内容添加到bodydocument.body.append(renderer.domElement);
//添加坐标轴辅助器const axesHelper = new THREE.AxesHelper( 5 );
scence.add( axesHelper );//添加控制器,只有添加了控制器才能拖动查看const controller=new OrbitControls(camera,renderer.domElement);
controller.enableDamping=true
//使用gsap的动画,来帮助我们设置物体的运动
gsap.to(cube.position, {x:5, duration: 2.5, ease: "power2.in" });
//每一帧渲染一次
const render=(time)=>{//使用渲染器,通过相机将场景渲染出来renderer.render(scence,camera);// requestAnimationFrame函数是浏览器提供了,浏览器每次请求一帧则执行一次回调requestAnimationFrame(render);controller.update();
}
render();

监听画面变化,更新渲染画面

现在可以看到,当我们的浏览器的尺寸变化时,我们的渲染画面是没有跟着变的。所以我们需要监听画面的变化更新渲染页面。

//监听页面变化,更新摄像头
window.addEventListener("resize",()=>{//更新摄像头camera.aspect=window.innerWidth/window.innerHeight;//更新摄影机的摄像矩阵camera.updateProjectionMatrix();//更新渲染器renderer.setSize(window.innerWidth,window.innerHeight);//设置渲染器的像素比renderer.setPixelRatio(window.devicePixelRatio);
})
render();

js控制画面全屏与退出全屏

一般都是双击屏幕进入全屏,所以我们写双击进入&退出全屏

//给window绑定双击事件
window.addEventListener("dblclick",()=>{//获取浏览器当前的全屏对象/*** 这里因为不同浏览器的兼容,所以我们使用两个*/const fullScreenElement =document.fullScreenElement|| document.webkitFullscreenElement//当为null的时候,我们调用canvas的dom,请求进入全屏if(!fullScreenElement){renderer.domElement.requestFullscreen();}else{//直接使用document退出全屏document.exitFullscreen();}});

dat.gui

dat.gui是一个轻量级的控制器,它可以在界面上来进行操作变量。
在webgl里就是一个控制器,通过控制器来进行物体的控制。


import * as THREE from "three";
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls";
import gsap from "gsap";
import * as datGui from 'dat.gui';
//创建场景const scence = new THREE.Scene();//创建相机const camera = new THREE.PerspectiveCamera(75,window.innerWidth / window.innerHeight,0.1,1000
)camera.position.set(0, 0, 10);
scence.add(camera);
const geometry = new THREE.BoxGeometry(1, 1, 1);
const meterial = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
const cube = new THREE.Mesh(geometry, meterial);
let x = 0, y = 1, z = 0;
cube.scale.set(.5, 1, 1.5);
cube.rotation.set(Math.PI / 4, 0, 0, "YZX");scence.add(cube);const renderer = new THREE.WebGLRenderer();renderer.setSize(window.innerWidth, window.innerHeight);document.body.append(renderer.domElement);const axesHelper = new THREE.AxesHelper(5);
scence.add(axesHelper);const controller = new OrbitControls(camera, renderer.domElement);const gui = new datGui.GUI();//添加控制物体移动
gui.add(cube.position, 'x').min(0).max(5).step(0.01).name('移动x轴').onChange(value => {console.log("值被改变", value);}).onFinishChange(value => {{console.log("停止修改", value);}});const params = {color: '#ffff00',fn: () => { //这里的fn与下边的添加事件是对应的gsap.to(cube.position, { x: 5, duration: 2, yoyo: true, repeat: -1 });}
}
//颜色控制
gui.addColor(params, 'color').onChange(value => {cube.material.color.set(value);
});
//选项框
gui.add(cube, 'visible').name('是否显示');
//添加文件夹
const folder = gui.addFolder('设置立方体');
//添加文件夹内容
folder.add(cube.material, 'wireframe');
//添加点击事件
gui.add(params, 'fn').name('点击运动')
const render = () => {renderer.render(scence, camera);requestAnimationFrame(render);
}
render();

认识ThreeJs物体

几何体

在three.js中所有的几何体都是基于BufferGeomatry的基础上来进行构建的。

BufferGeomatry里有三个基础属性postion(位置),normar(法向量),uv(顶点);比如说我们一个矩形的立方体,有6个面,每个面又4个顶点,就是24个顶点,然后每个顶点又x,y,z三个方向上的位置,那么这里的数据就是72个。我们可以根据顶点的位置去进行添加材质和进行贴图。我们可以通过uv来进行我们的一个材质贴图。normal的作用呢就是顶点的法向量它的作用呢就是比如有一束光进行,我们需要知道这个光的一个折射位置和面的一个朝向。

通过BufferGeomatry来创建矩形

三个顶点就可以创建一个面

import * as THREE from "three";
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls";
import gsap from "gsap";
import * as datGui from 'dat.gui';
const scence = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75,window.innerWidth / window.innerHeight,0.1,1000
)
camera.position.set(0, 0, 10);
scence.add(camera);//创建基础的几何体
const geometry = new THREE.BufferGeometry();
const meterial = new THREE.MeshBasicMaterial({ color: 0x00ff00 });//设置材质//顶点位置 (由两个三角形片组成一个矩形,一个三角形片是三个顶点,两个就是六个顶点,一个顶点有三个位置所以是长度是18的一维数组)
const vertices =new Float32Array([-1.0, -1.0, 1.0,1.0, -1.0, 1.0,1.0,1.0,1.0,1.0,1.0,1.0,-1.0,1.0,1.0,-1.0,-1.0,1.0
]);//设置顶点 (每三个数据为一个顶点)
geometry.setAttribute('position',new THREE.BufferAttribute(vertices,3));
const mesh=new THREE.Mesh(geometry,meterial);
scence.add(mesh);
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.append(renderer.domElement);
const axesHelper = new THREE.AxesHelper(5);
scence.add(axesHelper);
const controller = new OrbitControls(camera, renderer.domElement);
const render = () => {renderer.render(scence, camera);requestAnimationFrame(render);
}
render();

根据顶点创建酷炫三角形

//创建50个三角形,形成凌乱穿插效果
for (let i = 0; i < 50; i++) {const geometry = new THREE.BufferGeometry();//顶点坐标const positionArray = new Float32Array(9);//三个顶点组成一个三角形,每个顶点需要x,y,z三个坐标for (let j = 0; j < 9; j++) {positionArray[j] = Math.random() * 5;}geometry.setAttribute('position', new THREE.BufferAttribute(positionArray, 3));//颜色进行随机const color = new THREE.Color(Math.random(), Math.random(), Math.random());//创建材质const meterial = new THREE.MeshBasicMaterial({color,transparent: true,//保持透明,opacity: .5 //透明度});const mesh = new THREE.Mesh(geometry, meterial);scence.add(mesh);
}

常用的网格几何体

three.js中给我们提供了很多的几何体我们可以去进行使用,不用自己再去进行设置一个很多顶点。

我们都可以通过在文档中去查找几何体,然后通过设置他们的构造参数来得到想要的物体。

认识Three的材质

上一个我们说到了物体,也就是几何体,我们通过几何体与材质进行一个贴合,才构建成了我们的一个物体。

基本颜色材质搭建

import * as THREE from "three";
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls";
import gsap from "gsap";
import * as datGui from 'dat.gui';
const scence = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75,window.innerWidth / window.innerHeight,0.1,1000
)
camera.position.set(0, 0, 10);
scence.add(camera);
const renderer = new THREE.WebGLRenderer();
// 创建一个正方体
const geometry = new THREE.BoxGeometry(1, 1, 1);
//导入纹理
const textureLoader=new THREE.TextureLoader().load('./public/door.jpg');
//创建材质
/*** map是颜色材质纹理,具体的我们可以看文档*/
const material = new THREE.MeshBasicMaterial({ map:textureLoader});
const cube = new THREE.Mesh(geometry, material);
scence.add(cube);
renderer.setSize(window.innerWidth, window.innerHeight);document.body.append(renderer.domElement);const axesHelper = new THREE.AxesHelper(5);
scence.add(axesHelper);const controller = new OrbitControls(camera, renderer.domElement);const render = () => {renderer.render(scence, camera);requestAnimationFrame(render);
}
render();

纹理偏移 旋转 重复

three.js给我们提供了,纹理在物体上如何进行设置(旋转,偏移,重复)

import * as THREE from "three";
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls";
import gsap from "gsap";
import * as datGui from 'dat.gui';
const scence = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75,window.innerWidth / window.innerHeight,0.1,1000
)
camera.position.set(0, 0, 10);
scence.add(camera);
const renderer = new THREE.WebGLRenderer();
const geometry = new THREE.BoxGeometry(1, 1, 1);
const texture = new THREE.TextureLoader().load('./public/door.jpg');
//纹理偏移
// texture.offset.set(0.5,0.5);//纹理旋转
//texture.rotation=Math.PI/4;
//texture.center.set(0.5,0.5); //设置旋转原点//纹理重复texture.repeat.set(2, 3);
texture.wrapS=THREE.MirroredRepeatWrapping;
texture.wrapT=THREE.RepeatWrapping;
/*** wrapS 指代的是水平方向上纹理重复如何包裹* wrapT 指代的是垂直方向上纹理重复如何包裹* MirroredRepeatWrapping和RepeatWrapping是three.js提供的常量值*/
const material = new THREE.MeshBasicMaterial({ map: texture });
const cube = new THREE.Mesh(geometry, material);
scence.add(cube);
renderer.setSize(window.innerWidth, window.innerHeight);document.body.append(renderer.domElement);const axesHelper = new THREE.AxesHelper(5);
scence.add(axesHelper);const controller = new OrbitControls(camera, renderer.domElement);const render = () => {renderer.render(scence, camera);requestAnimationFrame(render);
}
render();

纹理的显示算法

magFilter,就是在渲染时一个纹素覆盖多个屏幕项目的情况下如何对这些纹素采样确定最终的颜色,
当使用THREE.LinerFilter时,它表示贴图将使用四个最接近的纹素,并在它们之间进行双线性插值。
当设置为THREE.NearestFilter时,它表示贴图将使用最接近的单个纹素的值,这意味着只会考虑最接近的一个纹素,而不考虑周围其他的纹素。

minFilter 当一个纹素小于一个屏幕像素时的设置

透明纹理

透明纹理的含义的就是,比如我们的门的图片,它展示的不仅仅是一个门的形状,它还包括边缘的一些形状,那么怎么办呢?three.js的材质里提供了属性alphaMap,它可以通过导入进来的材质图片,导入的材质图片吧必须只有黑色和白色,黑色就是完全透明,白色就是完全不透明,贴入之后,来展示形状,比如我们第二个导入进来的黑白图片,白色的就只是一个门的形状,在贴入之后我们就只能看到门了。

import * as THREE from "three";
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls";
import gsap from "gsap";
import * as datGui from 'dat.gui';
const scence = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75,window.innerWidth / window.innerHeight,0.1,1000
)
camera.position.set(0, 0, 10);
scence.add(camera);
const renderer = new THREE.WebGLRenderer();
const geometry = new THREE.BoxGeometry(1, 1, 1);
const texture = new THREE.TextureLoader().load('./public/door.jpg');
//导入透明材质纹理图片
const alphaMap=new THREE.TextureLoader().load('./public/door_opticy.jpeg');
const material = new THREE.MeshBasicMaterial({ map: texture,alphaMap, // 透明材质transparent:true, //透明side:THREE.DoubleSide  //单面 || 双面显示});
const cube = new THREE.Mesh(geometry, material);
scence.add(cube);
renderer.setSize(window.innerWidth, window.innerHeight);document.body.append(renderer.domElement);const axesHelper = new THREE.AxesHelper(5);
scence.add(axesHelper);const controller = new OrbitControls(camera, renderer.domElement);const render = () => {renderer.render(scence, camera);requestAnimationFrame(render);
}
render();

环境遮挡贴图

环境贴图,就是比如我们的门,门上的一些纹理,我们需要显示的更加真实。

import * as THREE from "three";
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls";
import gsap from "gsap";
import * as datGui from 'dat.gui';
const scence = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75,window.innerWidth / window.innerHeight,0.1,1000
)
camera.position.set(0, 0, 10);
scence.add(camera);
const renderer = new THREE.WebGLRenderer();
const geometry = new THREE.BoxGeometry(1, 1, 1);
const texture = new THREE.TextureLoader().load('./public/door.jpg');
const alphaMap=new THREE.TextureLoader().load('./public/door_opticy.jpeg');
//引入环境贴图的图片
const aoMap=new THREE.TextureLoader().load('./public/aoDoor.jpg');
const material = new THREE.MeshBasicMaterial({ map: texture,alphaMap,transparent:true,aoMap,side:THREE.DoubleSide });//规定,使用aoMap环境贴图的话需要给几何体添加第二组uv
geometry.setAttribute('uv2',new THREE.BufferAttribute(geometry.attributes.uv.array,2));
const cube = new THREE.Mesh(geometry, material);scence.add(cube);
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.append(renderer.domElement);const axesHelper = new THREE.AxesHelper(5);
scence.add(axesHelper);const controller = new OrbitControls(camera, renderer.domElement);const render = () => {renderer.render(scence, camera);requestAnimationFrame(render);
}
render();

相关文章:

three.js之初识three.js

什么是three.js Three.js是一款运行在浏览器中的 3D 引擎&#xff08;基于WebGL的API的封装&#xff09; 什么是WebGL&#xff1f; WebGL&#xff08;英语&#xff1a;Web Graphics Library&#xff09;是一种3D绘图协议&#xff0c;这种绘图技术标准允许把JavaScript和Open…...

二维码智慧门牌管理系统:地址管理的现代革命

文章目录 前言一、标准地址的革新二、广泛的应用前景 前言 在科技不断发展和社会进步的背景下&#xff0c;高效、精准、智能的管理系统已经成为当今社会的迫切需求。传统的门牌管理系统在应对这一需求方面已显得力不从心&#xff0c;因此&#xff0c;二维码智慧门牌管理系统的…...

BricsCAD 23 for Mac:轻松驾驭CAD建模的强大工具

如果你正在寻找一款功能强大、操作简便的CAD建模软件&#xff0c;那么BricsCAD 23 for Mac绝对值得你考虑。这款软件将为你提供一套完整的2D和3D设计解决方案&#xff0c;让你在Mac上轻松创建、编辑和修改图形。 一、BricsCAD 23的功能特点 高效的2D和3D建模&#xff1a;Bric…...

如何利用Web应用防火墙应对未知威胁

网络安全是一个永恒的话题&#xff0c;尤其是在未知威胁不断涌现的情况下。Web应用防火墙&#xff08;WAF&#xff09;是企业网络安全防线的重要组成部分&#xff0c;能够帮助企业在面对未知威胁时采取有效的防护措施。本文将探讨如何利用Web应用防火墙应对未知的网络威胁。 一…...

四、多线程服务器

1.进程的缺陷和线程的优点 1.进程的缺陷 创建进程&#xff08;复制&#xff09;的工作本身会给操作系统带来相当沉重的负担。 而且&#xff0c;每个进程具有独立的内存空间&#xff0c;所以进程间通信的实现难度也会随之提高。 同时&#xff0c;上下文切换&#xff08;Cont…...

基于vue实现滑块动画效果

主要实现&#xff1a;通过鼠标移移动、触摸元素、鼠标释放、离开元素事件来进行触发 创建了一个滑动盒子&#xff0c;其中包含一个滑块图片。通过鼠标按下或触摸开始事件&#xff0c;开始跟踪滑块的位置和鼠标/触摸位置之间的偏移量。然后&#xff0c;通过计算偏移量和起始时的…...

探寻蓝牙的未来:从蓝牙1.0到蓝牙5.4,如何引领无线连接革命?

►►►蓝牙名字的来源 这要源于一个小故事&#xff0c;公元940-985年&#xff0c;哈洛德布美塔特(Harald Blatand)&#xff0c;后人称Harald Bluetooth&#xff0c;统一了整个丹麦。他的名字“Blatand”可能取自两个古老的丹麦词语。“bla”意思是黑皮肤的&#xff0c;而“tan…...

openssl 之 RSA加密数据设置OAEP SHA256填充方式

背景 如题 环境 openssl 1.1.1l c centos7.9 代码 /** 思路&#xff1a;填充方式自己写&#xff0c;不需要使用库提供的&#xff0c;然后加密时选择不填充的方式加密 关键代码 */ int padding_result RSA_padding_add_PKCS1_OAEP_mgf1(buf, padding_len, (unsigned char*…...

js将带标签的内容转为纯文本

背景&#xff1a;现需要将富文本的所有 html 标签全部删除得到纯文本 思路&#xff1a;创建临时DOM元素并获取其中的文本 创建一个临时 DOM 并给他赋值&#xff0c;然后我们使用 DOM 对象方法提取文本。 代码如下&#xff1a; convertToPlain( html){//新创建一个 divvar di…...

如何通过内网穿透实现远程连接NAS群晖drive并挂载电脑硬盘?

文章目录 前言1.群晖Synology Drive套件的安装1.1 安装Synology Drive套件1.2 设置Synology Drive套件1.3 局域网内电脑测试和使用 2.使用cpolar远程访问内网Synology Drive2.1 Cpolar云端设置2.2 Cpolar本地设置2.3 测试和使用 3. 结语 前言 群晖作为专业的数据存储中心&…...

4.2 抽象类

1. 抽象类概念 定义一个类时&#xff0c;常常需要定义一些成员方法用于描述类的行为特征&#xff0c;但有时这些方法的实现方式是无法确定的。例如&#xff0c;Animal类中的shout()方法用于描述动物的叫声&#xff0c;但是不同的动物&#xff0c;叫声也不相同&#xff0c;因此…...

ITextRenderer将PDF转换为HTML详细教程

引入依赖 <dependency><groupId>org.xhtmlrenderer</groupId><artifactId>flying-saucer-pdf-itext5</artifactId><version>9.1.18</version></dependency> 问题一&#xff1a;输出中文字体 下载字体simsun.ttc 下载链接&am…...

c#设计模式-行为型模式 之 备忘录模式

&#x1f680;简介 备忘录模式&#xff08;Memento Pattern&#xff09;是一种行为型设计模式&#xff0c;它保存一个对象的某个状态&#xff0c;以便在适当的时候恢复对象。所谓备忘录模式就是在不破坏封装的前提下&#xff0c;捕获一个对象的内部状态&#xff0c;并在该对象…...

ffmpeg+安卓+yolo+RK3399部署

一次满足多项需求. 首先, 思路是, 使用ffmpeg解码本地mp4文件, 在无需任何其他改动的情况下, 就可以直接播放rtsp流, 这个是使用ffmpeg的好处. ffmpeg本身是c语言的, 所以需要编译成jni的库, https://note.youdao.com/s/6XeYftc 具体过程在这里, 用windows/macOS, Ubuntu应该都…...

发电机教程:小白必学的柴油发电机技巧

柴油发电机监控是关键的能源管理和维护工具&#xff0c;它用于确保持续的电力供应&#xff0c;提高能源效率&#xff0c;并延长发电机的寿命。 随着科技的不断发展&#xff0c;监控系统变得更加智能和高效&#xff0c;使用户能够远程监测和管理柴油发电机的运行状态。 客户案例…...

基础课1——人工智能的分类和层次

1.人工智能的分类 人工智能&#xff08;AI&#xff09;的分类主要有以下几种&#xff1a; 弱人工智能&#xff08;Artificial Narrow Intelligence&#xff0c;ANI&#xff09;&#xff1a;弱人工智能是擅长于单个方面的人工智能&#xff0c;例如战胜象棋世界冠军的人工智能阿…...

C语言复杂表达式与指针高级

一、指针数组与数组指针 1.指针数组VS数组指针 &#xff08;1&#xff09;指针数组&#xff1a;实质是一个数组&#xff0c;因为这个数组中传参的内容全部是指针变量。 &#xff08;2&#xff09;数组指针&#xff1a;实质是一个指针&#xff0c;这个指针指向一个数组 2.分析指…...

【Python从入门到进阶】39、使用Selenium自动验证滑块登录

接上篇《38、selenium关于Chrome handless的基本使用》 上一篇我们介绍了selenium中有关Chrome的无头版浏览器Chrome Handless的使用。本篇我们使用selenium做一些常见的复杂验证功能&#xff0c;首先我们来讲解如何进行滑块自动验证的操作。 一、测试用例介绍 我们要通过sel…...

利用FPGA和CPLD数字逻辑实现模数转换器

数字系统的嵌入式工程师熟悉如何通过使用FPGA和CPLD在其印刷电路板上将各种处理器&#xff0c;存储器和标准功能组件粘合在一起来实现其数字设计的“剩余”。除了这些数字功能之外&#xff0c;FPGA和CPLD还可以使用LVDS输入&#xff0c;简单的电阻电容器&#xff08;RC&#xf…...

上海亚商投顾:沪指震荡调整跌 减肥药、华为概念股持续活跃

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 市场情绪 沪指上个交易日低开后震荡调整&#xff0c;深成指、创业板指盘中跌超1%&#xff0c;宁德时代一度跌超3%&#xff…...

间歇性微服务问题...

在Kubernetes环境中&#xff0c;最近由于特定配置导致Pod调度失败。哪种 Kubernetes 资源类型&#xff08;通常与节点约束相关&#xff09;可能导致此故障&#xff0c;尤其是在未正确定义的情况下&#xff1f; 节点选择器资源配额优先级污点Pod 中断预算 已有 201 人回答了该…...

小程序开发平台源码系统+ 带前后端完整搭建教程

大家好&#xff0c;给大家分享一个小程序开发平台源码系统。这款小程序开发平台中有很多功能&#xff0c;今天主要来给大家介绍一下洗车行业小程序制作的功能。以下是部分核心代码图&#xff1a; 系统特色功能&#xff1a; LBS定位&#xff1a;小程序能够自动显示附近的共享洗…...

外部统一设置了::-webkit-scrollbar { display: none; }如何单独给特定元素开启滚动条设置样式-web页面滚动条样式设置

如果你在外部统一设置了​​::-webkit-scrollbar { display: none; }​​​来隐藏滚动条&#xff0c;但是想要在​​.lever​​元素中单独开启滚动条的样式&#xff0c;你可以使用CSS的级联选择器来覆盖外部样式。 以下是一个示例&#xff0c;展示如何给​​.lever​​单独开启…...

【计算机网络】网络原理

目录 1.网络的发展 2.协议 3.OSI七层网络模型 4.TCP/IP五层网络模型及作用 5.经典面试题 6.封装和分用 发送方(封装) 接收方(分用) 1.网络的发展 路由器&#xff1a;路由指的是最佳路径的选择。一般家用的是5个网口&#xff0c;1个WAN口4个LAN口(口&#xff1a;端口)。可…...

力扣第39题 组合总和 c++ 回溯剪枝题

题目 39. 组合总和 中等 相关标签 数组 回溯 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以列表形式返回。你可以按 任意顺序 返回这些组合。 cand…...

qt软件正常运行的崩溃了定位行号方法

软件&#xff08;debug版exe或者release版exe&#xff09;在正常运行状态下&#xff08;不是gdb调试运行&#xff09;&#xff0c;如果软件崩掉&#xff0c;那么会直接闪退&#xff0c;软件什么也做不了&#xff0c;此时无法保存软件中的状态信息&#xff0c;此外&#xff0c;也…...

软件工程与计算总结(十五)详细设计中面向对象方法下的信息隐藏

软件工程与计算总结&#xff08;十三&#xff09;详细设计中的模块化与信息隐藏 之前的博客中&#xff0c;模块需要隐藏的决策主要由“职责的实现”and“实现的变更”两类&#xff0c;在面向对象方法中&#xff0c;需要做到的就是&#xff1a; 封装类的职责&#xff0c;隐藏职…...

鸿蒙初体验

下载与安装DevEco Studio 在HarmonyOS应用开发学习之前&#xff0c;需要进行一些准备工作&#xff0c;首先需要完成开发工具DevEco Studio的下载与安装以及环境配置。 进入DevEco Studio下载官网&#xff0c;单击“立即下载”进入下载页面。 DevEco Studio提供了Windows版本和…...

hive复合类型的数据查询

hive数据表创建-CSDN博客 --第一个名字以M开头的 访问数组array 数组&#xff08; array) 引用方式 列名 [ 元素索引 _ 以 0 开始 ] select * from emp where emp_name[0] rlike "^M"; -- 出生日期是在 5 几年 访问 Map map 引用方式 列名 ["Key"] selec…...

Notes/Domino 14 Early Access Drop3发布

大家好&#xff0c;才是真的好。 其实上周&#xff0c;就是国庆假期的时候&#xff0c;HCL Notes/Domino 14 Early Access Drop3&#xff08;以下简称EA3&#xff09;就已经发布&#xff0c;而且和传说中的一样&#xff0c;带来了数项惊人的新特性。 我们先讲讲这一版本新特性…...