diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index a7f6dc8..980b2c6 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -272,6 +272,79 @@ flowchart LR GL -->|uMinV/uMaxV/uColorLow/Mid/High| SH[dots.frag] ``` +## 点阵凹陷渲染(Heightmap / Dented Surface) + +### 目标 +- 将 `rows x cols` 点阵扩展到“长/宽各 100 倍”的显示分辨率(例如 12x7 -> 1200x700)。 +- 数值越大,顶面越向内凹陷,且边缘与侧面跟随变形,保持整体感。 +- 可在 OpenGL 视图内切换“普通点阵”和“凹陷热力图”两种渲染模式。 + +### 数据处理 +1) 传感器帧数据进入 `GLWidget::submitValues()`。 +2) `GLWidget::updateHeatmapData_()` 将 `values` 组装为 `CV_32F` 矩阵(rows x cols)。 +3) 通过 `GlobalHelper::transToMultiMatrix(...)`: + - 低阈值清零 -> 归一化 -> 轻度模糊 -> resize 到 `cols*100 x rows*100` -> 再模糊。 + - 仅输出“数据矩阵”,不再用于生成图像。 +4) 将结果写入 `m_heightValues`,上传 `GL_R32F` 纹理。 + +### 凹陷算法 +- 顶面位移(vertex shader): + - `t = clamp((v - min) / (max - min), 0..1)` + - `h = t * dentMax` + - `z = baseZ + h`(向内凹陷) +- 法线估算(fragment shader): + - 对 heightmap 相邻 texel 采样,计算梯度,再归一化为法线。 +- 侧边联动: + - `initSkirtGeometry_()` 建立边界环。 + - `updateSkirtVertices_()` 采样边界高度,更新侧边顶点,使边缘与顶面同步下沉。 + +### 模式切换 +- `GLWidget` 内部维护 `m_useHeatmap`。 +- 使用 `QPainter` 在 OpenGL 视图左上角绘制按钮(Dots / Heatmap)。 +- 点击按钮切换渲染路径: + - `Dots`:原点阵实例化圆点渲染。 + - `Heatmap`:底面 + 侧边 + 顶面凹陷渲染。 + +### UML (Mermaid) +```mermaid +classDiagram + class GLWidget { + +submitValues(values) + +setRange(min,max) + +setColorLow/Mid/High() + -updateHeatmapData_() + -uploadHeightTexture_() + -renderHeatmap_() + -renderSkirt_() + -renderBase_() + } + class GlobalHelper { + +transToMultiMatrix(raw,min,range,display,out) + } + class HeightTexture { + +GL_R32F + +width/height + } + class HeatmapMesh { + +VAO/VBO/IBO + +u,v grid + } + class SkirtMesh { + +border uv + +dynamic VBO + } + class Shaders { + +heatmap.vert/frag + +base.vert/frag + } + + GLWidget --> GlobalHelper + GLWidget --> HeightTexture + GLWidget --> HeatmapMesh + GLWidget --> SkirtMesh + GLWidget --> Shaders +``` + ## 配置接口与步骤说明 - 设置协议: