React+Three.js實現3D場景壓力/溫度/密度分布可視化

本文介紹了一個基于React和Three.js的3D壓力可視化解決方案,該方案能夠:

  • 加載并渲染3D壓力模型數據

  • 提供動態顏色映射功能,支持多種顏色方案:彩虹-rainbow,冷暖-cooltowarm,黑體-blackbody,灰度-grayscale

  • 實現固定位置的顏色圖例顯示

  • 通過GUI界面實現交互式控制

這個解決方案特別適用于工程仿真、科學計算可視化、醫療成像等需要展示3D壓力/溫度/密度分布的場景。

本文參考threejs官網 的例子進行了react重構

three.js examples

幾何模型數據分析

首先,下載threejs的源碼,找到該例子中需要的模型文件

?分析模型數據,可以看到模型是BufferGeometry類型的,有兩個屬性position位置信息,pressure壓力信息

?

?展開position可以看到具體位置屬性的參數,itemSize=3表示,每三個表示一個頂點的xyz坐標。

?

展開pressure可以看到itemSize=1,每一個數值對應一個頂點的壓力值

?我們現在要做的兩件事,首先,根據這個位置信息將幾何繪制出來,通過THREE.BufferGeometryLoader()完成;其次,根據每個頂點的壓力值,繪制該頂點的顏色。

第一個很容易。

加載幾何

