ThreeJS动态加载div标签

2023-11-19

思路:
1.在页面中创建一个div标签;
2.确定标签在三维场景中的三维位置;
3.计算三维位置的屏幕坐标;
4.在每一帧的渲染中都计算一下这个三维坐标的屏幕位置,并把屏幕位置赋给标签。
具体实现:
1.创建div标签
标签样式:

  .tap{
            position: absolute;
            background-color: MidnightBlue;
            background-color:rgba(0,10,40);
            border-top-left-radius: 10px;
            border-bottom-right-radius:10px;
            opacity: 0.5;
            font-size: 4px;
            color: aqua;
            width: 36px;
            height: 44px;
            padding: 1px 1px 1px;
        }

div:

<div class="tag" id="tag">
    <span style="color:white;font-size: 10px;padding: 5px">楼宇名称:</span>
    <span style="font-size: 11px;font-weight: bold">XXX大厦</span>
    <p style="padding: 5px;margin-top: -3px;">占地面积:25541平方米</p>;
</div>

效果:
在这里插入图片描述
初始时我们可以将div的display设置为none,当确定它的位置后再设置为显示。
2.我们给标签指定一个场景中的位置,比如x y z为(20,30,50),要把三维坐标转换为屏幕坐标:
三维坐标转屏幕坐标的方法:

 function transPosition(position){
     let world_vector = new THREE.Vector3(position.x,position.y,position.z);
     let vector =world_vector.project(camera);
     let halfWidth = window.innerWidth / 2,
         halfHeight = window.innerHeight / 2;
     return {
         x: Math.round(vector.x * halfWidth + halfWidth),
         y: Math.round(-vector.y * halfHeight + halfHeight)
     };
 }

将指定的三维坐标转为屏幕坐标:

//计算三维坐标对应的屏幕坐标
        var position=new THREE.Vector3(20,30,50);
        var windowPosition=transPosition(position);
        var left=windowPosition.x;
        var top=windowPosition.y;

3.将屏幕坐标的位置赋给div,并将div的显示出来:

//设置div屏幕位置
        let div = document.getElementById('tag');
        div.style.display = "";
        div.style.left = left + 'px';
        div.style.top = top + 'px';

4.将div位置变换和赋值放入场景渲染频率中:

    function render() {
        divRender();
        renderer.render(scene, camera);
    }
 function divRender() {
        //计算三维坐标对应的屏幕坐标
        var position=new THREE.Vector3(20,30,50);
        var windowPosition=transPosition(position);
        var left=windowPosition.x;
        var top=windowPosition.y;
        //设置div屏幕位置
        let div = document.getElementById('tag');
        div.style.display = "";
        div.style.left = left + 'px';
        div.style.top = top + 'px';
    }

效果:
在这里插入图片描述
完整代码:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="css/style.css">
    <style>
        .tag {
            position: absolute;
            background-color: MidnightBlue;
            background-color: rgba(0, 10, 40);
            border-top-left-radius: 10px;
            border-bottom-right-radius: 10px;
            opacity: 0.5;
            font-size: 4px;
            color: aqua;
            padding: 1px 1px 1px;
        }
    </style>
</head>

<body onload="draw();">
    <div id="WebGL-output">
        <div class="tag" id="tag">
            <span style="color:white;font-size: 10px;padding: 5px">楼宇名称:</span>
            <span style="font-size: 11px;font-weight: bold">XXX大厦</span>
            <p style="padding: 5px;margin-top: -3px;">占地面积:25541平方米</p>
        </div>
    </div>
