NURBS Sharp
NURBS Sharpは.NET向けの依存関係なしのNURBS(非一様有理 B-スプライン)ライブラリです。
データ構造、評価器、トポロジー演算、入出力、テッセレーション機能を.NET標準ライブラリのみで実装しています。
目次
特長
- NURBS曲線・サーフェス・ボリュームの生成および評価
- トポロジー演算:次数変更、ノット挿入/削除/細分化、結合/分割、パラメータ方向の反転、サーフェス転置(U/V交換)、部分曲線・部分サーフェス抽出(矩形パラメータ範囲)、線形リパラメータ化(パラメータdomain再写像)
- 生成機能:補間、最小二乗近似、プリミティブ形状
- 解析機能:曲線長、弧長パラメータ化・等弧長サンプリング、最近接点、曲率、法線、曲線連続性
- パラメータdomain取得:曲線・サーフェスの有効パラメータ範囲(
NurbsCurve.Domain、NurbsSurface.DomainU/DomainV) - 曲線・サーフェス・ボリュームの変換:平行移動、回転、拡大縮小、変換行列
- 交差計算:Ray-Box、Ray-Mesh、Ray-Surface、Curve-Curve、Curve-Surface、Surface-Surface、Surface-Plane(繰り返しクエリ向けにpreparedスナップショットを再利用可能)
- 入出力ヘルパー:
- メッシュのみ:
OBJ/STL出力、BMP出力(簡易) - NURBSのみ:
IGES入出力(Point、Curve、Surfaceエンティティ対応)
- メッシュのみ:
- 曲線・サーフェス用のテッセレーションユーティリティ
- 対応ターゲット:.NET 8、 .NET Standard 2.1
制限事項
- Viewer: このライブラリは3Dモデルビューアーを含みません。モデルの詳細の確認は3D描画ライブラリあるいはファイル出力が必要です。
- NURBSサーフェス:
TrimSurfaceは未実装です。 - ノットベクトル (Knot Vector): 現在、"Clamped" ノットベクトルのみサポートしています(多重度 = 次数 + 1)。
- IGESサポート:
- インポート: Entity Type 126 (Rational B-spline curve)、128 (Rational B-spline surface) のみサポートしています。
- エクスポート: Point、NURBSエンティティのみサポートしています。メッシュのエクスポートはサポートされていません。
- メッシュエクスポート (OBJ/STL): メッシュオブジェクトのみサポートしています。NURBSからの直接エクスポートはサポートされていません(テッセレーションが必要です)。
- 交差計算:
- 現状初期条件に依存するため不安定な場合があります。
- Surface-Plane交差は横断する交差のみをcurveとして返します(孤立した接線接触や一致領域はcurveとして返しません)。
インストール
NuGetからインストール
dotnet add package NurbsSharp
またはプロジェクトファイルにパッケージ参照を追加してください。
クイックスタート
基本的な使用例(C#)
using System;
using NurbsSharp.Core;
using NurbsSharp.Geometry;
// NURBS曲面を作成して評価
int degreeU = 1, degreeV = 1;
var kvU = new KnotVector(new[] { 0.0, 0.0, 1.0, 1.0 }, degreeU);
var kvV = new KnotVector(new[] { 0.0, 0.0, 1.0, 1.0 }, degreeV);
// コントロールポイント(u x v グリッド)
var controlPoints = new[] {
new[] {
new ControlPoint(0.0, 0.0, 0.0, 1.0),
new ControlPoint(0.0, 1.0, 0.0, 1.0)
},
new[] {
new ControlPoint(1.0, 0.0, 0.0, 1.0),
new ControlPoint(1.0, 1.0, 1.0, 1.0)
}
};
var surface = new NurbsSurface(degreeU, degreeV, kvU, kvV, controlPoints);
var point = surface.GetPos(0.5, 0.5);
Console.WriteLine(point);
例
NURBSサーフェスを分割メッシュ化してSTLとしてエクスポートする例
int divideN = 20;
var mesh = SurfaceTessellator.Tessellate(surface, divideN, divideN);
using (var fs = new FileStream("test_output.stl", FileMode.Create, FileAccess.Write))
{
await STLExporter.ExportAsync(mesh, fs);
}
サンプルプロジェクト: https://github.com/nyarurato/NurbsSharpSample
Github Wiki: https://github.com/nyarurato/NurbsSharp/wiki/Samples
ドキュメント
APIドキュメント: https://nyarurato.github.io/NurbsSharp/
開発
リポジトリをクローンしてローカルでビルド
dotnet restore
dotnet build -c Debug
ユニットテストを実行するには:
dotnet test -c Debug
プロジェクト構成のハイライト:
src/Core— 数値ヘルパーとコア型(BoundingBox、Ray、KnotVector、LinAlgなど)src/Geometry—NurbsCurve、NurbsSurface、NurbsVolume、Meshなどsrc/Evaluation— 評価器(曲線/サーフェス/ボリューム)src/Operation— トポロジー演算(次数、ノット、結合、分割、曲線/サーフェス演算)src/Generation— 補間、最小二乗近似、プリミティブ形状生成src/Intersection— 交差計算(Ray-Box、Ray-Mesh、Curve-Curve、Curve-Surface、BVH構造)src/IO—OBJExporter、STLExporter、BMPExporter、IGES入出力src/Tesselation— テッセレーション(曲線/サーフェス)src/Analysis- 解析 (曲率, 弧長、面積など)
コントリビュート
issue/PRを歓迎します。
PRの典型的なワークフロー:
- リポジトリをフォーク
- わかりやすいブランチ名でブランチを作成
- 必要に応じて新しいテストを追加
- プルリクエストを
masterへ送る
謝辞
このプロジェクトは、初期段階において Kodatuno と geomdl (NURBS-Python) から多大な影響を受けています。これらのプロジェクトの設計やアルゴリズムは、本ライブラリのデータ構造や評価ロジックの設計に大きな示唆を与えてくれました。両プロジェクトのメンテナや貢献者の皆様に感謝します。
- Kodatuno: http://www-mm.hm.t.kanazawa-u.ac.jp/research/kodatuno/
- geomdl (NURBS-Python): https://github.com/orbingol/NURBS-Python
ライセンス
MIT License