Files
tactileipc3d/test/onlygl/README.md
2026-01-20 23:41:46 +08:00

112 lines
3.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# GLFW port notes
## 这次重要修改/新增了什么,为什么这么改
- main.cpp: 改成纯 GLFW/GLAD 版本,重建相机/输入、面板/点阵 VAO/VBO、实例化上传逻辑避免 Qt 依赖,方便直接跑 OpenGL 核心模式。
- shaders/panel.frag & shaders/dots.frag: 修过语法/Uniform对接 GLFW 管线,并保持金属质感(不再做数据伪彩色);点用内置小纹理,省掉外部贴图。
- myshader.hh: 增加常用 uniform setter、修正 program 链接日志、析构释放 program方便传矩阵/向量。
- CMakeLists.txt: 指定 C++17保证可用 std::clamp 等工具。
- README.md: 补了构建、运行和操作说明,标明从项目根运行以找到 `./shaders`
## Controls
- 右键拖拽绕物体旋转相机yaw/pitch
- 滚轮:调节视角 FOV 缩放
- Esc退出
## Build & run
```bash
mkdir -p build
cd build
cmake ..
make -j
```
从项目根目录运行(确保能找到 `./shaders`
```bash
./build/base-project
```
目前用 `update_demo_values` 生成简单波纹示例数据,如需接入传感器数据,替换 main.cpp 里的该函数并在循环前设置好 `set_spec` / `set_panel_size`
## Heatmap Demo (Heightmap + Dented Surface)
This demo renders a thick slab with a dented top surface based on sensor values.
Values are mapped to a depth range (0-500 -> 0..kDentMax), so higher force makes
the surface go deeper. The side walls follow the dent so it reads as one solid.
### UML (Mermaid)
```mermaid
classDiagram
class AppState {
+int minV
+int maxV
+mat4 mvp
+vec3 cameraPos
}
class HeightMap {
+low_values[12x7]
+height_values[1200x700]
+update_demo_heightmap(t)
+upload_height_texture()
}
class HeatmapMesh {
+meshCols
+meshRows
+vao/vbo/ibo
}
class SkirtMesh {
+border_uvs
+update_skirt_vertices()
}
class BaseMesh {
+thickness
+vao/vbo/ibo
}
class Renderer {
+render_background()
+render_base()
+render_skirt()
+render_heatmap()
}
class Shaders {
+heatmap.vert/frag
+base.vert/frag
+bg.vert/frag
}
AppState --> Renderer
HeightMap --> HeatmapMesh
HeightMap --> SkirtMesh
Renderer --> HeatmapMesh
Renderer --> SkirtMesh
Renderer --> BaseMesh
Renderer --> Shaders
```
### How It Works (Step-by-Step)
1) `update_demo_heightmap(t)` generates a slow-changing 12x7 grid using a few
Gaussian blobs. This is the "raw sensor" layer.
2) The 12x7 grid is upsampled to 1200x700 with bilinear filtering, stored in
`height_values`.
3) `height_values` is uploaded into an `GL_R32F` texture (`height_tex`).
4) `heatmap.vert` samples `height_tex` and displaces the surface in Z:
`z = uBaseZ + h`, where `h` is the mapped depth (0..kDentMax).
5) `heatmap.frag` re-samples neighbor texels to approximate a normal, then applies
a simple light + color ramp for readability.
6) `init_skirt_geometry()` builds a ring of border vertices, and
`update_skirt_vertices()` samples the border heights so the side walls "follow"
the dent. This keeps the slab looking solid when the edge is depressed.
7) Render order: background grid -> back face -> skirt -> heatmap surface.
### Key Parameters You Can Tune
- `kThickness`: slab thickness.
- `kDentMax`: maximum dent depth (keep <= thickness).
- `kMeshCols/kMeshRows`: heatmap mesh resolution (visual smoothness).
- `kHeightW/kHeightH`: texture resolution (sampling detail).
- `g_state.minV/maxV`: value range (0..500 by default).
### If You Want Real Data
Replace `update_demo_heightmap()` with your sensor values:
- Fill `low_values` from your 12x7 data.
- Run the same upsample step to `height_values`.
- Call `upload_height_texture_if_needed()` and `update_skirt_vertices()` each frame.