</body>
<script src="js/threer94.js"></script>
<script src="js/jquery.js "></script>
<script src="js/OrbitControls.js "></script>
<script src="js/stats.min.js "></script>
<script src="js/dat.gui.min.js "></script>
<script>
    var scene;
    var camera;
    var renderer;
  
  
    function init() {       
        scene = new THREE.Scene();        
        camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 100000);
        renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true });      
        renderer.setSize(window.innerWidth, window.innerHeight);
        renderer.shadowMap.enabled = true; //打开阴影
        renderer.setClearAlpha(0.2);      
        var axis=new THREE.AxesHelper(200);;
        scene.add(axis)        
        //添加环境光
        var hemiLight = new THREE.HemisphereLight(0xffffff, 0xffffff, 1);
        hemiLight.position.set(0, 500, 0);
        scene.add(hemiLight);
        //设置相机位置
        camera.position.x = -300;
        camera.position.y = 400;
        camera.position.z = 300;
        camera.lookAt(scene.position);
        document.getElementById("WebGL-output").appendChild(renderer.domElement);
        //鼠标控制器
        initControls();
        animate();
        window.addEventListener('resize', onResize, false); //添加窗口大小监听事件  
    };
    
    function initControls() {
            controls2 = new THREE.OrbitControls(camera, renderer.domElement);
            controls2.enableDamping = true;
            controls2.dampingFactor = 1;
            controls2.enableZoom = true;
            controls2.zoomSpeed = 2;
            controls2.autoRotate = false;

            controls2.minDistance = 0;
            controls2.maxDistance = 600;
            controls2.enablePan = true;
            controls2.keyPanSpeed = 15;
        }

    function animate() {
        //更新控制器
        controls2.update();
        divRender();
        renderer.render(scene, camera);
        requestAnimationFrame(animate);
    }
  
    function onResize() {
        camera.aspect = window.innerWidth / window.innerHeight;
        camera.updateProjectionMatrix();
        renderer.setSize(window.innerWidth, window.innerHeight);
    }

    function divRender() {
        //计算三维坐标对应的屏幕坐标
        var position = new THREE.Vector3(20, 30, 50);
        var windowPosition = transPosition(position);
        var left = windowPosition.x;
        var top = windowPosition.y;
        //设置div屏幕位置
        let div = document.getElementById('tag');
        div.style.display = "";
        div.style.left = left + 'px';
        div.style.top = top + 'px';
    }
    function transPosition(position) {
        let world_vector = new THREE.Vector3(position.x, position.y, position.z);
        let vector = world_vector.project(camera);
        let halfWidth = window.innerWidth / 2,
            halfHeight = window.innerHeight / 2;
        return {
            x: Math.round(vector.x * halfWidth + halfWidth),
            y: Math.round(-vector.y * halfHeight + halfHeight)
        };
    }
    window.onload = init;
</script>

</html>

项目中的应用:
html中标签样式:

  .tap{
            position: absolute;
            background-color: MidnightBlue;
            background-color:rgba(0,10,40);
            border-top-left-radius: 10px;
            border-bottom-right-radius:10px;
            opacity: 0.5;
            font-size: 4px;
            color: aqua;
            width: 36px;
            height: 44px;
            padding: 1px 1px 1px;
        }

js中动态添加

//txt1 txt2 txt3 为div中要显示的文本,具体样式可修改 innerHTML那一行
function addDom(txt1,txt2,txt3) {
    let addDivDom = document.createElement('div');
    let bodyDom = document.body;
    bodyDom.insertBefore(addDivDom, bodyDom.lastChild);
    addDivDom.classList = 'tap';
    addDivDom.innerHTML = '<span style="color:white;font-size: 10px;padding: 5px">' + txt1 + '</span>'+'<span style="font-size: 11px;font-weight: bold">'+txt2+'</span>'+'<p style="padding: 5px;margin-top: -3px;">'+txt3+'</p>';
}
 

render中要实时渲染修改标签的二维坐标,代码中的position为三维坐标,即标签插入时的三维坐标

function renderLabel(){
            div.style.left=transPosition(position).x + 'px';
            div.style.top=transPosition(position).y + 'px';
}
//三维坐标转屏幕坐标
  function transPosition (position) {
        let world_vector = new THREE.Vector3(position.x, position.y, position.z);
        let vector = world_vector.project(camera);
        let halfWidth = window.innerWidth / 2,
            halfHeight = window.innerHeight / 2;
        return {
            x: Math.round(vector.x * halfWidth + halfWidth),
            y: Math.round(-vector.y * halfHeight + halfHeight)
        };
    }

