GLTFExporter是一个用于将3D场景导出为glTF格式的JavaScript库。

news2024/11/27 10:25:34

demo案例
在这里插入图片描述

GLTFExporter是一个用于将3D场景导出为glTF格式的JavaScript库。下面我将逐个讲解其入参、出参、属性、方法以及API使用方式。

入参(Input Parameters):

GLTFExporter的主要入参是要导出的场景对象和一些导出选项。具体来说:

  1. scene(场景对象): 这是要导出的3D场景对象,通常是使用Three.js等库构建的场景。
  2. options(导出选项): 这是一个可选的对象,其中包含一些配置项,用于控制导出的行为。例如,您可以指定是否将纹理嵌入到输出文件中、是否包含额外的信息等。

出参(Output):

GLTFExporter的出参是导出的glTF文件。根据您的配置,它可能是一个二进制文件(.glb)或包含多个文件的文件夹(.gltf)。

属性(Properties):

GLTFExporter对象可能具有一些属性,用于配置导出的行为。这些属性通常是一些默认设置,如缩放系数等。

方法(Methods):

GLTFExporter包含了执行导出的方法。

  1. parse(scene, options, onCompleted, onError): 这个方法执行实际的导出过程。它接受场景对象、导出选项以及两个回调函数作为参数。第一个回调函数(onCompleted)在导出成功完成时调用,并接收导出的结果作为参数。第二个回调函数(onError)在导出过程中出现错误时调用。

API方式使用(API Usage):

使用GLTFExporter的基本流程通常如下:

  1. 创建GLTFExporter对象。
  2. 定义导出选项(可选)。
  3. 使用parse方法将场景导出为glTF格式。
  4. 处理导出的结果,如保存到文件或进一步处理。

示例代码:

// 导入GLTFExporter库
import { GLTFExporter } from 'three/examples/jsm/exporters/GLTFExporter.js';

// 创建GLTFExporter对象
const exporter = new GLTFExporter();

// 定义导出选项(可选)
const options = {
    binary: true, // 是否以二进制格式输出(默认为false,输出为.gltf文件)
    includeCustomExtensions: true, // 是否包含自定义扩展信息
    trs: true, // 是否将几何体的位置、旋转和缩放信息导出
    animations: [], // 要导出的动画(如果有的话)
    embedImages: false // 是否将图片嵌入到gltf文件中
};

// 使用parse方法导出场景为glTF格式
exporter.parse(scene, options, function (result) {
    // 处理导出的结果
    if (result instanceof ArrayBuffer) {
        // 以二进制格式输出
        saveArrayBuffer(result, 'scene.glb');
    } else {
        // 以JSON格式输出
        const output = JSON.stringify(result, null, 2);
        saveString(output, 'scene.gltf');
    }
}, function (error) {
    // 处理导出过程中出现的错误
    console.error('Export error:', error);
});

// 保存导出的文件
function saveArrayBuffer(buffer, filename) {
    // 实现保存二进制文件的逻辑
}

function saveString(text, filename) {
    // 实现保存JSON文件的逻辑
}

所有源码


