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标签 的相关文章

  • Threejs + Vanilla JS 和 React-Three-Fiber + Create-React-App 之间的颜色差异

    这已经困扰我一段时间了 为什么 React Three Fiber 中的材质颜色看起来比 Threejs 中暗淡 两种实现中的对象及其属性是相同的 Threejs 版本相同 在新引导中实施 create react app 没有额外的依赖项
  • Three.js 中的文本几何

    我在 Three js r74 中的 TextGeometry 遇到一些问题 我该如何正确实施 这是我的代码笔 codepen io cheesyeyes pen eJqZxK 提前致谢 好吧 对于每个正在寻找简单答案而不是链接和其他超载示
  • 深度图三.js

    Three js中有没有办法获取深度图 我感兴趣的是制作类似于 Kinect 为给定场景制作的东西 我遇到了一种不使用颜色和雾来模仿这一点的黑客方法 但这并不理想 因为它会使用两个不同的场景并且会因光照而变化 我认为执行此操作的另一种方法是
  • 在 React 中渲染 Three.js 元素?

    我正在尝试制作一个渲染 Three js 场景的 React 组件 但是 每当我尝试安装组件而不是看到正在渲染的任何类型的场景时 我只看到文本 object HTMLCanvasElement 正在显示 这是我的组件 import Reac
  • 在 TypeScript 中使用三个 Js + OrbitControl

    我无法得到this http www example com 在 TypeScript 中使用上述组合的示例 I have and 在我的html中和打字稿文件
  • Three.js 设置并读取相机外观向量

    而不是使用camera rotation或lookAt 函数旋转相机 我想将外观矢量直接传递给相机 是否可以直接设置相机外观矢量以及是否可以从相机读取外观矢量 相机没有 外观矢量 因此无法设置它 但是 您可以构造一个point通过将您的外观
  • 在 Three.js 中使用多种材质来合并几何体

    我想使用 2 个网格创建一棵松树 其中 1 个用于树干 另一个用于灌木 这就是我所做的 var pine geometry new THREE Geometry var pine texture 1 THREE ImageUtils loa
  • THREE.JS,忽略父级的轮换

    我试图使子对象跟随父级位置并表现得像一个普通的子对象 但是我希望它保持其旋转不变 在不影响性能的情况下 最好的方法是什么 我的CPU预算很紧张 已经运行了2个工作线程并且有很多对象 是否有设置只允许孩子的位置受到影响 同样重要的是 当父级旋
  • Three.js :face4 生成三角形而不是正方形

    我正在尝试使用 tree js 自定义几何图形生成一个正方形 但是这段代码 var cubeGeo new THREE Geometry cubeGeo vertices push new THREE Vector3 25 25 25 cu
  • 如何在 Three.js 场景中包含 OVRManager?

    我创建了几个 Three js Javascript 演示应用程序 正在我的新 Oculus Go 中进行试验 我正在尝试让 Go 控制器在我的应用程序中执行某些操作 根据 Oculus 开发人员中心的说法 最好的办法是将 OVRManag
  • 三-mtl-loader 错误:THREE.MeshPhongMaterial:.shading 已被删除 -> 对象不可见

    昨天我问了这个问题 未捕获的类型错误 THREE MTLLoader 不是构造函数 2 0 https stackoverflow com questions 47741644 uncaught typeerror three mtlloa
  • 如何使用键盘和鼠标控制相机 - Three.js

    我在 WEB GL 中有一个带有 Three js 的 3D 环境 并且我曾经使用 Orbitcontrols js http codepen io nireno pen cAoGI http codepen io nireno pen c
  • 如何在 React Native 中渲染自定义 3D 对象

    我已经成功使用 Three js expo Three 和 expo gl 在 React Native 中配置了红色立方体的 3D 渲染 但我想让用户渲染他们自己可能拥有的自定义 3D 对象 obj 或 mtl 扩展名 但我不确定如何让他
  • 如何在 Three.js 中进入全屏?

    我已经尝试了数十种不同的方法几个小时 但没有一个有效 如下所示 document body addEventListener keydown function THREEx FullScreen request false 如何让Three
  • ThreeJS 动画光色

    我制作了一个定向灯 我想随着时间的推移改变颜色 我正在阅读文档 http threejs org docs index html Reference Math Color 但仍然没有启动并运行 在初始化之前我声明变量 var rmapped
  • .points 不透明度/大小在三个.js 内

    我回来回答有关 points 的第二个问题 这次想知道如何将不透明度从 0 更改为 1 然后又回到距发射器的特定像素距离内 var particleCount 14 particles new THREE Geometry pMateria
  • 三.js、PointerLock和碰撞检测

    我正在开发一个 3D 虚拟家庭项目 除了碰撞检测之外 一切正常 我使用 PointerLockControls 来控制相机和移动 但我不确定如何检测每个可能方向的碰撞 为简单起见 我从与 0 0 0 上的简单立方体的向前和向后碰撞开始 ra
  • 使用 Three.js 中的设备方向控件进行对象旋转

    我正在迈出使用 JavaScript 进行编码并使用 Three js 的第一步 我正在尝试 Threejs org 的这个例子 http trijs org examples misc controls deviceorientation
  • 使用矩阵变换 Three.js 场景图

    我正在尝试将文件中的场景加载到 Three js 中 自定义格式 不是 Three js 支持的格式 这种特殊格式描述了一个场景图 其中树中的每个节点都有一个指定为 4x4 矩阵的变换 将其推送到 Three js 的过程如下所示 Yeah
  • 将 FBX 文件转换为 .gltf 后,模型非常小,为什么?

    问题 将 FBX 文件转换为 gltf 后 模型非常小 为什么 我尝试用以下方法缩放模型frontObject scale set 1000 1000 1000 但我收到以下错误 TypeError Cannot read property

随机推荐

  • 【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