Table of Contents

NURBS Sharp

NuGet Version Build Status

NURBS Sharpは.NET向けの依存関係なしのNURBS(非一様有理 B-スプライン)ライブラリです。
データ構造、評価器、トポロジー演算、入出力、テッセレーション機能を.NET標準ライブラリのみで実装しています。

English README

test

目次

特長

  • 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の典型的なワークフロー:

  1. リポジトリをフォーク
  2. わかりやすいブランチ名でブランチを作成
  3. 必要に応じて新しいテストを追加
  4. プルリクエストを masterへ送る

謝辞

このプロジェクトは、初期段階において Kodatuno と geomdl (NURBS-Python) から多大な影響を受けています。これらのプロジェクトの設計やアルゴリズムは、本ライブラリのデータ構造や評価ロジックの設計に大きな示唆を与えてくれました。両プロジェクトのメンテナや貢献者の皆様に感謝します。

ライセンス

MIT License