具体实例1:给建筑物添加标签
效果图:
在这里插入图片描述
在这里插入图片描述
(图一标签为颜色最暗的建筑的标签,图二为最高的建筑的标签)

    let build=new THREE.Group();
    var loader = new THREE.VRMLLoader();
    //加载一个wrl格式的模型,其他格式模型同样,自建cube等不需要自建box
    loader.load( 'model/h.wrl', function ( object ) {

        object.castShadow = true;

        build= object.children[0].children[0];
        build.castShadow = true;
        object.position.x=-20;
        object.position.y=0;
        object.position.z=-30;

        scene.add(object);
        let box= creatBoundingBox(object);
        build.box=box;
         addDom("楼宇名称  ","h 可点击","占地面积:25541平方米",box);
        CubeArray.push(box);
        })
        
function addDom(txt1,txt2,txt3,cube) {
    let addDivDom = document.createElement('div');
    let bodyDom = document.body;
    bodyDom.insertBefore(addDivDom, bodyDom.lastChild);
    addDivDom.id=cube.uuid+"_text";
    addDivDom.classList = 'tap';
    addDivDom.innerHTML = '<span style="color:white;font-size: 10px;padding: 5px">' + txt1 + '</span>'+'<span style="font-size: 11px;font-weight: bold">'+txt2+'</span>'+'<p style="padding: 5px;margin-top: -3px;">'+txt3+'</p>';
    divIdArray.push(addDivDom.id);
}
 //渲染实时更新标签位置
function render() {
    cubeLabe();
    renderer.render(scene, camera);
}
//只显示最近点击的楼的标签 其他标签隐藏不显示
function cubeLabe() {
    if(IsSelectedMesh==true)
    {
        let cube=clickmesh;
        let divid=cube.uuid+"_text";
        for(let i=0;i<divIdArray.length;i++) {
            let id = divIdArray[i];
            let div = document.getElementById(id);
            if(id==divid)
            {
                if(div!=null&&div!=undefined){
                    div.style.display="";
                    div.style.left=interface.transPosition(cube.position).x + 'px';
                    let posi=new THREE.Vector3(cube.position.x,(cube.position.y)*2,cube.position.z);
                    div.style.top=interface.transPosition(posi).y-100 + 'px';
                    // let number=cube.uuid;
                    // div.style.zIndex=number;
                }
            }else {
                if(div!=null&&div!=undefined){
                    div.style.display = "none";
                }

            }
        }
    }else {
        for(let i=0;i<divIdArray.length;i++) {
            let id = divIdArray[i];
            let div = document.getElementById(id);

            if(div!=null||div!=undefined){
                div.style.display = "none";
            }
        }
    }
}
//生成模型包围盒实体,方便标签判断位置
function creatBoundingBox(object) {
    //计算包围盒长宽高
    let Box=new THREE.Box3();
    Box.setFromObject(object);
    if ( Box.isEmpty() ) return;
    let min = Box.min;
    let max = Box.max;
    let width=max.x-min.x;
    let height=max.y-min.y;
    let deepth=max.z-min.z;
    // console.log(width+";"+height+";"+deepth);

    //计算包围盒中心点
    let centerX=(max.x+min.x)/2;
    let centerY=(max.y+min.y)/2;
    let centerZ=(max.z+min.z)/2;

    //画一个boundingbox的cube实体

    let boxGeometry=new THREE.BoxGeometry(width,height,deepth);
    let boxMaterial=new THREE.MeshLambertMaterial({});
    let box=new THREE.Mesh(boxGeometry,boxMaterial);
    box.position.set(centerX,centerY,centerZ);
    return box;
}

