GUI for finger v1

This commit is contained in:
ykcheungab
2026-06-18 22:18:19 +08:00
parent f19f092b64
commit 3fd9b839a9
42 changed files with 2326 additions and 1186 deletions
+40 -12
View File
@@ -16,6 +16,10 @@ def init_uv_mesh_viewer(
vertices: np.ndarray | None = None,
vertex_colors: np.ndarray | None = None,
window_name: str = "UV Finger Mesh 3D",
*,
window_width: int = 1280,
window_height: int = 720,
extra_geometries: list | None = None,
):
"""Create Open3D viewer with an unlit triangle mesh."""
import open3d as o3d
@@ -26,7 +30,7 @@ def init_uv_mesh_viewer(
vertex_colors = mesh.base_colors
vis = o3d.visualization.Visualizer()
vis.create_window(window_name=window_name, width=1280, height=720)
vis.create_window(window_name=window_name, width=window_width, height=window_height)
tri_mesh = o3d.geometry.TriangleMesh()
tri_mesh.vertices = o3d.utility.Vector3dVector(vertices.astype(np.float64))
@@ -35,6 +39,9 @@ def init_uv_mesh_viewer(
tri_mesh.compute_vertex_normals()
vis.add_geometry(tri_mesh)
for geometry in extra_geometries or []:
vis.add_geometry(geometry)
render_option = vis.get_render_option()
render_option.mesh_show_back_face = True
if hasattr(render_option, "light_on"):
@@ -51,13 +58,18 @@ def update_uv_mesh_viewer(
o3d,
vertices: np.ndarray,
vertex_colors: np.ndarray,
*,
extra_geometries: list | None = None,
):
"""Update mesh vertices/colors."""
"""Update mesh vertices/colors and optional extra geometries."""
tri_mesh.vertices = o3d.utility.Vector3dVector(vertices.astype(np.float64))
tri_mesh.vertex_colors = o3d.utility.Vector3dVector(vertex_colors.astype(np.float64))
tri_mesh.compute_vertex_normals()
vis.update_geometry(tri_mesh)
for geometry in extra_geometries or []:
vis.update_geometry(geometry)
vis.poll_events()
vis.update_renderer()
@@ -74,6 +86,8 @@ class UVMeshViewer:
color_mode: str = "flow",
value_min: float | None = None,
value_max: float | None = None,
window_width: int = 1024,
window_height: int = 1024,
):
self.mesh = mesh
self.max_magnitude = max_magnitude
@@ -81,27 +95,37 @@ class UVMeshViewer:
self.color_mode = color_mode
self.value_min = value_min
self.value_max = value_max
self.window_width = window_width
self.window_height = window_height
self.vis = None
self.tri_mesh = None
self._o3d = None
def update(self, flow=None, scalar_map=None):
"""Update viewer from UV-space maps. Returns False if window closed."""
def _vertex_colors(self, flow=None, scalar_map=None):
if self.color_mode == "depth":
colors = scalar_map_vertex_colors(
return scalar_map_vertex_colors(
scalar_map,
self.mesh,
value_min=self.value_min,
value_max=self.value_max,
threshold=self.threshold,
)
else:
colors = flow_magnitude_vertex_colors(
flow,
self.mesh,
max_magnitude=self.max_magnitude,
threshold=self.threshold,
)
return flow_magnitude_vertex_colors(
flow,
self.mesh,
max_magnitude=self.max_magnitude,
threshold=self.threshold,
)
def _extra_geometries_for_init(self):
return []
def _extra_geometries_for_update(self):
return []
def update(self, flow=None, scalar_map=None):
"""Update viewer from UV-space maps. Returns False if window closed."""
colors = self._vertex_colors(flow=flow, scalar_map=scalar_map)
vertices = self.mesh.rest_vertices
if self.vis is None:
@@ -109,6 +133,9 @@ class UVMeshViewer:
self.mesh,
vertices=vertices,
vertex_colors=colors,
window_width=self.window_width,
window_height=self.window_height,
extra_geometries=self._extra_geometries_for_init(),
)
return True
@@ -121,6 +148,7 @@ class UVMeshViewer:
self._o3d,
vertices,
colors,
extra_geometries=self._extra_geometries_for_update(),
)
return True