Qt OpenGL 集成:開發 3D 圖形應用

Qt 提供了完善的 OpenGL 集成方案,使開發者能夠在 Qt 應用中高效開發 3D 圖形應用。通過 Qt 的 OpenGL 模塊,可簡化 OpenGL 上下文管理、窗口渲染和跨平臺適配,同時結合現代 OpenGL 特性(如著色器、頂點緩沖、紋理等)實現高性能 3D 圖形渲染。本文從基礎環境搭建到高級 3D 渲染,全面解析 Qt 與 OpenGL 的集成開發。

一、Qt 中 OpenGL 的核心組件

Qt 對 OpenGL 的封裝主要通過以下類實現,它們構成了 3D 開發的基礎:

類名作用
QOpenGLWidget繼承自 QWidget,提供 OpenGL 渲染上下文和窗口,是 3D 渲染的主載體
QOpenGLFunctions封裝 OpenGL 函數(如 glClear、glDrawArrays 等),避免手動加載函數指針
QOpenGLShader管理單個著色器(頂點著色器、片段著色器等)的編譯
QOpenGLShaderProgram鏈接多個著色器為著色器程序,用于渲染時的可編程管線控制
QOpenGLBuffer封裝 OpenGL 緩沖對象(VBO/VAO/EBO),管理頂點數據存儲
QOpenGLTexture封裝 OpenGL 紋理對象,支持加載圖像并綁定到著色器

二、基礎環境搭建:第一個 3D 窗口

使用 QOpenGLWidget 搭建最基礎的 OpenGL 渲染環境,核心是重寫其三個關鍵虛函數:

1. 核心函數說明
  • initializeGL():初始化 OpenGL 上下文(如設置清除顏色、啟用深度測試、編譯著色器等),僅在窗口創建時調用一次。
  • resizeGL(int w, int h):窗口大小變化時調用,用于更新視口和投影矩陣。
  • paintGL():負責實際渲染邏輯(如繪制幾何體、更新模型矩陣等),每次窗口刷新時調用。
2. 示例:創建空白 OpenGL 窗口
// main.cpp
#include <QApplication>
#include <QOpenGLWidget>
#include <QOpenGLFunctions>
#include <QOpenGLShaderProgram>// 自定義 OpenGL 窗口類
class MyGLWidget : public QOpenGLWidget, protected QOpenGLFunctions {Q_OBJECT
public:MyGLWidget(QWidget *parent = nullptr) : QOpenGLWidget(parent) {}protected:// 初始化 OpenGL 環境void initializeGL() override {initializeOpenGLFunctions();  // 初始化 OpenGL 函數glClearColor(0.2f, 0.3f, 0.3f, 1.0f);  // 設置清除顏色(深灰)glEnable(GL_DEPTH_TEST);  // 啟用深度測試(3D 渲染必備)}// 窗口大小變化時更新視口void resizeGL(int w, int h) override {glViewport(0, 0, w, h);  // 設置視口:從(0,0)到(w,h)}// 渲染邏輯void paintGL() override {glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);  // 清除顏色和深度緩沖}
};int main(int argc, char *argv[]) {QApplication a(argc, argv);MyGLWidget w;w.setWindowTitle("Qt OpenGL 基礎窗口");w.resize(800, 600);w.show();return a.exec();
}#include "main.moc"

運行后會顯示一個深灰色背景的窗口,這是 3D 渲染的基礎畫布。

三、繪制 3D 幾何體:頂點數據與著色器

現代 OpenGL 依賴著色器(Shader)進行渲染,需定義頂點數據并通過著色器程序將其繪制到屏幕上。

1. 定義頂點數據與緩沖

3D 幾何體由頂點組成,每個頂點包含位置、顏色、紋理坐標等屬性。通過頂點緩沖對象(VBO)和頂點數組對象(VAO)管理這些數據:

// 在 MyGLWidget 中添加成員變量
private:QOpenGLShaderProgram *shaderProgram;  // 著色器程序unsigned int VAO, VBO;  // 頂點數組對象和頂點緩沖對象float vertices[18] = {  // 三角形頂點數據(3個頂點,每個包含x,y,z坐標)-0.5f, -0.5f, 0.0f,  // 頂點10.5f, -0.5f, 0.0f,  // 頂點20.0f,  0.5f, 0.0f   // 頂點3};
2. 編寫著色器程序

著色器分為頂點著色器(處理頂點位置)和片段著色器(處理像素顏色),需在 initializeGL 中加載并編譯:

頂點著色器(vertexShader.vert)

#version 330 core
layout (location = 0) in vec3 aPos;  // 頂點位置輸入void main() {gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);  // 輸出頂點位置
}

片段著色器(fragmentShader.frag)

#version 330 core
out vec4 FragColor;  // 輸出像素顏色void main() {FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);  // 橙色
}
3. 初始化緩沖與著色器

initializeGL 中初始化 VAO、VBO 和著色器程序:

void MyGLWidget::initializeGL() {initializeOpenGLFunctions();// 編譯著色器shaderProgram = new QOpenGLShaderProgram(this);// 加載并編譯頂點著色器if (!shaderProgram->addShaderFromSourceFile(QOpenGLShader::Vertex, ":/vertexShader.vert")) {qDebug() << "頂點著色器編譯錯誤:" << shaderProgram->log();}// 加載并編譯片段著色器if (!shaderProgram->addShaderFromSourceFile(QOpenGLShader::Fragment, ":/fragmentShader.frag")) {qDebug() << "片段著色器編譯錯誤:" << shaderProgram->log();}// 鏈接著色器程序if (!shaderProgram->link()) {qDebug() << "著色器鏈接錯誤:" << shaderProgram->log();}// 初始化 VAO 和 VBOglGenVertexArrays(1, &VAO);glGenBuffers(1, &VBO);// 綁定 VAO(后續操作會記錄到 VAO 中)glBindVertexArray(VAO);// 綁定 VBO 并傳入頂點數據glBindBuffer(GL_ARRAY_BUFFER, VBO);glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);// 配置頂點屬性(位置屬性)glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);glEnableVertexAttribArray(0);  // 啟用位置屬性// 解綁緩沖(可選,避免后續誤操作)glBindBuffer(GL_ARRAY_BUFFER, 0);glBindVertexArray(0);// 初始化其他狀態glClearColor(0.2f, 0.3f, 0.3f, 1.0f);glEnable(GL_DEPTH_TEST);
}
4. 繪制幾何體

paintGL 中繪制三角形:

void MyGLWidget::paintGL() {glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);// 使用著色器程序shaderProgram->bind();// 綁定 VAO(包含頂點數據和屬性配置)glBindVertexArray(VAO);// 繪制三角形(3個頂點)glDrawArrays(GL_TRIANGLES, 0, 3);// 解綁glBindVertexArray(0);shaderProgram->release();
}

運行后會在深灰色背景上顯示一個橙色三角形,這是 3D 渲染的基礎形態。

四、3D 場景進階:矩陣變換與相機控制

要實現真正的 3D 效果,需通過矩陣變換(模型、視圖、投影矩陣)控制幾何體的位置、角度和透視,并通過相機控制實現場景漫游。

1. 矩陣變換基礎
  • 模型矩陣(Model Matrix):控制幾何體的平移、旋轉、縮放。
  • 視圖矩陣(View Matrix):模擬相機位置和朝向(如移動相機查看不同角度)。
  • 投影矩陣(Projection Matrix):定義透視效果(如近大遠小)。

Qt 中可通過 QMatrix4x4 處理矩陣運算,或集成 glm(OpenGL Mathematics)庫(更強大的矩陣工具)。

2. 示例:3D 立方體與相機控制

步驟 1:定義立方體頂點數據(包含位置和紋理坐標):

float vertices[] = {// 位置(x,y,z)            // 紋理坐標(s,t)-0.5f, -0.5f, -0.5f,  0.0f, 0.0f,0.5f, -0.5f, -0.5f,  1.0f, 0.0f,0.5f,  0.5f, -0.5f,  1.0f, 1.0f,// ... 其他5個面的頂點(共36個頂點,立方體6個面,每個面2個三角形)
};

步驟 2:添加矩陣uniform變量到著色器
頂點著色器需接收矩陣變換:

#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec2 aTexCoord;out vec2 TexCoord;  // 傳遞紋理坐標到片段著色器uniform mat4 model;    // 模型矩陣
uniform mat4 view;     // 視圖矩陣
uniform mat4 projection; // 投影矩陣void main() {gl_Position = projection * view * model * vec4(aPos, 1.0f);TexCoord = aTexCoord;
}

步驟 3:初始化矩陣并傳遞到著色器
resizeGL 中初始化投影矩陣,在 paintGL 中更新模型和視圖矩陣:

void MyGLWidget::resizeGL(int w, int h) {glViewport(0, 0, w, h);// 透視投影矩陣(fov=45°,寬高比=w/h,近平面=0.1,遠平面=100)projection.setToIdentity();projection.perspective(45.0f, (float)w/h, 0.1f, 100.0f);
}void MyGLWidget::paintGL() {glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);shaderProgram->bind();// 模型矩陣:旋轉立方體QMatrix4x4 model;model.rotate(rotationAngle, 1.0f, 1.0f, 0.0f);  // 繞(1,1,0)軸旋轉shaderProgram->setUniformValue("model", model);// 視圖矩陣:相機位置(在(0,0,3)處,看向原點)QMatrix4x4 view;view.translate(0.0f, 0.0f, -3.0f);  // 相機后移3個單位shaderProgram->setUniformValue("view", view);// 投影矩陣shaderProgram->setUniformValue("projection", projection);// 繪制立方體(36個頂點)glBindVertexArray(VAO);glDrawArrays(GL_TRIANGLES, 0, 36);// 解綁glBindVertexArray(0);shaderProgram->release();// 旋轉動畫(每幀更新角度)rotationAngle += 0.5f;update();  // 觸發重繪
}

步驟 4:鼠標交互控制相機
通過重寫鼠標事件實現旋轉、縮放:

void MyGLWidget::mousePressEvent(QMouseEvent *event) {lastMousePos = event->pos();  // 記錄鼠標按下位置
}void MyGLWidget::mouseMoveEvent(QMouseEvent *event) {if (event->buttons() & Qt::LeftButton) {// 計算鼠標移動偏移int dx = event->x() - lastMousePos.x();int dy = event->y() - lastMousePos.y();// 更新相機旋轉角度(示例:簡單映射)cameraYaw += dx * 0.5f;cameraPitch += dy * 0.5f;lastMousePos = event->pos();update();}
}

五、紋理與光照:提升真實感

紋理(貼圖像到幾何體表面)和光照(模擬光源效果)是 3D 場景真實感的核心。

1. 紋理映射

步驟 1:加載紋理圖像
使用 QOpenGLTexture 加載圖片并配置:

void MyGLWidget::initializeGL() {// ... 其他初始化// 加載紋理QOpenGLTexture *texture = new QOpenGLTexture(QImage(":/container.jpg").mirrored());texture->setMinificationFilter(QOpenGLTexture::LinearMipMapLinear);  // 縮小過濾texture->setMagnificationFilter(QOpenGLTexture::Linear);  // 放大過濾texture->setWrapMode(QOpenGLTexture::Repeat);  // 紋理環繞方式shaderProgram->setUniformValue("ourTexture", 0);  // 綁定到紋理單元0
}

步驟 2:在片段著色器中應用紋理

#version 330 core
in vec2 TexCoord;  // 接收紋理坐標
out vec4 FragColor;uniform sampler2D ourTexture;  // 紋理采樣器void main() {FragColor = texture(ourTexture, TexCoord);  // 采樣紋理顏色
}
2. 基礎光照

通過添加光源和材質屬性模擬漫反射和鏡面反射:

// 頂點著色器(輸出法向量和世界坐標)
#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aNormal;  // 法向量out vec3 FragPos;  // 世界空間中的頂點位置
out vec3 Normal;   // 法向量uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;void main() {FragPos = vec3(model * vec4(aPos, 1.0));Normal = mat3(transpose(inverse(model))) * aNormal;  // 修正法向量(考慮模型變換)gl_Position = projection * view * vec4(FragPos, 1.0);
}// 片段著色器(計算漫反射和鏡面反射)
#version 330 core
in vec3 FragPos;
in vec3 Normal;out vec4 FragColor;uniform vec3 lightPos;    // 光源位置
uniform vec3 viewPos;     // 相機位置
uniform vec3 lightColor;  // 光源顏色
uniform vec3 objectColor; // 物體顏色void main() {// 環境光float ambientStrength = 0.1f;vec3 ambient = ambientStrength * lightColor;// 漫反射vec3 norm = normalize(Normal);vec3 lightDir = normalize(lightPos - FragPos);float diff = max(dot(norm, lightDir), 0.0);vec3 diffuse = diff * lightColor;// 鏡面反射float specularStrength = 0.5f;vec3 viewDir = normalize(viewPos - FragPos);vec3 reflectDir = reflect(-lightDir, norm);float spec = pow(max(dot(viewDir, reflectDir), 0.0), 32);  // 32是高光系數vec3 specular = specularStrength * spec * lightColor;// 最終顏色vec3 result = (ambient + diffuse + specular) * objectColor;FragColor = vec4(result, 1.0);
}

六、高級應用:模型加載與幀緩沖

1. 加載復雜 3D 模型

使用 Assimp(Open Asset Import Library)加載 OBJ、FBX 等格式的模型,Qt 中可通過 QOpenGLWidget 結合 Assimp 實現:

// 偽代碼:使用Assimp加載模型
#include <assimp/Importer.hpp>
#include <assimp/scene.h>
#include <assimp/postprocess.h>void loadModel(const std::string &path) {Assimp::Importer importer;const aiScene *scene = importer.ReadFile(path, aiProcess_Triangulate | aiProcess_FlipUVs);  // 三角化、翻轉UVif (!scene || scene->mFlags & AI_SCENE_FLAGS_INCOMPLETE || !scene->mRootNode) {qDebug() << "Assimp錯誤:" << importer.GetErrorString();return;}// 遞歸處理場景中的所有網格...
}
2. 幀緩沖(FBO)與離屏渲染

使用幀緩沖實現高級效果(如陰影、后期處理):

// 初始化幀緩沖
void initFramebuffer() {glGenFramebuffers(1, &FBO);glBindFramebuffer(GL_FRAMEBUFFER, FBO);// 創建顏色附件(紋理)glGenTextures(1, &textureColorbuffer);glBindTexture(GL_TEXTURE_2D, textureColorbuffer);glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 800, 600, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureColorbuffer, 0);// 檢查幀緩沖完整性if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)qDebug() << "幀緩沖不完整!";glBindFramebuffer(GL_FRAMEBUFFER, 0);  // 解綁
}// 離屏渲染到幀緩沖,再將紋理繪制到屏幕
void paintGL() {// 1. 渲染到幀緩沖glBindFramebuffer(GL_FRAMEBUFFER, FBO);glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);// 繪制場景...glBindFramebuffer(GL_FRAMEBUFFER, 0);// 2. 渲染幀緩沖紋理到屏幕(全屏四邊形)glClear(GL_COLOR_BUFFER_BIT);screenShader->bind();glBindVertexArray(screenVAO);glBindTexture(GL_TEXTURE_2D, textureColorbuffer);glDrawArrays(GL_TRIANGLES, 0, 6);
}

七、性能優化與注意事項

  1. 頂點緩沖優化:使用索引緩沖(EBO)減少重復頂點數據,降低內存占用。
  2. 狀態管理:減少 OpenGL 狀態切換(如綁定不同 VAO、紋理),提高渲染效率。
  3. 著色器優化:簡化片段著色器邏輯,避免復雜計算;使用著色器緩存減少編譯時間。
  4. 調試技巧
    • 啟用 OpenGL 調試輸出(glDebugMessageCallback)。
    • 使用 QOpenGLDebugLogger 捕獲 Qt 中的 OpenGL 錯誤。
    • 借助 RenderDoc 等工具調試 3D 渲染流程。
  5. 跨平臺適配:不同平臺的 OpenGL 版本支持不同,需通過 QSurfaceFormat 指定版本(如 OpenGL 3.3 核心模式)。

八、總結

Qt 與 OpenGL 的集成簡化了 3D 應用開發的底層細節(如窗口管理、上下文創建),使開發者可專注于渲染邏輯。通過 QOpenGLWidget、著色器程序、矩陣變換和相機控制,可實現從簡單幾何體到復雜 3D 場景的渲染。結合紋理、光照、模型加載和幀緩沖等技術,能開發出具有專業級真實感的 3D 應用,適用于游戲、仿真、CAD 等領域。掌握這些技術后,可進一步探索 Vulkan(Qt 也支持)等更現代的圖形 API。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/90536.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/90536.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/90536.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【NLP輿情分析】基于python微博輿情分析可視化系統(flask+pandas+echarts) 視頻教程 - 熱詞評論查詢功能實現

