Qt 5.15.2 三维显示功能

Qt 5.15.2 三维显示功能

三维显示效果:
在这里插入图片描述

.pro项目文件

QT       += core gui opengl 3dcore 3drender 3dinput 3dextras

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++17

# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
    dialog_fbx2glb.cpp \
    dialog_osgb_to_b3dm.cpp \
    main.cpp \
    mainwindow.cpp \
    scene.cpp

HEADERS += \
    dialog_fbx2glb.h \
    dialog_osgb_to_b3dm.h \
    mainwindow.h \
    scene.h

FORMS += \
    dialog_fbx2glb.ui \
    dialog_osgb_to_b3dm.ui \
    mainwindow.ui

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

DISTFILES += \
    images/211.ico \
    images/Clear2.ico \
    images/File.ico \
    images/Open.ico \
    images/opendir.png \
    images/openfile.png

Scene.h

#ifndef SCENE_H
#define SCENE_H

#include <QObject>
#include <QWidget>

#include <Qt3DCore/QEntity>
#include <Qt3DRender/QMesh>
#include <Qt3DRender/QCamera>
#include <Qt3DRender/QPointLight>
#include <Qt3DRender/QDirectionalLight>
#include <Qt3DCore/QTransform>
#include <Qt3DWindow>
#include <QOrbitCameraController>
#include <QFirstPersonCameraController>

#include <Qt3DExtras/QForwardRenderer>
#include <Qt3DExtras/QPhongMaterial>
#include <Qt3DExtras/QTorusMesh>
#include <Qt3DExtras/QSphereMesh>

#include <QKeyEvent>
#include <QTransform>
#include <QComponent>
#include <QQuaternion>
#include <QInputAspect>


class Scene : public QObject
{
    Q_OBJECT
public:
    Qt3DCore::QEntity *rootEntity;
    Qt3DCore::QEntity *model;
    Qt3DCore::QTransform *transform;
    Qt3DRender::QDirectionalLight *light;
    //
    explicit Scene(Qt3DExtras::Qt3DWindow *, QObject *parent=nullptr);
    void SetupMesh(Qt3DRender::QMesh *mesh);
    void StartScene();
    void Camera(Qt3DExtras::Qt3DWindow *view);
    void setCameraCenterPoint(QVector3D center);
    Qt3DCore::QEntity* findChildQEntity(QString objName,Qt3DCore::QEntity* rootEnt);
    QVector3D computCenterPoint(Qt3DCore::QEntity* first);


    void initOrbitCameraController(Qt3DCore::QEntity *ent);
    void initFirstPersonCameraController(Qt3DCore::QEntity *ent);

    void init3d(Qt3DExtras::Qt3DWindow *view);
    void NewScene(Qt3DRender::QMesh *);
    void NewScene2(Qt3DRender::QMesh *mesh);
    void SetupTransformRoot(Qt3DCore::QEntity* model);
    void SetupTransform(Qt3DCore::QEntity* modelPrivate);
    void SetupMaterial(Qt3DCore::QEntity* model);
    void SetupLighting();
    //添加新实体
    Qt3DCore::QEntity* addMeshEntity(Qt3DRender::QMesh *mesh);
    Qt3DCore::QEntity* addEntity(Qt3DCore::QComponent *comp);
    //
    Qt3DCore::QEntity* addNewEntity();
    //
    void KeyControls(QKeyEvent *event);
    void wheelControls(QWheelEvent *event);
    void mouseControls(QMouseEvent *event);
    void mousePressControls(QMouseEvent *event);
    void paintALL();



public slots:
    void LightXChanged(int angle);
    void LightYChanged(int angle);
    void LightZChanged(int angle);

private:
    Qt3DExtras::Qt3DWindow *view;
    unsigned int backgroudColor=0x42f4bc;    //0xffffff;  0x42f4bc
    //
    QPoint m_qpRotPosOld;
    int m_iScloe; //滚动放大缩小尺寸

    //旋转
    double m_dRotX;
    double m_dRotY;
    double m_dRotZ;

    //位移
    double m_dMoveX;
    double m_dMoveY;
    double m_dMoveZ;
    //


};