具体实例2 点击模型表面添加标签,标签为图片
效果图:
在这里插入图片描述
在这里插入图片描述

    var fixedBoard = function () {
        position:null;
        div:null;
        image:null
    }
    var fixedBoardlist=[];
    //添加鼠标事件 移除鼠标事件
    function ImageTag() {
        addEventListener('click',addFixedBoard);// 监听窗口鼠标单击事件
        $(document).keydown(function (event) {
            if (event.keyCode == 27) {
                removeAddBoard();
            }
        });
    }
//固定位置的标签
    function addFixedBoard() {
        var windowX = event.clientX;//鼠标单击位置横坐标
        var windowY = event.clientY;//鼠标单击位置纵坐标

        var addDivDom = document.createElement('div');
        var bodyDom = document.body;
        bodyDom.insertBefore(addDivDom, bodyDom.lastChild);
        // addDivDom.id=cube.uuid+"_text";
        addDivDom.classList = 'tap';
        var img=new Image();
        // var image=document.createElement("img");
        var  image_src="./img/002.png";
        img.src=image_src;
        addDivDom.appendChild(img);


        var x = (windowX / window.innerWidth) * 2 - 1;//标准设备横坐标
        var y = -(windowY / window.innerHeight) * 2 + 1;//标准设备纵坐标
        var standardVector = new THREE.Vector3(x, y, 0.5);//标准设备坐标
        //标准设备坐标转世界坐标
        var worldVector = standardVector.unproject(camera);
        var ray = worldVector.sub(camera.position).normalize();
        //创建射线投射器对象
        var raycaster = new THREE.Raycaster(camera.position, ray);
        //返回射线选中的对象
        var intersects = raycaster.intersectObjects(floorChildrenGroup);
        console.log(intersects);
        if (intersects.length > 0) {
            var point=intersects[0].point;
            var board=new fixedBoard();
            board.position=point;
            board.div=addDivDom;
            board.image=img;
            fixedBoardlist.push(board);
        }

    }
//移除鼠标单击事件绑定
    function removeAddBoard() {
        removeEventListener('click',addFixedBoard);
    }
//实时修改渲染时的图片位置
    function imagePosition() {
        for(var i=0;i<fixedBoardlist.length;i++){
            var position=fixedBoardlist[i].position;
            var div=fixedBoardlist[i].div;
            var x=interface.transPosition(position).x;
            var y=interface.transPosition(position).y;
            var image=fixedBoardlist[i].image;
            var width=image.width;
            var height=image.height;
            div.style.top=y-height+ 'px';
            div.style.left=x-width/2+ 'px';

        }
    }
//报警标签
    function Warning(Istrue) {
        if(Istrue){

            for(var i=0;i<fixedBoardlist.length;i++){
                fixedBoardlist[i].image.src='./img/003.png';
            }
            var button0=document.getElementById('warn');
            button0.style.display="none";
            var button1=document.getElementById('cancelwarn');
            button1.style.display="";
        }else {
            for(var i=0;i<fixedBoardlist.length;i++){
                fixedBoardlist[i].image.src='./img/002.png';
            }
            var button0=document.getElementById('warn');
            button0.style.display="";
            var button1=document.getElementById('cancelwarn');
            button1.style.display="none";
        }
    }