export const Model3D = () => {const meshRef = useRef<THREE.Mesh>(null)const [geometry, setGeometry] = useState<PressureGeometry | null>(null)useEffect(() => {const loader = new THREE.BufferGeometryLoader()loader.load('models/json/pressure.json', (geometry) => {const geometry2 = geometry as unknown as PressureGeometrygeometry.center();      // 確保模型居中geometry.computeVertexNormals(); // 計算法線以正確顯示光照const colors = []for (let i = 0, n = geometry.attributes.position.count; i < n; ++i) {colors.push(1, 1, 1)}geometry.setAttribute('color',new THREE.Float32BufferAttribute(colors, 3),)setGeometry(geometry2)})}, [])if (!geometry) return nullreturn (<mesh ref={meshRef} geometry={geometry}><meshLambertMaterialside={THREE.DoubleSide}color={0xf5f5f5}vertexColors={true}/></mesh>)
}

1.?geometry.center():幾何體居中

  • 將幾何體的頂點坐標重新計算,使其中心點移動到坐標系原點 (0, 0, 0)

  • 默認情況下,加載的 3D 模型可能不在場景中心,導致旋轉/縮放時出現偏移問題。

底層原理
  1. 計算幾何體的包圍盒(BoundingBox),獲取?min?和?max?坐標。

  2. 計算幾何體的中心點

    const centerX = (min.x + max.x) / 2;
    const centerY = (min.y + max.y) / 2;
    const centerZ = (min.z + max.z) / 2;
  3. 將所有頂點坐標減去中心點值,使模型中心對齊到?(0, 0, 0)

適用場景
  • 加載外部 3D 模型(如?.json.gltf)時,確保模型位于場景中心。

  • 避免因模型偏移導致的相機對焦問題或交互異常。


2.?geometry.computeVertexNormals():計算頂點法線

  • 自動計算每個頂點的法線向量(用于光照計算)。

  • 如果幾何體沒有法線數據,或修改了頂點位置后未更新法線,模型的光照會顯示不正確(如全黑或閃爍)。

底層原理
  1. 遍歷所有三角形面(faces?或?index?緩沖數據)。

  2. 對每個三角形,計算其面法線(垂直于三角形平面的向量)。

  3. 對共享同一頂點的所有面法線取加權平均,得到該頂點的平滑法線

為什么需要?
  • Three.js 的光照(如?MeshLambertMaterialMeshPhongMaterial)依賴法線數據。

  • 如果未提供法線,模型會失去立體感(如下圖對比):
    ? 有法線?→ 平滑光照


? 無法線?→ 平坦或異常著色

思考:如何繪制頂點顏色?

如何繪制頂點顏色呢?

如果我們想繪制一個彩虹色[紅,黃,**,綠,藍],并且指定一個數值區間[min,max],然后將顏色在指定區間內進行均勻采樣,那么對于給定的數值,我們就能得到對應的顏色值。這個如何實現呢?

顏色映射?

在 3D 科學可視化(如壓力、溫度、密度分布)中,顏色映射(Color Mapping)?是關鍵步驟,它通過將數值數據映射到顏色,直觀地表達數據的分布和變化趨勢。


1. 數值到顏色的映射原理

(1)數據歸一化(Normalization)

由于數值范圍可能很大(如壓力 0~2000Pa),而顏色查找表(LUT)通常使用 **0~1 范圍**,因此需要先歸一化:

normalizedValue =(value-minValue)/(maxValue - minValue)

例如:

  • 壓力范圍?[0, 2000],當前值?800

  • 歸一化后:(800 - 0) / (2000 - 0) = 0.4

(2)顏色查找(Color Lookup)

歸一化后的值(0~1)通過?顏色查找表(LUT)?找到對應的 RGB 顏色:

  • LUT 存儲了一系列顏色漸變(如?rainbowcooltowarmgrayscale)。

  • 例如,0.4?可能對應?rgb(100, 200, 50)


2. Three.js 的?Lut?類

Three.js 提供了?Lut(Lookup Table)?工具類(位于?three/examples/jsm/math/Lut.js),用于數值到顏色的映射。

(1)基本用法

import { Lut } from 'three/examples/jsm/math/Lut.js';// 初始化 LUT
const lut = new Lut();// 設置顏色映射方案(內置多種預設)
lut.setColorMap("rainbow"); // "cooltowarm", "blackbody", "grayscale"...// 設置數值范圍
lut.setMin(0);   // 最小值
lut.setMax(2000); // 最大值// 獲取顏色
const color = lut.getColor(800); // 返回 THREE.Color 對象
console.log(color.r, color.g, color.b); // 例如: (0.2, 0.8, 0.5)

(2)內置顏色映射方案

名稱效果適用場景
rainbow彩虹色(紅→紫)通用科學可視化
cooltowarm冷色(藍)→暖色(紅)溫度場、正負值
blackbody黑體輻射(黑→紅→黃→白)高溫場、熱力學
grayscale灰度(黑→白)簡單數據對比

(3)自定義顏色映射

可以手動定義漸變顏色:

lut.setColorMap("custom", [new THREE.Color(0x0000ff), // 藍(最小值)new THREE.Color(0x00ff00), // 綠(中間值)new THREE.Color(0xff0000), // 紅(最大值)
]);

3. 在 React + Three.js 中的實際應用

如本文將使用Lut?用于動態更新 3D 模型的頂點顏色:

useEffect(() => {if (!geometry) return;const lut = lutRef.current;lut.setColorMap(colorMap); // 設置顏色方案(如 "rainbow")lut.setMax(2000); // 最大值lut.setMin(0);    // 最小值const pressures = geometry.attributes.pressure.array;const colors = geometry.attributes.color;for (let i = 0; i < pressures.length; i++) {const value = pressures[i];const color = lut.getColor(value); // 獲取顏色colors.setXYZ(i, color.r, color.g, color.b); // 設置頂點顏色}colors.needsUpdate = true; // 通知 Three.js 更新顏色
}, [colorMap, geometry]);

關鍵點

  1. lut.getColor(value)?自動歸一化并返回?THREE.Color

  2. colors.setXYZ()?修改頂點顏色屬性。

  3. needsUpdate = true?確保 GPU 緩沖區更新。


4. 顏色映射的應用場景

場景數據類型典型顏色方案
工程仿真結構應力、流體壓力cooltowarm(區分高低壓)
科學計算溫度場、密度場blackbody(高溫可視化)
醫療成像CT/MRI 數據grayscale(傳統醫學影像)

?繪制固定色卡ColorMap

在我們場景中ColorMap不會跟著模型一起移動,而是固定在頁面的左側,這是如何做到的呢?

?這里使用的是獨立渲染Scene,與渲染模型的主Scene分離,并且對ColorMap使用正交相機而不是透視相機

正交相機的作用

在 Three.js 中,正交相機(OrthographicCamera)與透視相機(PerspectiveCamera)不同,它不會根據物體距離相機的遠近來縮放物體,所有物體無論遠近看起來大小都一樣。在本文的代碼中,正交相機的作用是:

  1. 固定 UI 元素的位置:通過正交相機渲染的元素會固定在屏幕上的某個位置,不會隨著主相機的移動而移動,非常適合實現 HUD (平視顯示器)、UI 面板等固定元素。

  2. 獨立的渲染空間:正交相機創建了一個獨立的 2D 渲染空間,坐標系統從 - 1 到 1,便于精確控制 UI 元素的位置和大小。

彩色圖例的繪制過程

彩色圖例的繪制主要通過以下步驟實現:

  1. 創建顏色映射紋理

    useEffect(() => {const lut = new Lut()lut.setColorMap(colorMap)lut.setMax(2000)lut.setMin(0)const canvas = lut.createCanvas()const newTexture = new THREE.CanvasTexture(canvas)newTexture.colorSpace = THREE.SRGBColorSpacesetTexture(newTexture)return () => newTexture.dispose()
    }, [colorMap])
    

    這部分代碼使用Lut(Lookup Table) 類創建一個顏色映射表,并將其轉換為 Canvas 紋理。

  2. 創建 Sprite 元素

    return (<sprite ref={spriteRef} scale={[0.125, 1, 1]}><spriteMaterial map={texture} /></sprite>
    )
    

    Sprite 是 Three.js 中始終面向相機的 2D 元素,非常適合用于 UI 顯示。這里將前面創建的顏色映射紋理應用到 Sprite 上。

  3. 使用正交相機渲染

    const orthoCamera = new THREE.OrthographicCamera(-1, 1, 1, -1, 1, 2)
    orthoCamera.position.set(0.5, 0, 1)const tempScene = new THREE.Scene()
    if (spriteRef.current) {tempScene.add(spriteRef.current)
    }gl.render(tempScene, orthoCamera)
    

    這部分代碼創建了一個臨時場景,只包含圖例 Sprite 元素,并使用正交相機進行渲染。由于正交相機的特性,無論主相機如何移動,圖例都會固定在屏幕上的相同位置。

圖例不隨模型移動的原理

圖例不隨模型移動的關鍵在于:

  1. 獨立的渲染流程:代碼中通過useFrame鉤子手動控制渲染過程,先渲染主場景,再單獨渲染圖例:

    gl.render(scene, camera)       // 渲染主場景(使用透視相機)
    gl.render(tempScene, orthoCamera)  // 渲染圖例(使用正交相機)
    

  2. 分離的場景管理:圖例被添加到一個臨時場景tempScene中,與主場景scene分離,避免受到主場景中相機控制和模型變換的影響。

  3. 固定的正交相機設置:正交相機的位置和投影參數被固定設置:

    const orthoCamera = new THREE.OrthographicCamera(-1, 1, 1, -1, 1, 2)
    orthoCamera.position.set(0.5, 0, 1)
    

    這種設置使得圖例在屏幕上的位置不會隨著主相機的移動而改變,始終保持在固定位置。

固定圖例代碼?


export const FixedLegend = () => {const { gl } = useThree()const spriteRef = useRef<THREE.Sprite>(null)const { colorMap } = useContext(ColorMapText) as ColorMapTextTypeconst [texture, setTexture] = useState<THREE.CanvasTexture | null>(null)// 創建和更新顏色圖例紋理useEffect(() => {const lut = new Lut()lut.setColorMap(colorMap)lut.setMax(2000)lut.setMin(0)const canvas = lut.createCanvas()const newTexture = new THREE.CanvasTexture(canvas)newTexture.colorSpace = THREE.SRGBColorSpacesetTexture(newTexture)return () => newTexture.dispose()}, [colorMap])// 使用useFrame控制渲染過程useFrame(() => {// 清除自動清除標志,我們將手動控制清除gl.autoClear = false// 渲染圖例(使用正交相機)const orthoCamera = new THREE.OrthographicCamera(-1, 1, 1, -1, 1, 2)orthoCamera.position.set(0.5, 0, 1)// 創建一個臨時場景只包含圖例const tempScene = new THREE.Scene()if (spriteRef.current) {tempScene.add(spriteRef.current)}gl.render(tempScene, orthoCamera)})if (!texture) return nullreturn (<sprite ref={spriteRef} scale={[0.125, 1, 1]}><spriteMaterial map={texture} /></sprite>)
}

?GUI切換colorMap

這里快速說一下,? ?通過這個方法const gui = new GUI()可以快速創建一個位于右上角的可視化操作面板,通過配置相關參數,可以動態控制threejs中的參數

?

export const ColorMapGUI = () => {
const { setColorMap} = useContext(ColorMapText) as ColorMapTextTypeconst guiRef = useRef<GUI | null>(null)useEffect(() => {const gui = new GUI()guiRef.current = guiconst params = {colorMap: 'rainbow',}gui.add(params, 'colorMap', ['rainbow','cooltowarm','blackbody','grayscale',]).onChange((value: string) => {setColorMap(value)})return () => {if (guiRef.current) {guiRef.current.destroy()}}}, [])return (<></>)
}

?完整代碼

  1. Model3D組件:負責加載 3D 模型并處理頂點顏色映射。它使用?useEffect?鉤子來加載模型數據,并在顏色映射變化時更新頂點顏色。

  2. FixedLegend組件:創建顏色條 UI,顯示當前使用的顏色映射。它使用正交相機單獨渲染,確保在場景中始終可見。

  3. ColorMapGUI:切換colorMap類型

  4. ColorMapProvider:提供共享colorMap數據

import { useRef, useState, useEffect, createContext, useContext, type ReactNode } from 'react'
import {  useFrame, useThree } from '@react-three/fiber'
import * as THREE from 'three'
import { Lut } from 'three/examples/jsm/math/Lut.js'
import { GUI } from 'three/examples/jsm/libs/lil-gui.module.min.js'interface PressureGeometry extends THREE.BufferGeometry {attributes: {position: THREE.BufferAttributenormal?: THREE.BufferAttributepressure: THREE.BufferAttributecolor: THREE.BufferAttribute}
}export const Model3D = () => {const meshRef = useRef<THREE.Mesh>(null)const [geometry, setGeometry] = useState<PressureGeometry | null>(null)const { colorMap } = useContext(ColorMapText) as ColorMapTextTypeconst lutRef = useRef<Lut>(new Lut())useEffect(() => {const loader = new THREE.BufferGeometryLoader()loader.load('models/json/pressure.json', (geometry) => {const geometry2 = geometry as unknown as PressureGeometrygeometry.center();      // 確保模型居中geometry.computeVertexNormals(); // 計算法線以正確顯示光照const colors = []for (let i = 0, n = geometry.attributes.position.count; i < n; ++i) {colors.push(1, 1, 1)}geometry.setAttribute('color',new THREE.Float32BufferAttribute(colors, 3),)setGeometry(geometry2)})}, [])useEffect(() => {if (!geometry) returnconst lut = lutRef.currentlut.setColorMap(colorMap)lut.setMax(2000)lut.setMin(0)const pressures = geometry.attributes.pressureconst colors = geometry.attributes.colorconst color = new THREE.Color()for (let i = 0; i < pressures.array.length; i++) {const colorValue = pressures.array[i]color.copy(lut.getColor(colorValue)).convertSRGBToLinear()colors.setXYZ(i, color.r, color.g, color.b)}colors.needsUpdate = true}, [colorMap, geometry])if (!geometry) return nullreturn (<mesh ref={meshRef} geometry={geometry}><meshLambertMaterialside={THREE.DoubleSide}color={0xf5f5f5}vertexColors={true}/></mesh>)
}export const FixedLegend = () => {const { gl } = useThree()const spriteRef = useRef<THREE.Sprite>(null)const { colorMap } = useContext(ColorMapText) as ColorMapTextTypeconst [texture, setTexture] = useState<THREE.CanvasTexture | null>(null)// 創建和更新顏色圖例紋理useEffect(() => {const lut = new Lut()lut.setColorMap(colorMap)lut.setMax(2000)lut.setMin(0)const canvas = lut.createCanvas()const newTexture = new THREE.CanvasTexture(canvas)newTexture.colorSpace = THREE.SRGBColorSpacesetTexture(newTexture)return () => newTexture.dispose()}, [colorMap])// 使用useFrame控制渲染過程useFrame(() => {// 清除自動清除標志,我們將手動控制清除gl.autoClear = false// 渲染圖例(使用正交相機)const orthoCamera = new THREE.OrthographicCamera(-1, 1, 1, -1, 1, 2)orthoCamera.position.set(0.5, 0, 1)// 創建一個臨時場景只包含圖例const tempScene = new THREE.Scene()if (spriteRef.current) {tempScene.add(spriteRef.current)}gl.render(tempScene, orthoCamera)})if (!texture) return nullreturn (<sprite ref={spriteRef} scale={[0.125, 1, 1]}><spriteMaterial map={texture} /></sprite>)
}
export const ColorMapGUI = () => {
const { setColorMap} = useContext(ColorMapText) as ColorMapTextTypeconst guiRef = useRef<GUI | null>(null)useEffect(() => {const gui = new GUI()guiRef.current = guiconst params = {colorMap: 'rainbow',}gui.add(params, 'colorMap', ['rainbow','cooltowarm','blackbody','grayscale',]).onChange((value: string) => {setColorMap(value)})return () => {if (guiRef.current) {guiRef.current.destroy()}}}, [])return (<></>)
}
type ColorMapTextType = {colorMap: string,setColorMap: (value: string) => void,
}
const ColorMapText = createContext<ColorMapTextType|undefined>(undefined)export const ColorMapProvider = ({ children }: { children: ReactNode }) => {const [colorMap, setColorMap] = useState<string>('rainbow')const value={colorMap,setColorMap,}return (<ColorMapText.Provider value={value}>{children}</ColorMapText.Provider>)
}

提供Canvas、光源、并加載模型和圖例組件?

import { OrbitControls } from '@react-three/drei'
import { Canvas } from '@react-three/fiber'
import { ColorMapGUI, FixedLegend, ColorMapProvider, Model3D } from './ColorMap'export const ThreeJsExample = () => {return (<ColorMapProvider><div style={{ width: '100vw', height: '100vh' }}><Canvascamera={{ position: [0, 0, 10], fov: 60 }}gl={{ antialias: true }}><ambientLight intensity={0.5} /><directionalLight position={[0, 0, 1]} intensity={3} /><pointLight position={[3, 0, 0]} /><Model3D /><FixedLegend /><ColorMapGUI /><OrbitControls /></Canvas></div></ColorMapProvider>)
}

總結

這個項目展示了如何結合React-Three-Fiber和Three.js創建專業的科學可視化應用。關鍵點包括:

  1. 正確處理自定義幾何屬性

  2. 實現不隨場景旋轉的固定UI元素

  3. 構建靈活的顏色映射系統

  4. 優化渲染性能

這種模式可以擴展到其他科學可視化場景,如溫度場、流速場等的可視化。

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

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

相關文章

Go 官方 Elasticsearch 客戶端 v9 快速上手與進階實踐*

1、為什么選擇 go-elasticsearch&#xff1f; 版本同步&#xff1a;與 Elasticsearch 主版本保持一一映射&#xff0c;當前穩定分支為 v9&#xff0c;對應 ES 9.x 系列。(GitHub)完全覆蓋 REST API&#xff1a;所有 HTTP 端點都有等價方法&#xff0c;避免手寫 JSON/HTTP。可插…

`/etc/samba/smb.conf`筆記250720

/etc/samba/smb.conf筆記250720 /etc/samba/smb.conf 是 Samba 服務的核心配置文件&#xff0c;用于實現 Linux/Unix 與 Windows 系統間的文件和打印機共享。以下詳解其結構和常用參數&#xff1a; 配置文件結構 1. 全局設置段 [global] 控制 Samba 服務器的整體行為。 …

Java從入門到精通!第十六天,重點!(多線程和線程池)

一、多線程1&#xff0e;基本概念&#xff08;1&#xff09;程序&#xff08;Program&#xff09;&#xff1a;為了完成特定的任務&#xff0c;用某種計算機語言編寫的一組指令的集合&#xff0c;即指一段靜態的代碼&#xff08;源代碼經編譯之后形成的二進制格式的文件&#x…

軌道交通為什么要有信號系統?

軌道交通為什么要有信號系統&#xff1f;軌道交通信號系統與公路信號系統有什么不同&#xff1f; 在軌道交通中信號系統是必不可少的&#xff0c;其根本原因在于&#xff1a;在軌道交通中已經沒有辦法純靠人力去保證行車安全。 在公路交通中&#xff0c;信號其實是起輔助作用的…

docker 掛載卷

以下是針對您遇到的問題分步解答和解決方案&#xff1a;一、核心結論 ? 可以采用目錄方式&#xff1a;您的命令中的 -v /root/nginx05-vol/:/usr/share/nginx/html/ 是正確的目錄掛載語法。 ? 看不到新文件的可能原因主要集中在 權限問題、緩存機制 或 操作順序錯誤 上。二、…

uniapp 報錯 Not found ... at view.umd.min.js:1的問題

問題描述&#xff1a; uniapp的app中&#xff0c;當頁面中使用多個v-if后會出現這個報錯解決方案&#xff1a; 1、在v-if的地方加上key屬性&#xff08;key屬性要保證唯一&#xff09; 2、用v-show替換v-if&#xff08;不建議&#xff0c;可能會影響業務&#xff09;

水電站自動化升級:Modbus TCP與DeviceNet的跨協議協同應用

水電站的自動化系統就像一個精密的“神經中樞”&#xff0c;既要應對水流變化帶來的動態負載&#xff0c;又得保證閘門啟閉、水輪機調節等關鍵動作的精準性。我們去年參與的某水電站改造項目里&#xff0c;就遇到了一個典型問題&#xff1a;中控室的施耐德PLC采用Modbus TCP協議…

基于Matlab圖像處理的火災檢測系統設計與實現

隨著計算機視覺技術的快速發展&#xff0c;基于圖像處理的火災檢測系統在安全監控領域的應用得到了廣泛關注。本文提出了一種基于圖像處理的火災檢測系統&#xff0c;該系統通過對圖像進行預處理、顏色空間轉換、閾值化處理和形態學分析&#xff0c;自動檢測火災疑似區域。首先…

信息學奧賽一本通 1593:【例 2】牧場的安排 | 洛谷 P1879 [USACO06NOV] Corn Fields G

【題目鏈接】 ybt 1593&#xff1a;【例 2】牧場的安排 洛谷 P1879 [USACO06NOV] Corn Fields G 【題目考點】 1. 狀壓動規 【解題思路】 集合狀態&#xff1a;n個元素中&#xff0c;選擇x個元素構成的集合&#xff0c;可以由一個n位二進制數表示。第i位為1表示選擇第i個元…

SpringBoot創建項目的方式

一、Idea Spring initializr創建&#xff08;Spring 官網下載&#xff09; Spring官網只支持SpringBoot3.0以上&#xff0c;JDK17以上 二、idea Spring inst創建&#xff08;阿里云下載&#xff09; 阿里云可以支持JDK8的版本 Spring版本選擇2.7.6&#xff0c;選擇合適的依賴添…

云原生 —— K8s 容器編排系統

一、 簡介Kubernetes&#xff0c;也稱為K8s&#xff0c;是一個開源的容器編排系統&#xff0c;用于自動部署、擴展和管理容器化應用程序&#xff0c;幫助開發者更高效地跨集群管理應用。本文總結了 k8s 的基礎概念和技術架構。二、基礎概念1. 云原生&#xff08;Cloud Native…

SQLite中SQL的解析執行:Lemon與VDBE的作用解析

(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu) 在 SQLite 的內部實現中&#xff0c;SQL 語句的解析與執行是一個精妙的過程&#xff0c;涉及詞法分析、語法分析、中間代碼生成與執行等多個環節。其中&#xff0c;Lemon 工具和 VDBE&#xff08;Virtual Database Engine…

C++學習筆記(十:類與對象基礎)

往篇內容&#xff1a; C學習筆記&#xff08;一&#xff09; 一、C編譯階段※ 二、入門案例解析 三、命名空間詳解 四、C程序結構 C學習筆記&#xff08;二&#xff09; 五、函數基礎 六、標識符 七、數據類型 補充&#xff1a;二進制相關的概念 sizeof 運算符簡介 補…

圖片查重從設計到實現(4)圖片向量化存儲-Milvus 單機版部署

Milvus 單機版部署 在 Docker 環境下安裝、應用和配置 Milvus 向量數據庫可以按照以下步驟進行&#xff0c;涵蓋從安裝到基礎應用的完整流程&#xff1a; 1. 部署前準備 服務器&#xff1a;建議測試環境配置 2 核 CPU、8GB 內存&#xff1b;處理 100 萬組向量數據&#xff0c;…

前端版本更新檢測機制

&#x1f4cc; 一、為什么需要前端版本更新檢測機制&#xff1f;在現代 Web 項目中&#xff0c;我們通常會通過 CDN 或緩存策略來加快頁面加載速度&#xff0c;但這也帶來了一個問題&#xff1a;用戶可能訪問的是舊版本的頁面或資源&#xff0c;而不會自動更新到最新版本。這在…

Python(09)正則表達式

特殊字符 1. 基本元字符 .&#xff1a;匹配除換行符以外的任意單個字符。 *&#xff1a;匹配前面的元素零次或多次。 &#xff1a;匹配前面的元素一次或多次。 ?&#xff1a;匹配前面的元素零次或一次。 2. 定量符 {n}&#xff1a;匹配前面的元素恰好 n 次。 {n,}&#xff1a;…

k8s容器放開鎖內存限制

參考&#xff1a;https://access.redhat.com/solutions/1257953 問題 nccl-test容器docker.io/library/nccl-tests:24.12中跑mpirun&#xff0c;buff設置為NCCL_BUFFSIZE503316480 提示out of memory&#xff1a; pod-1:78:91 [0] include/alloc.h:114 NCCL WARN Cuda failure …

基于Zigee的溫度數據采集系統

大家好&#xff0c;本文帶來的是單片機課設-基于Zigee的溫度數據采集系統。 一、設計內容和要求 基于Zigbee的數據采集系統 1.1設計內容 &#xff08;1&#xff09;分析對比Bluetooth、Zigbee、Lora方式組網的基本原理和性能差異&#xff0c;撰寫分析報告&#xff1b; &#xf…

ATH12K 驅動框架分析

文章目錄 Linux Wireless 驅動框架深入分析 **1. 核心框架層次結構** **1.1 cfg80211 子系統 (`net/wireless/`)** **1.2 mac80211 子系統 (`net/mac80211/`)** **2. ath12k 驅動架構分析** **2.1 核心管理文件** **2.2 數據路徑文件** **2.3 平臺接口文件** **2.4 功能模塊文件…

OSPF路由協議單區域

RIP的不足 以跳數評估的路由并非最優路徑 如果RTA選擇S0/0傳輸&#xff0c;傳輸需時會大大縮短為3sRIP協議限制網絡直徑不能超過16跳 收斂速度慢 RIP定期路由更新 – 更新計時器&#xff1a;定期路由更新的時間間隔&#xff0c;默認30秒。 – 失效計時器&#xff1a;失效計時器…