Comments (6)
As someone who has written an unstructured surface mesh generator (with curvature based criteria), I would encourage you to limit yourself to OpenGL 4 style tessellation or other highly simplified means.
Ruppert's algorithm type approaches are able to converge to an angle-based criteria. Importantly, they add points, but don't ever move or remove them. I have not seen them applied to a length criteria.
Edge length based criteria (curvature criteria get converted into length criteria) require a 'background mesh' to inform the local mesh criteria. This background mesh is a giant pain in the rear.
Imagine you have a bar of soap that you want to mesh. There are flat sides connected with relatively tight radius curvature at the corners. You need tiny triangles in the corners, but can use huge triangles for the flats. In order to generate a quality mesh, you must gradually grow from tiny tris to huge tris. This is usually implemented as a growth rate limit -- say each edge can only be 1.2 times the length of any edge it is attached to.
The background mesh becomes the place where you solve for this smoothed length criteria. It later is the interpolation map that you use to look up the local criteria that should be applied. It is also the grid you search to find the smallest criteria to provide a place to start meshing.
Smoothing the background mesh is equivalent to an elliptical differential equation. A monster of a hidden problem in the mesh generation process.
Without the background mesh, you could easily generate edges that skip over the local curvature region and span from one flat region to another.
TLDR; Curvature based quality unstructured meshing is an iceberg problem -- it isn't the challenges you see that get you.
from manifold.
Agreed! We could potentially use an OpenGL 4 style algorithm for tessellation, though I think we can do better (in terms of triangle quality).
from manifold.
that would be awesome :)
from manifold.
Yeah, agreed this is a hard problem in general, especially when coming from NURBS. I was going to take a very basic approach, since all of our edges just become cubic Beziers - just break them into some number of equal parts in terms of the bezier parameter (which automatically spaces them reasonably well regarding curvature). Then all I want to do is calculate the number of pieces to split each edge into - easy for length, a bit trickier for curvature error.
Then the only problem left is to subdivide a triangle for a arbitrary number of segments on each edge - this is a 2D problem and doesn't need to know anything about curvature. OpenGL 4 would work, but it makes for some very poor quality triangles. Still, it's probably a good place to start.
from manifold.
Uniform spacing in Bezier parameter doesn't actually guarantee anything in terms of clustering for curvature. You can readily construct a Bezier straight line with highly non-uniform parameter spacing.
I would have to think a bit more about coming up with a counter example. You may be right that the variation diminishing property of Beziers prevents things from getting too bad the other way.
If you're just intending these meshes to be used for graphics, I wouldn't worry about quality -- just generate something correct and be satisfied with that.
If someone wants a quality mesh, they're probably going to have a bunch of other requirements that they want to impose on it. You'll never be able to anticipate all of those requirements.
from manifold.
Fixed by #741.
from manifold.
Related Issues (20)
- triangulator optimization HOT 10
- Python API: batch_hull fails bizarrely HOT 9
- CMake silently downloads Thrust HOT 3
- API Documentation link in README does not exist HOT 2
- GetMesh core dump with SparseIndices too large HOT 16
- better error handling
- Properly handle negative volume meshes HOT 3
- how to properly use runOrigialID
- Better documentation for FillRule HOT 18
- Using Manifold-3d npm package from node? HOT 3
- wasm build problem 'Failed to resolve import "./built/manifold"' HOT 7
- mesh size approximation HOT 21
- Wrong pkg-config package name for Clipper2 dependency HOT 2
- Python created object reports as non-manifold. HOT 3
- Watertightness of Mesh with an Edge Shared by 4 Faces
- vertex halfedge iterator
- Manifold 2.4.5 release tar.gz is incomplete HOT 3
- Vec out of Range HOT 8
- Python binding needs two import call HOT 4
- Manifold Decompose doesn't preserve vertex properties HOT 4
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from manifold.