#endif // SCENE_H

scene.cpp

#include "scene.h"
#include <cmath>

Scene::Scene(Qt3DExtras::Qt3DWindow *view, QObject *parent) : QObject (parent)
{
    this->view=view;
    rootEntity = new Qt3DCore::QEntity();
    SetupTransformRoot(rootEntity);
    //
    view->setRootEntity(rootEntity);
    view->defaultFrameGraph()->setClearColor(QColor(QRgb(this->backgroudColor)));   //0x42f4bc
    Camera(view);
    StartScene();
    //
    this->initOrbitCameraController(rootEntity);
    //this->initFirstPersonCameraController();
}

void Scene::Camera(Qt3DExtras::Qt3DWindow *view)
{
    //其中camera是新建的camera实体,lens表示了镜头,这个函数有着四个参数,
    //第一个参数是视觉域,   45.0f
    //第二个是分辨率(这里选择了16比9),  16.0f/9.0f
    //第三个参数是近面摆放位置,   0.1f
    //最后一个是远面放置位置,    3000.0f
    //后两个参数的选择当中要特别注意,只有在远近面之间的物体才会显示,所以要是想全部显示出所加入的实体,
    //那么近面就要足够近,远面就要足够远。
    // Camera
    //Qt3DRender::QCamera *cameraEntity = view->camera();
    Qt3DRender::QCamera *camera = view->camera();
    camera->lens()->setPerspectiveProjection(45.0f,16.0f/9.0f, 0.1f, 3000.0f);   //近面板0.1f,远面板1000.0f
    camera->setViewCenter(QVector3D(-789, -2343, 10));    //0, 0, 0
    camera->setPosition(QVector3D(-789, -2343, 200));   //0,0,40  -200  5000  相机高度

    Qt3DInput::QInputAspect *input = new Qt3DInput::QInputAspect();
    view->registerAspect(input);
    //input->setCamera(cameraEntity);//使摄像机能左右转动
}

void Scene::setCameraCenterPoint(QVector3D center)
{
    Qt3DRender::QCamera *camera = view->camera();
    camera->lens()->setPerspectiveProjection(45.0f,16.0f/9.0f, 0.1f, 3000.0f);   //近面板0.1f,远面板1000.0f
    camera->setViewCenter(QVector3D(center.x()*1.5, center.y()*1.5, abs(center.z())));    //0, 0, 0
    camera->setPosition(QVector3D(center.x()*1.5, center.y()*1.5, abs(center.z())*1.5+50));   //0,0,40  -200  5000  相机高度
    qDebug()<<"camera point="<<camera->position();
    //
    Qt3DInput::QInputAspect *input = new Qt3DInput::QInputAspect();
    view->registerAspect(input);
}

Qt3DCore::QEntity* Scene::findChildQEntity(QString objName,Qt3DCore::QEntity* rootEnt)
{
    for (Qt3DCore::QNode* childNode : rootEnt->childNodes())
    {
        QString itemName="";
        Qt3DCore::QEntity* testObj=dynamic_cast<Qt3DCore::QEntity*>(childNode);
        if(testObj)
        {
            itemName=testObj->objectName();
            if(objName==itemName)
            {
                return testObj;
            }
        }
    }
    return nullptr;
}

QVector3D Scene::computCenterPoint(Qt3DCore::QEntity* first)
{
    QVector3D center(0, 0, 0);
    if(first!=nullptr)
    {
        // Now iterate over all the components and calculate the center point
        int totalSize=0;
        //
        for (Qt3DCore::QNode* childNode : first->childNodes())
        {
            Qt3DCore::QTransform* tranobj=dynamic_cast<Qt3DCore::QTransform*>(childNode);
            if(tranobj)
            {
                center += tranobj->translation();
                totalSize+=1;
            }
            Qt3DRender::QMesh* meshobj=dynamic_cast<Qt3DRender::QMesh*>(childNode);
            if(meshobj)
            {
                center += meshobj->geometry()->minExtent();
                center += meshobj->geometry()->maxExtent();
                totalSize+=2;
            }
        }
        //
        center /= totalSize; // compute the center point
        //定位相机
        //scene->setCameraCenterPoint(center);
        //
    }
    return center;
}


