35 releases

new 0.1.34 Oct 22, 2024
0.1.33 Oct 22, 2024
0.1.31 Sep 30, 2024
0.1.27 Jul 28, 2024
0.1.5 Apr 30, 2024

#137 in Game dev

Download history 417/week @ 2024-07-02 8/week @ 2024-07-09 3/week @ 2024-07-16 290/week @ 2024-07-23 41/week @ 2024-07-30 7/week @ 2024-08-06 1/week @ 2024-08-13 7/week @ 2024-08-20 1/week @ 2024-09-10 13/week @ 2024-09-17 646/week @ 2024-09-24 105/week @ 2024-10-01 48/week @ 2024-10-08 27/week @ 2024-10-15

831 downloads per month
Used in bevy_curvo

MIT license

340KB
8K SLoC

Curvo

License Crates.io Docs Test

Curvo is a NURBS curve / surface modeling library for Rust.

Visualization on bevy Visualization on Bevy

This library enables not only the creation of NURBS curves from control points, knot vectors, and weights associated with each control point, but also supports generating curves that precisely pass through the given control points and creating periodic curves. Additionally, it allows for the construction of NURBS surfaces through operations such as extruding and lofting based on NURBS curves as inputs.

The modeling operations for NURBS surfaces supported by this library currently include the following:

  • Extrude
  • Loft
  • Sweep
  • Revolve
Sweep the profile curve along the rail curve to create a surface Revolve the profile curve around an z-axis by PI radians to create a NURBS surface

The supported features also include finding the closest point on NURBS curves, finding intersections between two NURBS curves, and dividing based on arc length.

Find closest point on the NURBS curve Divide the NURBS curve based on arc length Find intersection points between two NURBS curves

Additional features

Boolean operations between NURBS curves Smooth periodic points interpolation with knot styles Ellipse arc generation Iso-curves on a surface Closest point on surface

Usage

// Create a set of points to interpolate
let points = vec![
    Point3::new(-1.0, -1.0, 0.),
    Point3::new(1.0, -1.0, 0.),
    Point3::new(1.0, 1.0, 0.),
    Point3::new(-1.0, 1.0, 0.),
    Point3::new(-1.0, 2.0, 0.),
    Point3::new(1.0, 2.5, 0.),
];

// Create a NURBS curve that interpolates the given points with degree 3
// You can also specify the precision of the curve by generic type (f32 or f64)
let interpolated = NurbsCurve3D::<f64>::try_interpolate(&points, 3).unwrap();

// NURBS curve & surface can be transformed by nalgebra's matrix
let rotation = Rotation3::from_axis_angle(&Vector3::z_axis(), FRAC_PI_2);
let translation = Translation3::new(0., 0., 3.);
let transform_matrix = translation * rotation; // nalgebra::Isometry3

// Transform the curve by the given matrix (nalgebra::Isometry3 into nalgebra::Matrix4)
let offsetted = interpolated.transformed(&transform_matrix.into());

// Create a NURBS surface by lofting two NURBS curves
let lofted = NurbsSurface::try_loft(
  &[interpolated, offsetted],
  Some(3), // degree of v direction
).unwrap();

// Tessellate the surface in adaptive manner about curvature for efficient rendering
let option = AdaptiveTessellationOptions {
    norm_tolerance: 1e-4,
    ..Default::default()
};
let tessellation = lofted.tessellate(Some(option));

Dependencies

  • nalgebra: this library heavily relies on nalgebra, a linear algebra library, to perform its computations.

References

Feature development sponsored by VUILD Inc.

The NURBS boolean operations feature in this project was developed at the request of VUILD.
They supported the development as a sponsor by funding the feature's implementation.

Dependencies

~10–51MB
~847K SLoC