Found another trick to improve performance. Apparently VDBFromPoligons igonres open polys. So, we can use that when we re-run VDBFromPolys.
Squab and Tommy in less than 5 secs, heptoroid in less than 10 secs ..on my laptop.
Found 31 posts.
Search results Show results as topic list.
Technical Discussion » Skeleton curve implementation based on VDB medial axis
- rpopovici
- 31 posts
- Offline
Technical Discussion » Skeleton curve implementation based on VDB medial axis
- rpopovici
- 31 posts
- Offline
Some more improvements:
- curve extraction hda ready
- better curve detection
- better curve refinement
- limb selection example
- curve extraction hda ready
- better curve detection
- better curve refinement
- limb selection example
Technical Discussion » Skeleton curve implementation based on VDB medial axis
- rpopovici
- 31 posts
- Offline
Found some ways to improve the performance:
- Remesh SOP lower res
- Resample SOP lower res
- only one VDBFromPoints per step
- voxel size is a function of log10(iteration)
- Remesh SOP lower res
- Resample SOP lower res
- only one VDBFromPoints per step
- voxel size is a function of log10(iteration)
Technical Discussion » Skeleton curve implementation based on VDB medial axis
- rpopovici
- 31 posts
- Offline
Hey Luiz, thanks!
VDB from Poly is quite fast. I believe that resample SOP is extremely slow.
Remesh SOP is kinda optional. I am using it to control mesh resolution.
Unfortunately I was unable to find a way which does not require to re-run VDB from polygons at each step. I tried many things, but this was the only way which works with thin surfaces. For some reson vdb advection is not renormaling the sdf the same way VDB from polys does.
VDB from Poly is quite fast. I believe that resample SOP is extremely slow.
Remesh SOP is kinda optional. I am using it to control mesh resolution.
Unfortunately I was unable to find a way which does not require to re-run VDB from polygons at each step. I tried many things, but this was the only way which works with thin surfaces. For some reson vdb advection is not renormaling the sdf the same way VDB from polys does.
Technical Discussion » Skeleton curve implementation based on VDB medial axis
- rpopovici
- 31 posts
- Offline
Here is a sample hip file.. If you have any idea about how to improve this stuff feel free to C&C
Technical Discussion » Skeleton curve implementation based on VDB medial axis
- rpopovici
- 31 posts
- Offline
Technical Discussion » Skeleton curve implementation based on VDB medial axis
- rpopovici
- 31 posts
- Offline
Technical Discussion » Skeleton curve implementation based on VDB medial axis
- rpopovici
- 31 posts
- Offline
Hello guys,
A few months ago I spent some time trying to come up with a straight skeleton curve solution for houdini.
Here you have some theoretical background about this topic:
http://visgraph.cse.ust.hk/projects/skeleton/skeleton_sig08.pdf [visgraph.cse.ust.hk]
https://www.cse.wustl.edu/~taoju/lliu/paper/pgcc/pgcc.html [www.cse.wustl.edu]
https://houdinigubbins.wordpress.com/2017/07/22/fiedler-vector-and-the-medial-axis/ [houdinigubbins.wordpress.com]
I trid to select the mosts relevant papers I found, IMO..
Challenges I faced:
1. Performance
Initially I tried to use the Smooth SOP(curvature mode) or Voronoi Fracture SOP with some acceptable results but unfortunately these solutions are extremely slow with dense meshes and they are not working very well with triangulated meshes. Then I decided to try VDB Advection against surface gradient with much better results.
2. Curve resampling
My technique uses a remeshed version of the original mesh, so the problem here is that during thinning process you need more resolution for elongated poligons. The solution here was to simply use a Resample SOP node.
3. Curve detection
Advection along VDB medial axis is cool, but it's not stopping until all points are contracted to the VDB's B-tree center nodes.
So, I had to come up with some kind of “curve detection” algorithm. Accidentally I discovered that you can do this easily using a VDB dilation followed by a medial VDB smooth and another dilation
4 Noise
Dealing with surface noise is a very sensitive problem. In reality, a 3D straight skeleton is more like a surface and very branchy. In order to solve this problem we have to use VDBSmooth SOP(medial smoothing mode) and make sure that advection is done with Fourth-Order Runge-Kutta method. Also, if the original mesh is very noisy you can use Paint SOP followed by a Smooth SOP to locally smooth the mesh and eliminate potential unwanted branches.
5. Remeshing & partitioning
This problem is relatively simple once you have the skeleton. You can use a voronoi fracture against the original mesh and as control points you can use the a resampled and refined version of your skeleton polycurve.
Also here you can do skeleton curve partitioning based on curve branching or angle/curvature and then transfer back these attrbutes to the original mesh points. Very useful for mesh partitioning, limb detection, bone automatic positining and even quad remeshing.
In combination with Convex Decomposition SOP(appliend to the shrinked mesh) you can get some kind of branch based decomposition.
So, here are some results:
A few months ago I spent some time trying to come up with a straight skeleton curve solution for houdini.
Here you have some theoretical background about this topic:
http://visgraph.cse.ust.hk/projects/skeleton/skeleton_sig08.pdf [visgraph.cse.ust.hk]
https://www.cse.wustl.edu/~taoju/lliu/paper/pgcc/pgcc.html [www.cse.wustl.edu]
https://houdinigubbins.wordpress.com/2017/07/22/fiedler-vector-and-the-medial-axis/ [houdinigubbins.wordpress.com]
I trid to select the mosts relevant papers I found, IMO..
Challenges I faced:
1. Performance
Initially I tried to use the Smooth SOP(curvature mode) or Voronoi Fracture SOP with some acceptable results but unfortunately these solutions are extremely slow with dense meshes and they are not working very well with triangulated meshes. Then I decided to try VDB Advection against surface gradient with much better results.
2. Curve resampling
My technique uses a remeshed version of the original mesh, so the problem here is that during thinning process you need more resolution for elongated poligons. The solution here was to simply use a Resample SOP node.
3. Curve detection
Advection along VDB medial axis is cool, but it's not stopping until all points are contracted to the VDB's B-tree center nodes.
So, I had to come up with some kind of “curve detection” algorithm. Accidentally I discovered that you can do this easily using a VDB dilation followed by a medial VDB smooth and another dilation
4 Noise
Dealing with surface noise is a very sensitive problem. In reality, a 3D straight skeleton is more like a surface and very branchy. In order to solve this problem we have to use VDBSmooth SOP(medial smoothing mode) and make sure that advection is done with Fourth-Order Runge-Kutta method. Also, if the original mesh is very noisy you can use Paint SOP followed by a Smooth SOP to locally smooth the mesh and eliminate potential unwanted branches.
5. Remeshing & partitioning
This problem is relatively simple once you have the skeleton. You can use a voronoi fracture against the original mesh and as control points you can use the a resampled and refined version of your skeleton polycurve.
Also here you can do skeleton curve partitioning based on curve branching or angle/curvature and then transfer back these attrbutes to the original mesh points. Very useful for mesh partitioning, limb detection, bone automatic positining and even quad remeshing.
In combination with Convex Decomposition SOP(appliend to the shrinked mesh) you can get some kind of branch based decomposition.
So, here are some results:
Edited by rpopovici - 2019年4月28日 10:38:17
Technical Discussion » Fix UVs after fuse SOP
- rpopovici
- 31 posts
- Offline
Hi guys,
I am trying to use Boolean SOP with UV-ed source meshes, and it works with the exception that for intersecting geometry the resulting UVs are disconnected. I don't know if this is bug or feature?! But anyway I can run a UVFuse SOP over Boolean's output groups and fix it. The question now is how can I fix the UV gaps resulting after running edge length threshold in Boolean SOP? I can try to run a Fuse SOP at the end but it's the same problem, the UV is messed up.
There's an attached example to get the idea. Thanks!
I am trying to use Boolean SOP with UV-ed source meshes, and it works with the exception that for intersecting geometry the resulting UVs are disconnected. I don't know if this is bug or feature?! But anyway I can run a UVFuse SOP over Boolean's output groups and fix it. The question now is how can I fix the UV gaps resulting after running edge length threshold in Boolean SOP? I can try to run a Fuse SOP at the end but it's the same problem, the UV is messed up.
There's an attached example to get the idea. Thanks!
Edited by rpopovici - 2017年4月20日 08:51:54
Houdini Indie and Apprentice » Selection extract in context
- rpopovici
- 31 posts
- Offline
Same question was asked here https://www.sidefx.com/forum/topic/41412/ [sidefx.com] but duplicating alone is not detaching the selection from source object. At least this is not happening in H16. I want to extract in context and detach from original source.
Houdini Indie and Apprentice » Selection extract in context
- rpopovici
- 31 posts
- Offline
Hello guys,
In box modeling, sometimes you want to duplicate poly selection on spot and continue from there with your modeling. This saves time with alignment and such.. In Houdini you can duplicate poly selection easily but this duplicate is attached to the source geometry. If I need to change the source geometry later on, this will affect my copy as well.
I found a way to detach the copy from the source using a locked blast with invert selection and then I merge back the result. I can even detach the blast node from the source and it's working. In this way I can alter my original source mesh without worrying about indexes changing.
I am wandering if there's a more elegant way to do this kind of stuff. Maybe a new primitive node which accepts poly/point selection as input and then disconnects from it's source. Btw, I am creating everything in context in Houdini.
In box modeling, sometimes you want to duplicate poly selection on spot and continue from there with your modeling. This saves time with alignment and such.. In Houdini you can duplicate poly selection easily but this duplicate is attached to the source geometry. If I need to change the source geometry later on, this will affect my copy as well.
I found a way to detach the copy from the source using a locked blast with invert selection and then I merge back the result. I can even detach the blast node from the source and it's working. In this way I can alter my original source mesh without worrying about indexes changing.
I am wandering if there's a more elegant way to do this kind of stuff. Maybe a new primitive node which accepts poly/point selection as input and then disconnects from it's source. Btw, I am creating everything in context in Houdini.
Edited by rpopovici - 2017年3月21日 11:09:12
-
- Quick Links