void Scene::init3d(Qt3DExtras::Qt3DWindow *view)
{
    delete model;
    //
    view->defaultFrameGraph()->setClearColor(QColor(QRgb(this->backgroudColor)));
    Camera(view);
    this->StartScene();
}

void Scene::StartScene()
{
    model = new Qt3DCore::QEntity(rootEntity);
    model->setObjectName("救生圈场景模型");

    //救生圈场景 模型   这个尺寸大小影响显示
    Qt3DExtras::QTorusMesh *torusMesh = new Qt3DExtras::QTorusMesh(model);
    torusMesh->setRadius(5);
    torusMesh->setMinorRadius(1);
    torusMesh->setRings(100);
    torusMesh->setSlices(20);
    model->addComponent(torusMesh);
    /*
    Qt3DExtras::QSphereMesh *sphereMesh = new Qt3DExtras::QSphereMesh(model);
    sphereMesh->setRadius(5);
    model->addComponent(sphereMesh);


    QString filename="C:/data/obj/Tile_+005_+006_OBJ/Tile_+005_+006/Tile_+005_+006.obj";
    //filename="D:\\data\\data3d\fbx\\HCZ.fbx";
    Qt3DRender::QMesh *mesh = new Qt3DRender::QMesh(model);
    mesh->setSource(QUrl::fromLocalFile(filename));
    mesh->setMeshName("objMesh");
    //mesh->setSource(QUrl("qrc:/data/obj/Tile_+005_+006_OBJ/Tile_+005_+006/Tile_+005_+006.obj"));
    //mesh->setSource(QUrl(filename));   //file:///
    model->addComponent(mesh);*/
    //
    SetupTransform(model);
    SetupMaterial(model);
    SetupLighting();

}

void Scene::NewScene(Qt3DRender::QMesh *mesh)
{
    delete model;
    model = new Qt3DCore::QEntity(rootEntity);

    SetupMesh(mesh);
    SetupTransform(model);
    SetupMaterial(model);
    SetupLighting();
}
void Scene::NewScene2(Qt3DRender::QMesh *mesh)
{
    delete model;
    model = new Qt3DCore::QEntity(rootEntity);

    SetupMesh(mesh);
    SetupTransform(model);
    SetupMaterial(model);
    SetupLighting();
}
Qt3DCore::QEntity* Scene::addMeshEntity(Qt3DRender::QMesh *mesh)
{
    Qt3DCore::QEntity* newEnt = new Qt3DCore::QEntity(rootEntity);
    newEnt->addComponent(mesh);
    return newEnt;
}

Qt3DCore::QEntity* Scene::addEntity(Qt3DCore::QComponent *comp)
{
    Qt3DCore::QEntity* newEnt = new Qt3DCore::QEntity(rootEntity);
    newEnt->addComponent(comp);
    return newEnt;
}

Qt3DCore::QEntity* Scene::addNewEntity()
{
    return new Qt3DCore::QEntity(rootEntity);
}

void Scene::SetupMesh(Qt3DRender::QMesh *mesh)
{
    model->addComponent(mesh);
}

void Scene::SetupTransformRoot(Qt3DCore::QEntity* model)
{
    transform = new Qt3DCore::QTransform(model);
    transform->setScale3D(QVector3D(1, 1, 1));
    transform->setRotation(QQuaternion::fromAxisAndAngle(QVector3D(1, 0, 0), 0));
    //transform->setRotation(QQuaternion::fromAxisAndAngle(QVector3D(0, 1, 0), 0));
    //transform->setScale(1.0f);
    //transform->setTranslation(QVector3D(-700.0f,-2100.0f,10.0f));

    model->addComponent(transform);
}
void Scene::SetupTransform(Qt3DCore::QEntity* modelPrivate)
{
    Qt3DCore::QTransform* tf = new Qt3DCore::QTransform(modelPrivate);
    tf->setScale3D(QVector3D(1, 1, 1));
    tf->setRotation(QQuaternion::fromAxisAndAngle(QVector3D(0, 0, 0), 0));
    //tf->setRotation(QQuaternion::fromAxisAndAngle(QVector3D(0, 1, 0), 0));
    //tf->setScale(1.0f);
    //tf->setTranslation(QVector3D(-700.0f,-2100.0f,10.0f));

    modelPrivate->addComponent(tf);
}

