three.js之初识three.js
什么是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 引擎(基于WebGL的API的封装) 什么是WebGL? WebGL(英语:Web Graphics Library)是一种3D绘图协议,这种绘图技术标准允许把JavaScript和Open…...
二维码智慧门牌管理系统:地址管理的现代革命
文章目录 前言一、标准地址的革新二、广泛的应用前景 前言 在科技不断发展和社会进步的背景下,高效、精准、智能的管理系统已经成为当今社会的迫切需求。传统的门牌管理系统在应对这一需求方面已显得力不从心,因此,二维码智慧门牌管理系统的…...
BricsCAD 23 for Mac:轻松驾驭CAD建模的强大工具
如果你正在寻找一款功能强大、操作简便的CAD建模软件,那么BricsCAD 23 for Mac绝对值得你考虑。这款软件将为你提供一套完整的2D和3D设计解决方案,让你在Mac上轻松创建、编辑和修改图形。 一、BricsCAD 23的功能特点 高效的2D和3D建模:Bric…...
如何利用Web应用防火墙应对未知威胁
网络安全是一个永恒的话题,尤其是在未知威胁不断涌现的情况下。Web应用防火墙(WAF)是企业网络安全防线的重要组成部分,能够帮助企业在面对未知威胁时采取有效的防护措施。本文将探讨如何利用Web应用防火墙应对未知的网络威胁。 一…...
四、多线程服务器
1.进程的缺陷和线程的优点 1.进程的缺陷 创建进程(复制)的工作本身会给操作系统带来相当沉重的负担。 而且,每个进程具有独立的内存空间,所以进程间通信的实现难度也会随之提高。 同时,上下文切换(Cont…...
基于vue实现滑块动画效果
主要实现:通过鼠标移移动、触摸元素、鼠标释放、离开元素事件来进行触发 创建了一个滑动盒子,其中包含一个滑块图片。通过鼠标按下或触摸开始事件,开始跟踪滑块的位置和鼠标/触摸位置之间的偏移量。然后,通过计算偏移量和起始时的…...
探寻蓝牙的未来:从蓝牙1.0到蓝牙5.4,如何引领无线连接革命?
►►►蓝牙名字的来源 这要源于一个小故事,公元940-985年,哈洛德布美塔特(Harald Blatand),后人称Harald Bluetooth,统一了整个丹麦。他的名字“Blatand”可能取自两个古老的丹麦词语。“bla”意思是黑皮肤的,而“tan…...
openssl 之 RSA加密数据设置OAEP SHA256填充方式
背景 如题 环境 openssl 1.1.1l c centos7.9 代码 /** 思路:填充方式自己写,不需要使用库提供的,然后加密时选择不填充的方式加密 关键代码 */ int padding_result RSA_padding_add_PKCS1_OAEP_mgf1(buf, padding_len, (unsigned char*…...
js将带标签的内容转为纯文本
背景:现需要将富文本的所有 html 标签全部删除得到纯文本 思路:创建临时DOM元素并获取其中的文本 创建一个临时 DOM 并给他赋值,然后我们使用 DOM 对象方法提取文本。 代码如下: 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. 抽象类概念 定义一个类时,常常需要定义一些成员方法用于描述类的行为特征,但有时这些方法的实现方式是无法确定的。例如,Animal类中的shout()方法用于描述动物的叫声,但是不同的动物,叫声也不相同,因此…...
ITextRenderer将PDF转换为HTML详细教程
引入依赖 <dependency><groupId>org.xhtmlrenderer</groupId><artifactId>flying-saucer-pdf-itext5</artifactId><version>9.1.18</version></dependency> 问题一:输出中文字体 下载字体simsun.ttc 下载链接&am…...
c#设计模式-行为型模式 之 备忘录模式
🚀简介 备忘录模式(Memento Pattern)是一种行为型设计模式,它保存一个对象的某个状态,以便在适当的时候恢复对象。所谓备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象…...
ffmpeg+安卓+yolo+RK3399部署
一次满足多项需求. 首先, 思路是, 使用ffmpeg解码本地mp4文件, 在无需任何其他改动的情况下, 就可以直接播放rtsp流, 这个是使用ffmpeg的好处. ffmpeg本身是c语言的, 所以需要编译成jni的库, https://note.youdao.com/s/6XeYftc 具体过程在这里, 用windows/macOS, Ubuntu应该都…...
发电机教程:小白必学的柴油发电机技巧
柴油发电机监控是关键的能源管理和维护工具,它用于确保持续的电力供应,提高能源效率,并延长发电机的寿命。 随着科技的不断发展,监控系统变得更加智能和高效,使用户能够远程监测和管理柴油发电机的运行状态。 客户案例…...
基础课1——人工智能的分类和层次
1.人工智能的分类 人工智能(AI)的分类主要有以下几种: 弱人工智能(Artificial Narrow Intelligence,ANI):弱人工智能是擅长于单个方面的人工智能,例如战胜象棋世界冠军的人工智能阿…...
C语言复杂表达式与指针高级
一、指针数组与数组指针 1.指针数组VS数组指针 (1)指针数组:实质是一个数组,因为这个数组中传参的内容全部是指针变量。 (2)数组指针:实质是一个指针,这个指针指向一个数组 2.分析指…...
【Python从入门到进阶】39、使用Selenium自动验证滑块登录
接上篇《38、selenium关于Chrome handless的基本使用》 上一篇我们介绍了selenium中有关Chrome的无头版浏览器Chrome Handless的使用。本篇我们使用selenium做一些常见的复杂验证功能,首先我们来讲解如何进行滑块自动验证的操作。 一、测试用例介绍 我们要通过sel…...
利用FPGA和CPLD数字逻辑实现模数转换器
数字系统的嵌入式工程师熟悉如何通过使用FPGA和CPLD在其印刷电路板上将各种处理器,存储器和标准功能组件粘合在一起来实现其数字设计的“剩余”。除了这些数字功能之外,FPGA和CPLD还可以使用LVDS输入,简单的电阻电容器(RC…...
上海亚商投顾:沪指震荡调整跌 减肥药、华为概念股持续活跃
上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 市场情绪 沪指上个交易日低开后震荡调整,深成指、创业板指盘中跌超1%,宁德时代一度跌超3%ÿ…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
快刀集(1): 一刀斩断视频片头广告
一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...
从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践
作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...