大家好&#xff0c;我是java1234_小鋒老師&#xff0c;最近寫了一套【NLP輿情分析】基于python微博輿情分析可視化系統(flaskpandasecharts)視頻教程&#xff0c;持續更新中&#xff0c;計劃月底更新完&#xff0c;感謝支持。今天講解熱詞評論查詢功能實現 視頻在線地址&#…

使用 Google Earth 的 DEM — 教程。

數字高程模型 (DEM)描繪了已知高程點之間的表面高程。本教程將向您展示如何使用 Google Earth 的高程數據生成 DEM。在當今世界&#xff0c;DEM 主要用于 GIS 應用。 當然&#xff0c;我們可以從美國地質調查局 (USGS) 網站下載數字高程模型 (DEM)。但如果我們想知道某個地點的…

在 UniApp 中實現中間凸起 TabBar 的完整指南

如何在 UniApp 中設置中間 TabBar 凸起效果 在移動應用開發中&#xff0c;TabBar 是常見的導航組件&#xff0c;而中間凸起的 TabBar 按鈕則是一種流行的設計風格&#xff0c;常用于突出重要功能&#xff08;如發布、拍照等&#xff09;。UniApp 提供了 midButton 屬性&#xf…

微觀低代碼

今日去深圳的一家工廠給客戶做培訓&#xff0c;主要培訓內容為低代碼產品的二開和功能演示。客戶使用了20年的ERP和OA系統&#xff0c;目前想對接到低代碼平臺。客戶目前想實現的主要功能是&#xff0c;對接OA的單點登錄&#xff0c;把ERP的功能遷移到低代碼平臺上來工廠規模比…

Linux進程控制:掌握系統的核心脈絡

Linux進程控制&#xff1a;掌握系統的核心脈絡 在 Linux 系統中&#xff0c;進程控制是系統運行的核心機制之一。無論是日常的命令行操作&#xff0c;還是復雜的后臺服務運行&#xff0c;都離不開對進程的管理和控制。本文將深入探討 Linux 進程控制的相關知識&#xff0c;幫助…

4N90-ASEMI電機控制專用4N90

編輯&#xff1a;LL4N90-ASEMI電機控制專用4N90型號&#xff1a;4N90品牌&#xff1a;ASEMI封裝&#xff1a;ITO-220ABRDS(on):3.60Ω批號&#xff1a;最新引腳數量&#xff1a;3封裝尺寸&#xff1a;如圖特性&#xff1a;N溝道MOS管工作結溫&#xff1a;-55℃~150℃一、卓越性…

Java 筆記 lambda

?Lambda 基本語法 (parameters) -> expression 或 (parameters) -> { statements }// 無參數 Runnable r () -> System.out.println("Hello");// 單個參數&#xff08;小括號可省略&#xff09; Consumer<String> c s -> System.out.println(s…

安全風險監測平臺:被動應對向主動預防的轉變

一、智能識別預警系統安全風險監測平臺通過部署多維度感知網絡&#xff0c;實現對各類安全隱患的智能識別與實時預警。系統采用深度學習算法&#xff0c;對人員行為、設備狀態、環境參數等進行全天候監測分析&#xff0c;建立動態風險評估模型。當檢測到異常情況時&#xff0c;…

圖片查重從設計到實現(2)Milvus安裝準備etcd介紹、應用場景及Docker安裝配置

etcd作用、應用場景及Docker安裝配置 在分布式向量數據庫 Milvus 的架構中&#xff0c;etcd 扮演著至關重要的角色。Milvus 用于存儲和管理海量向量數據&#xff0c;支持高效的相似性搜索等操作&#xff0c;而其分布式集群的正常運行高度依賴元數據的一致性和可靠性&#xff0c…

零彈窗干擾的貪吃蛇游戲,下載即玩

軟件介紹 在尋找貪吃蛇游戲的過程中&#xff0c;我發現了一款PC端版本&#xff0c;無需登錄即可直接使用&#xff0c;完全符合我的需求。 使用優勢 這款軟件最大的亮點在于完全免費&#xff0c;沒有任何廣告和彈窗干擾&#xff0c;支持完全離線運行&#xff0c;讓用戶能夠專注…

excel2013VBA開發access mdb數據庫系統的一點經驗分享