void Scene::SetupMaterial(Qt3DCore::QEntity* model)
{
    Qt3DRender::QMaterial *material = new Qt3DExtras::QPhongMaterial(model);
    model->addComponent(material);
}

void Scene::SetupLighting()
{
    Qt3DCore::QEntity *lightEntity = new Qt3DCore::QEntity(rootEntity);
    light = new Qt3DRender::QDirectionalLight(lightEntity);
    light->setColor("white");
    light->setIntensity(1);
    light->setWorldDirection(QVector3D(0,0,-1));

    lightEntity->addComponent(light);
}

//接管相机的鼠标操作 盘旋操作
void Scene::initOrbitCameraController(Qt3DCore::QEntity *ent)
{
    Qt3DExtras::QOrbitCameraController *controller = new Qt3DExtras::QOrbitCameraController(ent);
    controller->setCamera(view->camera());

}
//接管相机的鼠标操作  第一人操作
void Scene::initFirstPersonCameraController(Qt3DCore::QEntity *ent)
{
    Qt3DExtras::QFirstPersonCameraController *controller=new Qt3DExtras::QFirstPersonCameraController(ent);
    controller->setCamera(view->camera());
}

void Scene::paintALL()
{
    //对rootEntity 整体操作
    transform->setTranslation(QVector3D(m_dMoveX,m_dMoveY,m_iScloe));
    transform->setRotation(QQuaternion(sqrt(m_dRotX*m_dRotX+m_dRotY*m_dRotY),m_dRotX,m_dRotY,m_dRotZ));

}

//mouse wheel +/-  放大/缩小 功能
void Scene::wheelControls(QWheelEvent *event)
{
    float scale=2;
    if(event->angleDelta().x() >0 || event->angleDelta().y()>0){
        //放大
        //scale=1.1f;
        transform->setTranslation(QVector3D(transform->translation().x(),transform->translation().y(),transform->translation().z()+scale));
    }
    else
    {   //缩小
        //scale=0.9f;
        transform->setTranslation(QVector3D(transform->translation().x(),transform->translation().y(),transform->translation().z()-scale));
    }

    /*
    if (event->delta() < 0) {
        //m_iScloe--;
        m_iScloe=event->delta();
        this->paintALL();
    }
    else if (event->delta() > 0) {
        //m_iScloe++;
        m_iScloe=event->delta();
        this->paintALL();
    }*/

}

void Scene::mousePressControls(QMouseEvent *event)
{
    if(event->button()==Qt::LeftButton)
    {

    }
}

void Scene::mouseControls(QMouseEvent *event)
{
    QPoint pos = event->pos();

    //左键按下+move=>旋转
    if( event->buttons() & Qt::LeftButton)
    {

        if (pos.x()  > m_qpRotPosOld.x())
        {
            m_dRotX += 1;
        }
        else if(pos.x()  < m_qpRotPosOld.x())
        {
            m_dRotX -= 1;
        }
        if(pos.y()  > m_qpRotPosOld.y())
        {
            m_dRotY += 1;
        }
        else if(pos.y()  < m_qpRotPosOld.y())
        {
            m_dRotY -= 1;
        }
        //this->paintALL();
    }
    if( event->buttons() & Qt::RightButton)             //右键
    {   //右键按下+move=>移动
        if (pos.x()  > m_qpRotPosOld.x())
        {
            m_dMoveX += 1;
        }
        else if(pos.x()  < m_qpRotPosOld.x())
        {
            m_dMoveX -= 1;
        }
        if(pos.y()  > m_qpRotPosOld.y())
        {
            m_dMoveY -= 1;
        }
        else if(pos.y()  < m_qpRotPosOld.y())
        {
            m_dMoveY += 1;
        }
        //this->paintALL();
    }

    //rotate
    if(event->button() & Qt::RightButton)
    {   //mouse right press and moveing
        //if(event->type()==QEvent::MouseMove)
        {
            //event->MouseButtonPress
            int dy=pos.y()-m_qpRotPosOld.y();
            int dx=pos.x()-m_qpRotPosOld.x();
            if(dy>0){
                transform->setRotationY(transform->rotationY()+1);
            }
            else if(dy<0)
            {
                transform->setRotationY(transform->rotationY()-1);
            }
            //
            if(dx>0){
                transform->setRotationX(transform->rotationX()+1);
            }
            else if(dx<0)
            {
                transform->setRotationX(transform->rotationX()-1);
            }
        }
    }
    /**/
    //move
    if(event->button() & Qt::LeftButton)
    {   //mouse right press and moveing
        //if(event->type()==QEvent::MouseMove)
        {
            //event->MouseButtonPress
            int dy=pos.y()-m_qpRotPosOld.y();
            int dx=pos.x()-m_qpRotPosOld.x();
            if(dy>0){
                transform->setTranslation(QVector3D(transform->translation().x(),transform->translation().y()-2,transform->translation().z()));
            }
            else if(dy<0)
            {
                transform->setTranslation(QVector3D(transform->translation().x(),transform->translation().y()+2,transform->translation().z()));
            }
            if(dx>0){
                transform->setTranslation(QVector3D(transform->translation().x()-2,transform->translation().y(),transform->translation().z()));
            }
            else if(dx<0)
            {
                transform->setTranslation(QVector3D(transform->translation().x()+2,transform->translation().y(),transform->translation().z()));
            }
        }
    }
    //旋转显示窗口
    //glTranslatef(m_dMoveX, m_dMoveY, m_iScloe);
    //glRotatef(sqrt(m_dRotX*m_dRotX+m_dRotY*m_dRotY), m_dRotY,m_dRotX,m_dRotZ);
    m_qpRotPosOld = pos;
}

void Scene::KeyControls(QKeyEvent *event){
    if (event->modifiers().testFlag(Qt::ControlModifier)){
        //ctrl+方向键
        if(event->key()==Qt::Key_Up){
            transform->setRotationX(transform->rotationX()-6);
        }
        if(event->key()==Qt::Key_Down){
            transform->setRotationX(transform->rotationX()+6);
        }
        if(event->key()==Qt::Key_Left){
            transform->setRotationY(transform->rotationY()-6);
        }
        if(event->key()==Qt::Key_Right){
            transform->setRotationY(transform->rotationY()+6);
        }
    }else if (event->modifiers().testFlag(Qt::ShiftModifier)) {
        //shift+方向键 上/下
        if(event->key()==Qt::Key_Up){  //放大
            transform->setTranslation(QVector3D(transform->translation().x(),transform->translation().y(),transform->translation().z()-2));
        }
        if(event->key()==Qt::Key_Down){  //缩小
            transform->setTranslation(QVector3D(transform->translation().x(),transform->translation().y(),transform->translation().z()+2));
        }
    }else{
        //方向键  move
        if(event->key()==Qt::Key_Up){
            transform->setTranslation(QVector3D(transform->translation().x(),transform->translation().y()+1,transform->translation().z()));
        }
        if(event->key()==Qt::Key_Down){
            transform->setTranslation(QVector3D(transform->translation().x(),transform->translation().y()-1,transform->translation().z()));
        }
        if(event->key()==Qt::Key_Left){
            transform->setTranslation(QVector3D(transform->translation().x()-1,transform->translation().y(),transform->translation().z()));
        }
        if(event->key()==Qt::Key_Right){
            transform->setTranslation(QVector3D(transform->translation().x()+1,transform->translation().y(),transform->translation().z()));
        }
    }
}

void Scene::LightXChanged(int angle)
{
    light->setWorldDirection(QVector3D(angle,light->worldDirection().y(),light->worldDirection().z()));
}

void Scene::LightYChanged(int angle)
{
    light->setWorldDirection(QVector3D(light->worldDirection().x(),angle,light->worldDirection().z()));
}