function render(){
    renderer.render(scene, camera);
    imagePosition();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ThreeJS动态加载div标签 的相关文章

  • 如何沿着简单的路径移动相机

    如何沿着简单的路径 由顶点 点数组创建 移动相机 我需要自动移动它 而不是像第一人称射击游戏那样通过键盘 鼠标事件来移动它 找了这个例子 http trijs org examples webgl geometry extrude spli
  • 使用三个 JS 和 React JS 加载 GLTF 模型

    我使用 React JS 加载从 sketchfab 下载的 GLTF 文件时遇到问题 当我尝试在不使用React 使用常规index html和index js 的情况下执行此操作时 它可以工作 但是当我将代码带入React应用程序时 它
  • 如何在 Three.js 中将 geoJSON 绘制为网格而不是线条,并填充颜色?

    我正在使用 Three js 制作一个地球仪 并将添加一些数据层 所有图层都将从 geoJSON 创建 我已将其设置为使地球仪 第一个数据文件 包含国家 地区 显示为线条 这使用三GeoJSON https github com jdomi
  • 在 React 中渲染 Three.js 元素?

    我正在尝试制作一个渲染 Three js 场景的 React 组件 但是 每当我尝试安装组件而不是看到正在渲染的任何类型的场景时 我只看到文本 object HTMLCanvasElement 正在显示 这是我的组件 import Reac
  • Three.js StereoEffect 显示 2 只眼睛的网格

    我有一个使用 StereoEffect 渲染器的 THREE js 场景 但是 当我向场景添加新网格时 它们会显示在两只眼睛上 而不是为每只眼睛重复显示 我相信 THREE js 应该自动完成 我不必自己复制它们 我尝试复制它们 但这是很多
  • 可点击的精灵标签?

    我一直在玩精灵文本标签 更具体地说是这个例子 http stemkoski github io Three js Sprite Text Labels html http stemkoski github io Three js Sprit
  • Three.js:通过触摸和设备方向旋转相机

    我正在使用 Threejs 制作一个 3D 项目 它允许使用计算机设备的鼠标控制相机 还允许使用触摸事件和智能手机的设备方向事件进行控制 举个例子 这个网站 http lacostewinter seeourwork cn en intro
  • 一次性渲染阴影

    考虑到阴影投射的成本 我想知道对于动态定位的静态对象 例如 程序城市 是否有一个功能或可能 实验性的方法可以在 Three js 中仅渲染一次阴影贴图 甚至在 webgl 中 因此 结果可以在静态对象的下一帧中免费使用 仅当物体移动时才会进
  • 使用 ThreeJS 获取球体纹理上的点击位置

    目前 我有一个带有纹理的球体 它绕 y 轴旋转 我还有在 3D 空间中单击的位置 以及球体上的旋转位置 我认为 目标 获取纹理上的位置 例如 我想获取我点击的图像的哪个方块 参见示例球体和下图 在实践中 我不会使用此图像 但我觉得这将是一个
  • 在 TypeScript 中使用三个 Js + OrbitControl

    我无法得到this http www example com 在 TypeScript 中使用上述组合的示例 I have and 在我的html中和打字稿文件
  • Three.js 椭圆

    如何在 Three js 中创建一个椭圆 我看过这个 在 THREE js 中绘制椭圆 https stackoverflow com questions 11419896 drawing an ellipse in three js 但如
  • 如何使用三个JS导出然后导入场景?

    我有一个用三个 JS 和大量 Javascript 代码构建的复杂 3D 场景 我需要将此场景导出为一个文件 然后通过简单的 ThreeJS 场景播放器在我的网站上使用它 我尝试过 ObjectExporter 和 SceneExporte
  • ThreeJS 动画光色

    我制作了一个定向灯 我想随着时间的推移改变颜色 我正在阅读文档 http threejs org docs index html Reference Math Color 但仍然没有启动并运行 在初始化之前我声明变量 var rmapped
  • 三个JS,给纹理添加镜面反射(光泽)

    我有一个纹理应用于 Three js 中的对象 我想为其添加一些镜面反射或光泽 我看到这样的例子 new THREE MeshPhongMaterial color 0x996633 specular 0x050505 shininess
  • 三.js、PointerLock和碰撞检测

    我正在开发一个 3D 虚拟家庭项目 除了碰撞检测之外 一切正常 我使用 PointerLockControls 来控制相机和移动 但我不确定如何检测每个可能方向的碰撞 为简单起见 我从与 0 0 0 上的简单立方体的向前和向后碰撞开始 ra
  • 三.js如何通过id(name)获取场景

    我创造了一个场景 如何通过 id name 获取它 喜欢jquery test In three js医生 我刚刚找到scene getObjectById 获取子对象 有一个getObjectByName方法用于此这里在Object3D
  • 如何检查 webgl(two.js) 的客户端性能

    我有一个使用 Three JS 的图形项目 现在我想自动检查客户端 GPU 性能并计算可以在应用程序中加载多少元素 我想到了诸如 GPU 基准测试之类的东西 看一眼stats js https github com mrdoob stats
  • 为什么环境光在此示例中不起作用?

    在以下示例中 环境光不起作用 一切都是黑色的 为什么会发生这种情况 我该如何解决它 如果我放聚光灯 它就可以工作 所以环境光一定有问题 但我遵循了文档 O
  • ThreeJS 我的 GLTF 在主机服务器上加载速度太慢?

    我目前正在创建一个包含 3D Market Place 功能的网站 唉 我在实现这个网站的主要功能时遇到了麻烦 这是网站 阿尔法状态 https www openstring studios com https www openstring
  • 三种js更新纹理生成Canvas的最佳性能方式

    I have THREE Points with THREE PointsMaterial As a map我使用生成的动态cavas image 我需要重新渲染canvas在每一帧上 我的部分代码 function makeEnemyBa

随机推荐

  • 【Liunx常用操作】LVM逻辑卷的介绍和相关操作(创建、删除、扩缩容)

    提示 为保证文章的正确性和实用性 文章内容可能会不定时优化改进 若您有建议或者文章存在错误请私信留言或评论指正 下面以CentOS7 6操作系统为例 介绍具体的操作步骤 如果本文对你有帮助 记得关注加收藏 1 文章前言 LVM Logica
  • 浅谈微服务异步解决方案

    导言 异步是一种设计思想 不是设计目的 因此不要为了异步而异步 要有所为 有所不为 异步不是 银弹 避免试图套用一个 异步框架 解决所有问题 需要根据不同的业务特点或要求 选择合适的设计实现方式 同步和异步问题是大型分布式系统中需要慎重等待
  • vue数据导出

    点击按钮 async download this buttonLoading true this http responseType blob params this formInline 这是默认页数 一些项目配置数据 then resp
  • SimpleDateFormat线程不安全及解决办法

    以前没有注意到SimpleDateFormat线程不安全的问题 写时间工具类 一般写成静态的成员变量 不知 此种写法的危险性 在此讨论一下SimpleDateFormat线程不安全问题 以及解决方法 为什么SimpleDateFormat不
  • Android studio 3.0+ 为模拟器导入图片

    问题 很多时候 写一个 App 的 Demo 需要加载本地图片 但是模拟器直接打开会发现 图库中是空的 这时候就需要我们手动向里面添加图片 在 Android 3 0 以前 通过 DDMS 很轻松的把图片拖进去就是了 但是 在 Androi
  • 西门子PLC各个通信协议解析,分析

    1 协议分类 0 协议背景介绍1 1 mpi接口 dp接口 rs485接口 rs232接口具体区别 一 mpi接口 dp接口 这两者均为基于RS485接口 可以理解为硬件标准 mpi与dp是通信协议的名称 可以理解为软件 二 MPI MPI
  • Linux下Qt可执行程序设置动态库及插件路径

    在linux下直接双击编译完的可执行程序发现压根跑不起来 但是在Qt Creator中能够执行和调试 那是因为可执行程序无法加载Qt的库导致的 下面提供一种解决办法 新建run sh 名称可随意修改 将以下内容写入文件中 bin bash
  • 【直观详解】什么是正则化

    转自 https charlesliuyx github io 2017 10 03 E3 80 90 E7 9B B4 E8 A7 82 E8 AF A6 E8 A7 A3 E3 80 91 E4 BB 80 E4 B9 88 E6 98
  • 一起学nRF51xx 9 -  pwm

    前言 上一讲我们学习了nrf51822定的器的使用 那行如何用定时器实现PWM输出呢 NRF51的time模块不支持 PWM 功能 不可我们可以通过定时器 PPI GPIOTE模块一起工作的方式在NRF51XX上产生 PWM 信号 下面以使
  • 2023华为OD机试真题【最佳植树位置/二分法】

    题目内容 小明在直线的公路上种树 现在给定可以种树的坑位的数量和位置 以及需要种多少棵树苗 问树苗之间的最小间距是多少时 可以保证种的最均匀 两棵树苗之间的最小间距最大 输入描述 输入三行 第一行一个整数 坑位的数量 第二行以空格分隔的数组
  • 2023年考证时间一览表

    2022年已经成为历史 在疫情背景全面开放下给大家整理了2023年全年的考试时间以及报名时间新鲜出炉 了解清楚 为2023年提前做好规划 1月份 2022年下半年中小学教师资格考试面试 报名时间 2022年12月9日 12日 考试时间 20
  • Java Web如何限制访问的IP的两种方法

    Java Web限制IP访问的两种方法 前一阵子因为在做项目时碰到了这个功能 现在好好总结一下 至于为什么要限制IP访问 我就不多说了 然后百度了一下 现在主要有两种方式去限制IP访问 第一种是最简单的方便的 第二种是通过过滤器来限制访问
  • vuforia模型脱卡功能的实现

    思路是这样 识别图视野脱离之后 将被识别的物体不再作为识别图的子物体 转而作为相机的子物体 并置于屏幕中央位置 1 首先 写个小script C 纯文本查看 复制代码 01
  • Mybatis/Mybatis-Plus驼峰式命名映射

    目录 一 mybatis驼峰式命名 二 mybatisPlus默认开启驼峰命名映射 一 mybatis驼峰式命名 方法一 使用前提 数据库表设计按照规范 字段名中各单词使用下划线 划分 使用好处 省去mapper xml文件中繁琐编写表字段
  • 团队梯队人才培养模型,60页人才梯队建设与人才培养

    团队梯队人才培养模型 60页人才梯队建设与人才培养 果断收藏 今日头条 人才梯队建设与人才培养 目录 1 人才梯队建设理念 2 人才梯队建设路径 3 梯队人才培养内容与方法 团队总监以上人员管理不成熟的表现 1 无法从项目运作导向转变到战略
  • yolov5 deepsort 行人/车辆(检测 +计数+跟踪+测距+测速)

    功能 简介 实现了局域的出 入 分别计数 显示检测类别 ID数量 默认是 南 北 方向检测 若要检测不同位置和方向 需要加以修改 可在 count car traffic py 点击运行 默认检测类别 行人 自行车 小汽车 摩托车 公交车
  • C++开源序列化库:FStruct

    FStruct是一个用于C 对象 结构体 STL容器等 和json xml字符串之间进行转换的库 采用非入侵方式 无需在原有结构体上进行修改 目前支持基础类型 结构体 以及vector list deque set map等复杂数据类型的序
  • 【C语言】字符串函数介绍三(strstr、strtok、streeror)

    前言 之前我们用两篇文章介绍了strlen strcpy stract strcmp strncpy strncat strncmp这些函数 第一篇文章strlen strcpy stract 第二篇文章strcmp strncpy str
  • 2019年用户流失分析(五)——Python实现

    5 模型应用 选择4月份为正常状态的电视用户 计算他们的收视时长 收视在线天数 距最近一次收视时间 入网时长 用户主动办理次数和投诉与报障次数6个特征指标 利用构建好的用户流失模型预测5月份的用户流失情况 5 1 离网倾向阈值 在4月份为正
  • ThreeJS动态加载div标签

    思路 1 在页面中创建一个div标签 2 确定标签在三维场景中的三维位置 3 计算三维位置的屏幕坐标 4 在每一帧的渲染中都计算一下这个三维坐标的屏幕位置 并把屏幕位置赋给标签 具体实现 1 创建div标签 标签样式 tap positio