Hacktoberfest 2026: the issues maintainers tagged for October, open and beginner-friendly. Browse Hacktoberfest issues

Volume Grid Isosurface mesh issue

Open
#285 1 comment 1 reaction 0 assignees View on GitHub

Nobody has claimed this yet.

Assessment

Difficulty
2/5
Estimated time
1-3 hours
Newbie friendliness
48/100
Issue type
Bug
Clarity
Clearly specified
Activity status
Stale
Tech stack
cpp

Research direction

Start in src/volume_grid_scalar_quantity.cpp, inspecting createIsosurfaceProgram() and registerIsosurfaceAsMesh(), where the MarchingCube calls and coordinate transformation are shown. Compare the grid-dimension ordering in both paths with the volume buffer layout. Done means volume-grid isosurfaces render with the correct orientation and cell ordering in both uses.

Written by the indexing model from the issue text.

Description

Hi,

I've run into an issue with the isosurface generation for volume grid scalar quantities. The problem appears to be that the change made to fix the frame transformation for #253 wasn't propagated into the grid dimensions passed to the MarchingCube library, resulting in the grid cells being interpreted in the wrong order.

The following shows a volume grid of the Stanford Bunny and its isosurface visualization with the 2.2.1 release:
Polyscope_Isosurface_Issue

By swizzling the grid dimensions passed into MarchingCube we get the following (correct) result instead:
Polyscope_Isosurface_Fix

The patch for the above fix is:

diff --git a/src/volume_grid_scalar_quantity.cpp b/src/volume_grid_scalar_quantity.cpp                                 
index cde441a..603841f 100644                                                                                          
--- a/src/volume_grid_scalar_quantity.cpp                                                                              
+++ b/src/volume_grid_scalar_quantity.cpp                                                                              
@@ -165,8 +165,8 @@ void VolumeGridNodeScalarQuantity::createIsosurfaceProgram() {                                     
                                                                                                                       
   // Extract the isosurface from the level set of the scalar field                                                    
   MC::mcMesh isosurfaceMesh;                                                                                          
-  MC::marching_cube(&values.data.front(), isosurfaceLevel.get(), parent.getGridNodeDim().x, parent.getGridNodeDim().y,
-                    parent.getGridNodeDim().z, isosurfaceMesh);                                                       
+  MC::marching_cube(&values.data.front(), isosurfaceLevel.get(), parent.getGridNodeDim().z, parent.getGridNodeDim().y,
+                    parent.getGridNodeDim().x, isosurfaceMesh);                                                       
                                                                                                                       
   // Transform the result to be aligned with our volume's spatial layout                                              
   glm::vec3 scale = parent.gridSpacing();                                                                             
@@ -215,8 +215,8 @@ SurfaceMesh* VolumeGridNodeScalarQuantity::registerIsosurfaceAsMesh(std::string                    
                                                                                                                       
   // extract the mesh                                                                                                 
   MC::mcMesh isosurfaceMesh;                                                                                          
-  MC::marching_cube(&values.data.front(), isosurfaceLevel.get(), parent.getGridNodeDim().x, parent.getGridNodeDim().y,
-                    parent.getGridNodeDim().z, isosurfaceMesh);                                                       
+  MC::marching_cube(&values.data.front(), isosurfaceLevel.get(), parent.getGridNodeDim().z, parent.getGridNodeDim().y,
+                    parent.getGridNodeDim().x, isosurfaceMesh);                                                       
   glm::vec3 scale = parent.gridSpacing();                                                                             
   for (auto& p : isosurfaceMesh.vertices) {                                                                           
     // swizzle to account for change of coordinate/buffer ordering in the MC lib                                      

I'm not sure how you prefer to manage the repo, but if you'd like me to open a PR for the fix I'm happy to. Thanks!

Dominant language
C++
Stars
2.2k
Forks
242
Avg merge
11m
Merged PRs (30d)
1

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from nmwsharp/polyscope

All issues in nmwsharp/polyscope

Similar issues

More C++ issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.