void Scene::LightZChanged(int angle)
{
    light->setWorldDirection(QVector3D(light->worldDirection().x(),light->worldDirection().y(),angle));
}

本blog地址:https://blog.csdn.net/hsg77

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构(九)】顺序存储二叉树(2)

文章目录 1. 相关概念2. 顺序存储二叉树的遍历 1. 相关概念 从数据存储来看&#xff0c;数组存储方式和树的存储方式可以相互转换&#xff0c;即数组可以转换成树&#xff0c;树也可以转换成数组&#xff0c;看右面的示意图。 转换原则:     1.上图的二叉树的结点&#xff…

低代码:轻松构建应用程序的新时代

在当今数字化时代&#xff0c;应用程序对于日常企业业务的开展&#xff0c;已经成为一种刚需。然而&#xff0c;应用程序开发的过程往往耗时耗力&#xff0c;对于企业来讲&#xff0c;是一笔不小的成本开支。低代码问世以来&#xff0c;一直在尝试为业务人员赋能&#xff0c;让…

通过Mock玩转Golang单元测试!

1.单元测试中的困难 如果项目中没有单元测试&#xff0c;对于刚刚开始或者说是规模还小的项目来说&#xff0c;效率可能还不错。但是一旦项目变得复杂起来&#xff0c;每次新增功能或对旧功能的改动都要重新手动测试一遍所有场景&#xff0c;费时费力&#xff0c;而且还有可能…

JS加密/解密之HOOK实战2

上一篇文章介绍了HOOK常规的应用场景&#xff0c;这篇我们讲一下HOOK其他原生函数。又是一个新的其他思路 很多时候&#xff0c;当我们想要某些网站的请求参数的时候&#xff0c;因为某些加密导致了获取起来很复杂。 这时候hook就十分方便了 源代码 var _JSON_Parse JSON.…

ShardingSphere数据分片之分表操作

1、概述 Apache ShardingSphere 是一款分布式的数据库生态系统&#xff0c; 可以将任意数据库转换为分布式数据库&#xff0c;并通过数据分片、弹性伸缩、加密等能力对原有数据库进行增强。 Apache ShardingSphere 设计哲学为 Database Plus&#xff0c;旨在构建异构数据库上…

基于ssm高校实验室管理系统的设计与实现论文

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对高校实验室信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性…

(二)五种最新算法(SWO、COA、LSO、GRO、LO)求解无人机路径规划MATLAB

一、五种算法&#xff08;SWO、COA、LSO、GRO、LO&#xff09;简介 1、蜘蛛蜂优化算法SWO 蜘蛛蜂优化算法&#xff08;Spider wasp optimizer&#xff0c;SWO&#xff09;由Mohamed Abdel-Basset等人于2023年提出&#xff0c;该算法模型雌性蜘蛛蜂的狩猎、筑巢和交配行为&…

区块链实验室(29) - 关闭或删除FISCO日志

1. FISCO日志 缺省情况下&#xff0c;FISCO启动日志模块&#xff0c;日志记录的位置在节点目录中。以FISCO自带案例为例&#xff0c;4节点的FISCO网络&#xff0c;24个区块产生的日志大小&#xff0c;见下图所示。 2.关闭日志模块 当节点数量增大&#xff0c;区块高度增大时&…

CMake ‘3.10.2‘ was not found in PATH or by cmake.dir property.

在部署Yolov5到安卓端的过程中出现&#xff1a;CMake ‘3.10.2’ was not found in PATH or by cmake.dir property. 原因&#xff1a; cmake版本太高&#xff0c;需要安装低版本的cmake 最开始下载的是默认最高版本的cmake,默认是3.22.1&#xff0c;解决方案是&#xff0c;下载…

MarsEdit 5 for Mac(博客编辑软件) - 博客创作的完美拍档!

您是一位热爱写作和分享的博主吗&#xff1f;如果是的话&#xff0c;那么MarsEdit 5 for Mac将成为您创作之旅中的完美拍档&#xff01;这款博客编辑软件为Mac用户提供了无与伦比的便捷和灵活性。 MarsEdit 5具有直观的界面和强大的功能&#xff0c;让您轻松管理和编辑多个博客…