最近&#xff0c;自己從網盤里重新下載了過去保存的vba開發資料&#xff0c;就順手研究起了如何能通過excel203結合access 2013 mdb數據庫系統開發個VBA小系統。過簡單一說說了&#xff01;接說干貨經驗分享吧&#xff0c;1、俺先在mdb數據庫中建了一個有自動編號字段的數據表&…

我們能否承擔微服務帶來的復雜性和運維成本?

坦率地說&#xff0c;并非所有團隊都應該&#xff0c;承擔微服務帶來的復雜性和運維成本。在做出決定前&#xff0c;我們必須進行自我評估。 以下是評估是否能承擔微服務成本需要考慮的關鍵方面&#xff1a; 一、 復雜性帶來的挑戰 (Complexity Challenges):分布式系統固有復雜…

HCIP--MGRE實驗

一、實驗拓撲二、配置思路1、建立拓撲&#xff0c;配置IP&#xff0c;配置缺省路由是公網通暢2、路由器R1-R5,R2-R5,R3-R5之間都是串線鏈接&#xff0c;由于華為路由器默認的串線協議為PPP&#xff0c;因此根據實驗要求&#xff0c;R1-R5,R2-R5之間直接進行單向認證&#xff0c…

數字孿生映射探索驅動的具身導航!MorphoNavi:面向對象映射的空地機器人導航

作者&#xff1a; Sausar Karaf, Mikhail Martynov, Oleg Sautenkov, Zhanibek Darush, Dzmitry Tsetserukou單位&#xff1a;俄羅斯斯科爾科沃科學技術研究院智能空間機器人實驗室論文標題&#xff1a;MorphoNavi: Aerial-Ground Robot Navigation with Object Oriented Mappi…

統計與大數據分析與數學金融課程解析

CDA數據分析師證書含金量高&#xff0c;適應了未來數字化經濟和AI發展趨勢&#xff0c;難度不高&#xff0c;行業認可度高&#xff0c;對于找工作很有幫助。一、課程體系對比矩陣維度統計與大數據分析數學金融交叉領域數學基礎概率論(90%)隨機過程(85%)線性代數(100%)核心工具P…

整蠱小程序:關機程序(C語言)

整蠱小程序&#xff1a;關機程序&#xff08;C語言) 跟著潼心走&#xff0c;輕松拿捏C語言&#xff0c;困惑通通走&#xff0c;一去不回頭~歡迎開始今天的學習內容&#xff0c;你的支持就是博主最大的動力。 目錄 整蠱小程序&#xff1a;關機程序&#xff08;C語言) 程序內容…

PHP框架之Laravel框架教程:1. laravel搭建

1. laravel搭建 本教程適合有php基礎的同學學習 安裝方式一&#xff1a; 使用 Laravel 安裝器&#xff1a; 需要本地先安裝PHP 和 Composer&#xff0c;這個自行安裝下。 安裝完成后驗證方式&#xff1a; // 終端輸入&#xff0c;就可以看到結果 php --version composer --vers…

HMC7044芯片配置(圖文+解析+代碼仿真)

詳細代碼及仿真源文件已同步上傳至個人主頁資源&#xff08;原創不易&#xff0c;轉載請注明出處&#xff09; 目錄 模塊圖 代碼實現 時序圖 仿真圖 HMC7044介紹 一、概述 HMC7044是帶有 JESD204B 接口的高性能、3.2 GHz、14 路輸出抖動衰減器&#xff0c;提供 14 路低噪…

Dify開發教程筆記(一): 文件及系統參數變量說明及使用

開始 Copy page 定義“開始” 節點是每個工作流應用&#xff08;Chatflow / Workflow&#xff09;必備的預設節點&#xff0c;為后續工作流節點以及應用的正常流轉提供必要的初始信息&#xff0c;例如應用使用者所輸入的內容、以及上傳的文件等。 配置節點在開始節點的設置頁…

iOS 26,雙版本更新來了

7 月 25 日&#xff0c;蘋果終于給用戶推送了 iOS 26 的首個公測版本。參與了公測版計劃的小伙伴在軟件更新頁面選擇 iOS 26 Public Beta 就能升級 iOS 26 的公測版。同時蘋果還推送了 iOS 26 Beta 4 的第二個版本 。也就是說之前已經升級了 iOS 26 Beta 4 的小伙伴&#xff0c…