```html
<!DOCTYPE html>
<html lang="en">
<head>
    <!-- 页面标题 -->
    <title>three.js webgl - exporter - gltf</title>
    <meta charset="utf-8">
    <!-- 响应式布局 -->
    <meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
    <!-- 引入 CSS 文件 -->
    <link type="text/css" rel="stylesheet" href="main.css">
</head>
<body>
    <!-- 信息提示 -->
    <div id="info">
        <a href="https://threejs.org" target="_blank" rel="noopener">three.js</a> webgl - exporter - gltf
    </div>

    <!-- 导入映射 -->
    <script type="importmap">
        {
            "imports": {
                "three": "../build/three.module.js",
                "three/addons/": "./jsm/"
            }
        }
    </script>

    <!-- 主要 JavaScript 代码 -->
    <script type="module">

        // 导入所需的模块
        import * as THREE from 'three';  // 导入 three.js 库
        import { GLTFExporter } from 'three/addons/exporters/GLTFExporter.js';  // 导入 GLTFExporter 模块
        import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';  // 导入 GLTFLoader 模块
        import { KTX2Loader } from 'three/addons/loaders/KTX2Loader.js';  // 导入 KTX2Loader 模块
        import { MeshoptDecoder } from 'three/addons/libs/meshopt_decoder.module.js';  // 导入 MeshoptDecoder 模块
        import { GUI } from 'three/addons/libs/lil-gui.module.min.js';  // 导入 GUI 模块

        // 导出 GLTF 文件的函数
        function exportGLTF( input ) {

            const gltfExporter = new GLTFExporter();

            const options = {
                trs: params.trs,
                onlyVisible: params.onlyVisible,
                binary: params.binary,
                maxTextureSize: params.maxTextureSize
            };
            gltfExporter.parse(
                input,
                function ( result ) {

                    if ( result instanceof ArrayBuffer ) {

                        saveArrayBuffer( result, 'scene.glb' );

                    } else {

                        const output = JSON.stringify( result, null, 2 );
                        console.log( output );
                        saveString( output, 'scene.gltf' );

                    }

                },
                function ( error ) {

                    console.log( 'An error happened during parsing', error );

                },
                options
            );

        }

        // 创建保存链接的函数
        const link = document.createElement( 'a' );
        link.style.display = 'none';
        document.body.appendChild( link ); // Firefox 的兼容性解决方案,见 #6594

        // 保存文件的函数
        function save( blob, filename ) {

            link.href = URL.createObjectURL( blob );
            link.download = filename;
            link.click();

            // URL.revokeObjectURL( url ); breaks Firefox...

        }

        // 保存字符串到文件的函数
        function saveString( text, filename ) {

            save( new Blob( [ text ], { type: 'text/plain' } ), filename );

        }

        // 保存 ArrayBuffer 到文件的函数
        function saveArrayBuffer( buffer, filename ) {

            save( new Blob( [ buffer ], { type: 'application/octet-stream' } ), filename );

        }

        // 全局变量定义
        let container;  // 容器
        let camera, object, object2, material, geometry, scene1, scene2, renderer;  // 相机、物体、材质、几何体、场景、渲染器等
        let gridHelper, sphere, model, coffeemat;  // 网格帮助器、球体、模型、材质等

        // 参数定义
        const params = {
            trs: false,
            onlyVisible: true,
            binary: false,
            maxTextureSize: 4096,
            exportScene1: exportScene1,
            exportScenes: exportScenes,
            exportSphere: exportSphere,
            exportModel: exportModel,
            exportObjects: exportObjects,
            exportSceneObject: exportSceneObject,
            exportCompressedObject: exportCompressedObject,
        };

        // 初始化函数
        init();
        animate();

        // 初始化函数
        function init() {

            container = document.createElement( 'div' );
            document.body.appendChild( container );

            // 纹理数据
            const data = new Uint8ClampedArray( 100 * 100 * 4 );
            for ( let y = 0; y < 100; y ++ ) {
                for ( let x = 0; x < 100; x ++ ) {
                    const stride = 4 * ( 100 * y + x );
                    data[ stride ] = Math.round( 255 * y / 99 );
                    data[ stride + 1 ] = Math.round( 255 - 255 * y / 99 );
                    data[ stride + 2 ] = 0;
                    data[ stride + 3 ] = 255;
                }
            }

            // 渐变纹理
            const gradientTexture = new THREE.DataTexture( data, 100, 100, THREE.RGBAFormat );
            gradientTexture.minFilter = THREE.LinearFilter;
            gradientTexture.magFilter = THREE.LinearFilter;
            gradientTexture.needsUpdate = true;

            // 第一个场景
            scene1 = new THREE.Scene();
            scene1.name = 'Scene1';

            // 透视相机
            camera = new THREE.PerspectiveCamera( 45, window.innerWidth / window.innerHeight, 1, 2000 );
            camera.position.set( 600, 400, 0 );
            camera.name = 'PerspectiveCamera';
            scene1.add( camera );

            // 环境光
            const ambientLight = new THREE.AmbientLight( 0xcccccc );
            ambientLight.name = 'AmbientLight';
            scene1.add( ambientLight );

            // 平行光
            const dirLight = new THREE.DirectionalLight( 0xffffff, 3 );
            dirLight.target.position.set( 0, 0, - 1 );
            dirLight.add( dirLight.target );
            dirLight.lookAt( - 1, - 1, 0 );
            dirLight.name = 'DirectionalLight';
            scene1.add( dirLight );

            // 网格辅助器
            gridHelper = new THREE.GridHelper( 2000, 20, 0xc1c1c1, 0x8d8d8d );
            gridHelper.position.y = - 50;
            gridHelper.name = 'Grid';
            scene1.add( gridHelper );

          
            // 坐标轴辅助器
            const axes = new THREE.AxesHelper( 500 );
            axes.name = 'AxesHelper';
            scene1.add( axes );

            // 基本材质的简单几何体
            // 二十面体
            const mapGrid = new THREE.TextureLoader().load( 'textures/uv_grid_opengl.jpg' );
            mapGrid.wrapS = mapGrid.wrapT = THREE.RepeatWrapping;
            mapGrid.colorSpace = THREE.SRGBColorSpace;
            material = new THREE.MeshBasicMaterial( {
                color: 0xffffff,
                map: mapGrid
            } );
            object = new THREE.Mesh( new THREE.IcosahedronGeometry( 75, 0 ), material );
            object.position.set( - 200, 0, 200 );
            object.name = 'Icosahedron';
            scene1.add( object );

            // 八面体
            material = new THREE.MeshBasicMaterial( {
                color: 0x0000ff,
                wireframe: true
            } );
            object = new THREE.Mesh( new THREE.OctahedronGeometry( 75, 1 ), material );
            object.position.set( 0, 0, 200 );
            object.name = 'Octahedron';
            scene1.add( object );

            // 四面体
            material = new THREE.MeshBasicMaterial( {
                color: 0xff0000,
                transparent: true,
                opacity: 0.5
            } );
            object = new THREE.Mesh( new THREE.TetrahedronGeometry( 75, 0 ), material );
            object.position.set( 200, 0, 200 );
            object.name = 'Tetrahedron';
            scene1.add( object );

            // 缓冲几何体原语
            // 球体
            material = new THREE.MeshStandardMaterial( {
                color: 0xffff00,
                metalness: 0.5,
                roughness: 1.0,
                flatShading: true,
            } );
            material.map = gradientTexture;
            material.bumpMap = mapGrid;
            sphere = new THREE.Mesh( new THREE.SphereGeometry( 70, 10, 10 ), material );
            sphere.position.set( 0, 0, 0 );
            sphere.name = 'Sphere';
            scene1.add( sphere );

            // 圆柱体
            material = new THREE.MeshStandardMaterial( {
                color: 0xff00ff,
                flatShading: true
            } );
            object = new THREE.Mesh( new THREE.CylinderGeometry( 10, 80, 100 ), material );
            object.position.set( 200, 0, 0 );
            object.name = 'Cylinder';
            scene1.add( object );

            // 环面纹理
            material = new THREE.MeshStandardMaterial( {
                color: 0xff0000,
                roughness: 1
            } );
            object = new THREE.Mesh( new THREE.TorusKnotGeometry( 50, 15, 40, 10 ), material );
            object.position.set( - 200, 0, 0 );
            object.name = 'Cylinder';
            scene1.add( object );

            // 组合体
            const mapWood = new THREE.TextureLoader().load( 'textures/hardwood2_diffuse.jpg' );
            material = new THREE.MeshStandardMaterial( { map: mapWood, side: THREE.DoubleSide } );
            object = new THREE.Mesh( new THREE.BoxGeometry( 40, 100, 100 ), material );
            object.position.set( - 200, 0, 400 );
            object.name = 'Cube';
            scene1.add( object );

            object2 = new THREE.Mesh( new THREE.BoxGeometry( 40, 40, 40, 2, 2, 2 ), material );
            object2.position.set( 0, 0, 50 );
            object2.rotation.set( 0, 45, 0 );
            object2.name = 'SubCube';
            object.add( object2 );

            // 群组
            const group1 = new THREE.Group();
            group1.name = 'Group';
            scene1.add( group1 );

            const group2 = new THREE.Group();
            group2.name = 'subGroup';
            group2.position.set( 0, 50, 0 );
            group1.add( group2 );

            object2 = new THREE.Mesh( new THREE.BoxGeometry( 30, 30, 30 ), material );
            object2.name = 'Cube in group';
            object2.position.set( 0, 0, 400 );
            group2.add( object2 );

            // 线条
            geometry = new THREE.BufferGeometry();
            let numPoints = 100;
            let positions = new Float32Array( numPoints * 3 );

            for ( let i = 0; i < numPoints; i ++ ) {
                positions[ i * 3 ] = i;
                positions[ i * 3 + 1 ] = Math.sin( i / 2 ) * 20;
                positions[ i * 3 + 2 ] = 0;
            }

            geometry.setAttribute( 'position', new THREE.BufferAttribute( positions, 3 ) );
            object = new THREE.Line( geometry, new THREE.LineBasicMaterial( { color: 0xffff00 } ) );
            object.position.set( - 50, 0, - 200 );
            scene1.add( object );

            // 线环
            geometry = new THREE.BufferGeometry();
            numPoints = 5;
            const radius = 70;
            positions = new Float32Array( numPoints * 3 );

            for ( let i = 0; i < numPoints; i ++ ) {
                const s = i * Math.PI * 2 / numPoints;
                positions[ i * 3 ] = radius * Math.sin( s );
                positions[ i * 3 + 1 ] = radius * Math.cos( s );
                positions[ i * 3 + 2 ] = 0;
            }

            geometry.setAttribute( 'position', new THREE.BufferAttribute( positions, 3 ) );
            object = new THREE.LineLoop( geometry, new THREE.LineBasicMaterial( { color: 0xffff00 } ) );
            object.position.set( 0, 0, - 200 );
            scene1.add( object );

            // 点
            numPoints = 100;
            const pointsArray = new Float32Array( numPoints * 3 );
            for ( let i = 0; i < numPoints; i ++ ) {
                pointsArray[ 3 * i ] = - 50 + Math.random() * 100;
                pointsArray[ 3 * i + 1 ] = Math.random() * 100;
                pointsArray[ 3 * i + 2 ] = - 50 + Math.random() * 100;
            }

            const pointsGeo = new THREE.BufferGeometry();
            pointsGeo.setAttribute( 'position', new THREE.BufferAttribute( pointsArray, 3 ) );

            const pointsMaterial = new THREE.PointsMaterial( { color: 0xffff00, size: 5 } );
            const pointCloud = new THREE.Points( pointsGeo, pointsMaterial );
            pointCloud.name = 'Points';
            pointCloud.position.set( - 200, 0, - 200 );
            scene1.add( pointCloud );

            // 正交相机
            const cameraOrtho = new THREE.OrthographicCamera( window.innerWidth / - 2, window.innerWidth / 2, window.innerHeight / 2, window.innerHeight / - 2, 0.1, 10 );
            scene1.add( cameraOrtho );
            cameraOrtho.name = 'OrthographicCamera';

            material = new THREE.MeshLambertMaterial( {
                color: 0xffff00,
                side: THREE.DoubleSide
            } );

            object = new THREE.Mesh( new THREE.CircleGeometry( 50, 20, 0, Math.PI * 2 ), material );
            object.position.set( 200, 0, - 400 );
            scene1.add( object );

            object = new THREE.Mesh( new THREE.RingGeometry( 10, 50, 20, 5, 0, Math.PI * 2 ), material );
            object.position.set( 0, 0, - 400 );
            scene1.add( object );

            object = new THREE.Mesh( new THREE.CylinderGeometry( 25, 75, 100, 40, 5 ), material );
            object.position.set( - 200, 0, - 400 );
            scene1.add( object );

            //
            const points = [];

            for ( let i = 0; i < 50; i ++ ) {
                points.push( new THREE.Vector2( Math.sin( i * 0.2 ) * Math.sin( i * 0.1 ) * 15 + 50, ( i - 5 ) * 2 ) );
            }

            object = new THREE.Mesh( new THREE.LatheGeometry( points, 20 ), material );
            object.position.set( 200, 0, 400 );
            scene1.add( object );

            // 用于测试 `onlyVisible` 选项的隐藏的大红色盒子
            material = new THREE.MeshBasicMaterial( {
                color: 0xff0000
            } );
            object = new THREE.Mesh( new THREE.BoxGeometry( 200, 200, 200 ), material );
            object.position.set( 0, 0, 0 );
            object.name = 'CubeHidden';
            object.visible = false;
            scene1.add( object );

            // 需要 KHR_mesh_quantization 的模型
            const loader = new GLTFLoader();
            loader.load( 'models/gltf/ShaderBall.glb', function ( gltf ) {
                model = gltf.scene;
                model.scale.setScalar( 50 );
                model.position.set( 200, - 40, - 200 );
                scene1.add( model );
            } );

            // 需要 KHR_mesh_quantization 的模型
            material = new THREE.MeshBasicMaterial( {
                color: 0xffffff,
            } );
            object = new THREE.InstancedMesh( new THREE.BoxGeometry( 10, 10, 10, 2, 2, 2 ), material, 50 );
            const matrix = new THREE.Matrix4();
            const color = new THREE.Color();
            for ( let i = 0; i < 50; i ++ ) {
                matrix.setPosition( Math.random() * 100 - 50, Math.random() * 100 - 50, Math.random() * 100 - 50 );
                object.setMatrixAt( i, matrix );
                object.setColorAt( i, color.setHSL( i / 50, 1, 0.5 ) );
            }
            object.position.set( 400, 0, 200 );
            scene1.add( object );

            // 第二个 THREE.Scene
            scene2 = new THREE.Scene();
            object = new THREE.Mesh( new THREE.BoxGeometry( 100, 100, 100 ), material );
            object.position.set( 0, 0, 0 );
            object.name = 'Cube2ndScene';
            scene2.name = 'Scene2';
            scene2.add( object );

            renderer = new THREE.WebGLRenderer( { antialias: true } );
            renderer.setPixelRatio( window.devicePixelRatio );
            renderer.setSize( window.innerWidth, window.innerHeight );
            renderer.toneMapping = THREE.ACESFilmicToneMapping;
            renderer.toneMappingExposure = 1;

            container.appendChild( renderer.domElement );

            window.addEventListener( 'resize', onWindowResize );

            // 导出压缩的纹理和网格(KTX2 / Draco / Meshopt)
            const ktx2Loader = new KTX2Loader()
                .setTranscoderPath( 'jsm/libs/basis/' )
                .detectSupport( renderer );

            const gltfLoader = new GLTFLoader().setPath( 'models/gltf/' );
            gltfLoader.setKTX2Loader( ktx2Loader );
            gltfLoader.setMeshoptDecoder( MeshoptDecoder );
            gltfLoader.load( 'coffeemat.glb', function ( gltf ) {
                gltf.scene.position.x = 400;
                gltf.scene.position.z = - 200;
                scene1.add( gltf.scene );
                coffeemat = gltf.scene;
            } );

            const gui = new GUI();

            let h = gui.addFolder( 'Settings' );
            h.add( params, 'trs' ).name( 'Use TRS' );
            h.add( params, 'onlyVisible' ).name( 'Only Visible Objects' );
            h.add( params, 'binary' ).name( 'Binary (GLB)' );
            h.add( params, 'maxTextureSize', 2, 8192 ).name( 'Max Texture Size' ).step( 1 );

            h = gui.addFolder( 'Export' );
            h.add( params, 'exportScene1' ).name( 'Export Scene 1' );
            h.add( params, 'exportScenes' ).name( 'Export Scene 1 and 2' );
            h.add( params, 'exportSphere' ).name( 'Export Sphere' );
            h.add( params, 'exportModel' ).name( 'Export Model' );
            h.add( params, 'exportObjects' ).name( 'Export Sphere With Grid' );
            h.add( params, 'exportSceneObject' ).name( 'Export Scene 1 and Object' );
            h.add( params, 'exportCompressedObject' ).name( 'Export Coffeemat (from compressed data)' );

            gui.open();
        }

        function exportScene1() {
            exportGLTF( scene1 );
        }

        function exportScenes() {
            exportGLTF( [ scene1, scene2 ] );
        }

        function exportSphere() {
            exportGLTF( sphere );
        }

        function exportModel() {
            exportGLTF( model );
        }

        function exportObjects() {
            exportGLTF( [ sphere, gridHelper ] );
        }

        function exportSceneObject() {
            exportGLTF( [ scene1, gridHelper ] );
        }

        function exportCompressedObject() {
            exportGLTF( [ coffeemat ] );
        }

        function onWindowResize() {
            camera.aspect = window.innerWidth / window.innerHeight;
            camera.updateProjectionMatrix();
            renderer.setSize( window.innerWidth, window.innerHeight );
        }

        function animate() {
            requestAnimationFrame( animate );
            render();
        }

        function render() {
            const timer = Date.now() * 0.0001;
            camera.position.x = Math.cos( timer ) * 800;
            camera.position.z = Math.sin( timer ) * 800;
            camera.lookAt( scene1.position );
            renderer.render( scene1, camera );
        }

        </script>

    </body>
</html>

本内容来源于小豆包,想要更多内容请跳转小豆包 》

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

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

相关文章

JRT业务开发起步

这是一段充满挑战与奋斗的旅程&#xff0c;自第一行Java代码的写下起&#xff0c;便历经重重险阻。从细微的代码行&#xff0c;逐步汇聚成实用的工具类方法&#xff1b;从工具类方法的积累&#xff0c;逐渐构建起功能强大的工具包&#xff1b;再从工具包的整合&#xff0c;最终…

python Cyber_record 包 一些命令

python Cyber_record 包 1. 查看record文件的统计信息 cyber_record info -f 20231101211111.record.00005 c record_file: 20231101211111.record.00005 version: 1.0 begin_time: 2023-11-01 21:13:48.099650 end_time: 2023-11-01 21:14:19.267622 duration: 3…

jenkins手把手教你从入门到放弃01-jenkins简介(详解)

一、简介 jenkins是一个可扩展的持续集成引擎。持续集成&#xff0c;也就是通常所说的CI&#xff08;Continues Integration&#xff09;&#xff0c;可以说是现代软件技术开发的基础。持续集成是一种软件开发实践&#xff0c; 即团队开发成员经常集成他们的工作&#xff0c;通…

STM32L4R9 的 QuadSPI Flash 通讯速率不理想

1. 引言 客户反应 STM32L4R9 同 QSPI Flash 通讯&#xff0c;测出来的读取速率为 10MB/s&#xff0c; 和理论值相差较大。 2. 问题分析 按照客户的时钟配置和 STM32L4R9 的数据手册中的数据&#xff0c;OSPI 读数速率为 10MB/s 肯定存在问题。同时我们也可以在 AN4760 应用手…

SharedPreferences.Editor 中 apply 与 commit 方法的区别

在 Android 开发中&#xff0c;SharedPreferences 是我们用来存储简单键值对数据的工具。这就像是在口袋里带着一个小笔记本&#xff0c;随时记录下要点或标记。但当涉及到保存这些笔记时&#xff0c;你有两个选择&#xff1a;apply 或 commit。它们乍看之下似乎可以互换使用&a…

【SqlServer】Alwayson收缩日志

Alwayson收缩日志 压缩失败直接压缩压缩失败 直接压缩 加入高可用组之后,不能设置成简单模式。 USE [databasename] CHECKPOINT DECLARE @bakfile nvarchar(100) SET @bakfile=D:\data

DHCP服务搭建

DHCP搭建 一、DHCP简介 1、概念 DHCP&#xff08;Dynamic Host Configuration Protocol&#xff0c;动态主机配置协议&#xff09;是一种网络协议&#xff0c;用于自动分配IP地址和其他网络配置信息给网络上的设备。通过DHCP&#xff0c;计算机或其他设备可以自动获取IP地址、…

Android算法部署项目 | 在Android平台基于NCNN部署YOLOv5目标检测算法

项目应用场景 面向 Android 安卓平台使用 NCNN 部署 YOLOv5 目标检测算法&#xff0c;使用 Android Studio 进行开发&#xff0c;项目具有 App UI 界面。 项目效果&#xff1a; 项目细节 > 具体参见项目 README.md (1) 安装编译 NCNN&#xff0c;或者直接去 Releases Tenc…

深入理解鸿蒙生命周期:从应用到组件

在开发鸿蒙&#xff08;HarmonyOS&#xff09;应用时&#xff0c;理解生命周期的概念至关重要。生命周期不仅关乎应用的性能优化&#xff0c;还涉及到资源管理和用户体验等多个方面。本文将详细解析鸿蒙操作系统中应用、页面和组件的生命周期&#xff0c;帮助开发者更好地掌握这…

HC-SR04使用指南(STM32)

基于STM32和HC-SR04模块实现超声波测距功能 本文用的单片机是STM32F103C8T6&#xff0c;超声波测距模块是HC-SR04&#xff0c;显示距离是通过上位机显示。 HC-SR04硬件概述 HC-SR04超声波距离传感器的核心是两个超声波传感器。一个用作发射器&#xff0c;将电信号转换为40 K…

目标检测——工业安全生产环境违规使用手机的识别

一、重要性及意义 首先&#xff0c;工业安全生产环境涉及到许多复杂的工艺和设备&#xff0c;这些设备和工艺往往需要高精度的操作和严格的监管。如果员工在生产过程中违规使用手机&#xff0c;不仅可能分散其注意力&#xff0c;降低工作效率&#xff0c;更可能因操作失误导致…

最大的三位数-第15届蓝桥第5次STEMA测评Scratch真题精选

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥杯真题&#xff0c;这是Scratch蓝桥杯真题解析第177讲。 如果想持续关注Scratch蓝桥真题解读&#xff0c;可以点击《Scratch蓝桥杯历年真题》并订阅合集&#xff0c;…

【合合TextIn】AI构建新质生产力,合合信息Embedding模型助力专业知识应用

目录 一、合合信息acge模型获MTEB中文榜单第一 二、MTEB与C-MTEB 三、Embedding模型的意义 四、合合信息acge模型 &#xff08;一&#xff09;acge模型特点 &#xff08;二&#xff09;acge模型功能 &#xff08;三&#xff09;acge模型优势 五、公司介绍 一、合合信息…

目标检测——植物病害图像数据集

一、重要性及意义 首先&#xff0c;植物病害图像是了解农业中植物生长和受病害情况的重要信息来源。通过对这些图像的分析&#xff0c;可以直观地观察到植物的生长状况&#xff0c;及时发现病害的存在。这不仅有助于农民和研究人员快速、准确地诊断植物病害&#xff0c;还能为…

电源纹波测量

前言 掌握电源纹波测量方法 测量器材 一台示波器 一、先点击示波器的测量通道 二、设置耦合方式为交流耦合、带宽限制为20M、探头X10 三、纵轴和横轴的一个格子均设置为20ms 四、观察这个Vpp&#xff0c;就是纹波 五、测量时不要用这个接地&#xff0c;构成的回路太大&…

浅谈投资者需要了解的伦敦银买卖规则

别看近期伦敦银价格曾经大涨&#xff0c;现在入场做伦敦银投资的朋友不一定能盈利&#xff0c;因为他们不了解伦敦银买卖规则。投资伦敦银需要了解哪些规则呢&#xff1f;下面我们就来讨论一下这个问题。 知晓杠杆交易的风险。伦敦银是一种杠杆交易&#xff0c;或者说保证金交易…

DFS(基础,回溯,剪枝,记忆化)搜索

DFS基础 DFS(深度优先搜索) 基于递归求解问题&#xff0c;而针对搜索的过程 对于问题的介入状态叫初始状态&#xff0c;要求的状态叫目标状态 这里的搜索就是对实时产生的状态进行分析检测&#xff0c;直到得到一个目标状态或符合要求的最佳状态为止。对于实时产生新的状态…

二极管基础知识篇(一)

大家好&#xff0c;我是砖一。 今天给大家分享一下二极管的基础知识&#xff0c;把主要知识点进行简化汇总&#xff0c;这样才能更好使用。 一&#xff0c;二极管的介绍 1&#xff0c;世界上有三种材料&#xff0c;分别是绝缘体&#xff0c;导体&#xff0c;还有一种处于导体…

Jmeter通过OS进程取样器调用Python脚本实现参数互传

1、 Python中 sys.argv的用法解释&#xff1a;sys.argv可以让python脚本从程序外部获取参数&#xff0c;sys.argv是一个列表&#xff0c;可用[]提取其中的元素&#xff0c;其第一个元素是程序本身&#xff0c;随后才依次是外部给予的参数&#xff0c;可以接受多个参数&#xff…

类和对象(下)--- 初始化列表、explicit、友元、static、匿名对象和内部类

本篇将会对类和对象的主要知识收尾&#xff0c;先会对构造函数进行补充&#xff0c;分别补充了构造函数体赋值、初始化列表、explicit 关键字&#xff0c;然后介绍 static 成员知识以及友元、内部类还有匿名对象等知识点&#xff0c;目录如下&#xff1a; 目录 1. 构造函数补充…