使用 PyTorch 完全分片数据并行技术加速大模型训练

本文&#xff0c;我们将了解如何基于 PyTorch 最新的 完全分片数据并行 (Fully Sharded Data Parallel&#xff0c;FSDP) 功能用 Accelerate 库来训练大模型。 动机 &#x1f917; 随着机器学习 (ML) 模型的规模、大小和参数量的不断增加&#xff0c;ML 从业者发现在自己的硬件…

什么是网站劫持

网站劫持是一种网络安全威胁&#xff0c;它通过非法访问或篡改网站的内容来获取机密信息或者破坏计算机系统。如果您遇到了网站劫持问题&#xff0c;建议您立即联系相关的安全机构或者技术支持团队&#xff0c;以获得更专业的帮助和解决方案。

短视频矩阵系统多账号搭建技术源码(源头3年开发者技术独立搭建)

一、短视频账号矩阵系统源码搭建源码步骤&#xff1a; 1. 选择适合的云服务环境搭建虚拟机。这里以AWS为例&#xff0c;购买并配置相应数量的EC2实例以及相应的网络设置。 2. 根据需要搭建多个抖音、快手等平台的官方账号&#xff0c;并根据各个平台的要求和规则进行内容创作和…

Web漏洞扫描工具有哪些?使用教程讲解

作为网络安全工程师&#xff0c;了解并掌握各种Web漏洞扫描工具对于识别和防御网络威胁至关重要。以下是一些常用且广受推崇的Web漏洞扫描工具&#xff0c;它们覆盖了从自动扫描到深度定制的各种需求。希望你能用得到呢。 1. OWASP ZAP (Zed Attack Proxy) 原理&#xff1a;…

Selenium+Python自动化脚本环境搭建的全过程

*本文仅介绍环境的搭建&#xff0c;不包含任何脚本编写教程。 先整体说一下需要用到工具 1、Python环境&#xff08;包括pip&#xff09; 2、谷歌浏览器&#xff08;包括对应的WebDriver&#xff09; 详细步骤&#xff1a; 一、Python环境搭建 1、下载安装包 Python Relea…

BitComet(比特彗星)for Mac/Win:极速下载,畅享BT资源!

BitComet&#xff08;比特彗星&#xff09;是一款功能强大的BT下载客户端&#xff0c;专为Mac和Windows用户量身定制。它以极速下载、长效种子、磁盘缓存和边下边放等技术为特色&#xff0c;让您轻松畅享BT资源。 一、极速下载 BitComet&#xff08;比特彗星&#xff09;采用…

Oauth2.0 认证

目录 前言 1.介绍 2.Oauth2.0过程详解 3.Oauth 整合到 Spring Boot 实践 4.方法及配置详解&#xff1a; 总结 前言 Oauth2.0 是非常流行的网络授权表准&#xff0c;已经广泛应用在全球范围内&#xff0c;比较大的公司&#xff0c;如腾讯等都有大量的应用场景。 1.介绍 …

Selenium UI自动化实战过程记录

一.前言 1.1项目框架 项目如何使用框架&#xff1a; 本项目采用unitest框架 设计模式是如何应用&#xff1a;本项目采用pageobject设计模式 UI对象库思想 项目设计 一个模块&#xff08;被测项目的页面&#xff09;对应一个py文件及一个测试类&#xff08;测试文件&#x…

Azure Machine Learning - 使用 Azure OpenAI 服务生成文本

使用 Azure OpenAI 服务生成文本 关注TechLead&#xff0c;分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管理经验&#xff0c;同济本复旦硕&#xff0c;复旦机器人智能实验室成员&#xff0c;阿里云认证的资深架构师&#xff0c;项目管理专业人士&…

快解析结合智邦国际使用教程

北京智邦国际软件技术有限公司&#xff0c;是经中华人民共和国工业和信息化部以及北京经济和信息化委员会评定和审核的双软企业&#xff0c;国家重点支持的高新技术企业。 十几年来致力于企业信息化&#xff0c;主要从事ERP、CRM、项目管理、人资管理、移动应用等企业管理软件的…