Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Question about Sparse Density Map Marching Cube #215

Open
losanc opened this issue Sep 17, 2024 · 2 comments
Open

Question about Sparse Density Map Marching Cube #215

losanc opened this issue Sep 17, 2024 · 2 comments

Comments

@losanc
Copy link

losanc commented Sep 17, 2024

Hi,

I have a question about the marching cube step when using sparse density map. In the code here

            // We want to find edges that cross the iso-surface,
            // therefore we can choose to either skip all points above or below the threshold.
            //
            // In most scenes, the sparse density map should contain more entries above than
            // below the threshold, as it contains the whole fluid interior, whereas areas completely
            // devoid of fluid are not part of the density map.
            //
            // Skip points with densities above the threshold to improve efficiency
            if point_value > iso_surface_threshold {
                return;
            }

So it skips all the points with larger values. For points with lower values, it finds the neighbor, and check if it cross the threshold.
But for edged like this

0----------value larger than threshold

So, one side of the edge has value 0. The check will be skipped, because it's not in the density map. On the other side has large enough value, and it will be skipped as well.

In the end, this triangle vertex will be skipped, though it should be a vertex here

I think this is a rare case, but with very small threshold, this can happen

@w1th0utnam3
Copy link
Member

Hi, thanks for the message. I think in my implementation of the surface reconstruction pipeline, this case should not happen, as I evaluate the particle kernels with a radius that is basically cellsize * ceil(support_radius/cellsize) (see here). Thus, there should always be a density = 0 ring around the fluid. I guess the comments and documentation of the marching cubes function should be updated to highlight that this is expected.

@losanc
Copy link
Author

losanc commented Nov 26, 2024

yes. it does have a density=0 ring. But the grid with density=0 may not explicitly inside the density_map.

For example, if I have only 1 particle at the position (0.5, 0, 0 ), and i want the grid which is all axes are integers. so, cellsize = 1 in this case. If we take support_radius equals to 1 as well. then the actual evaluated radius cellsize * ceil(support_radius/cellsize) is 1 as well.

I will use F(x,y,z) means the value at grid point(x,y,z). So obviously F(0,0,0) has a non zero value. For the point (-1, 0,0), at this line, r_squared < self.kernel_evaluation_radius_sq will returns false. so

*sparse_densities
 .entry(flat_point_index)
.or_insert(R::zero()) += density_contribution;

this part will be skipped for point(-1,0,0)

In the end, sparse_densities contains value at F(0,0,0), but not F(-1,0,0), which is implicitly 0.

If the threshold value is between F(0,0,0) and 0. It won't create a vertex between (-1,0,0) and (0,0,0), but it should. Because when looping over the sparse_densities, F(0,0,0) is skipped by if point_value > iso_surface_threshold , and F(-1,0,0) is not added into sparse_densities

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants