28个版本

0.1.27 2024年7月28日
0.1.26 2024年7月24日
0.1.24 2024年6月30日
0.1.16 2024年5月30日
0.1.5 2024年4月30日

#374 in 游戏开发

Download history 634/week @ 2024-05-01 440/week @ 2024-05-08 36/week @ 2024-05-15 4/week @ 2024-05-22 442/week @ 2024-05-29 152/week @ 2024-06-05 68/week @ 2024-06-12 400/week @ 2024-06-19 436/week @ 2024-06-26 393/week @ 2024-07-03 7/week @ 2024-07-10 3/week @ 2024-07-17 297/week @ 2024-07-24 35/week @ 2024-07-31 5/week @ 2024-08-07 1/week @ 2024-08-14

每月 339 次下载
用于 bevy_curvo

MIT 协议

215KB
5K SLoC

Curvo

License Crates.io Docs Test

Curvo是一个Rust语言的NURBS曲线/曲面建模库。

bevy上的可视化 bevy上的可视化

此库不仅可以创建由控制点、结点矢量和每个控制点相关的权重组成的NURBS曲线,还支持生成精确通过给定控制点的曲线和创建周期性曲线。此外,它还允许通过基于NURBS曲线的拉伸放样操作来构建NURBS曲面。

此库支持的NURBS曲面建模操作包括以下内容

  • 拉伸
  • 放样
  • 扫描
  • 旋转
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

支持的功能还包括在NURBS曲线上找到最近点、在两个NURBS曲线之间找到交点和基于弧长进行分割。

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

其他功能如下

Smooth periodic points interpolation with knot styles Ellipse arc generation Iso-curves on a surface

使用方法

// 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));

依赖关系

  • nalgebra:此库在执行计算时严重依赖线性代数库nalgebra。

参考

依赖关系

~9–50MB
~868K SLoC