このプロジェクトは、等値面(isosurface)を用いたメタボールの3D描画を実現する軽量C++ライブラリです。数理的に滑らかな「ブレンドされた球体」をグリッド上で評価し、Marching Cubes法などに基づくレンダリングパイプラインを提供します。
ディレクトリ構成の概要
metaballs/
├── CMakeLists.txt
├── README.md
├── include/
│ └── surface_generator.h
├── src/
│ ├── app_entry.cpp
│ └── volume_processor.cpp
└── tests/
└── generator_unit_tests.cpp
- CMakeLists.txt: ビルド環境の定義ファイル。コンパイラフラグ、リンク対象、テストターゲットを宣言。
- README.md: クイックスタートガイド、依存関係、およびAPI使用例を記述。
- include/surface_generator.h: 公開インターフェース。`SurfaceGenerator`クラスがフィールド関数、等値レベル、ボクセル解像度を管理。
- src/volume_processor.cpp: ボリュームデータ生成のコアロジック(距離関数合成、グリッドサンプリング)を実装。
- tests/generator_unit_tests.cpp: Catch2フレームワークによる単体テスト群。等値面抽出の数値精度検証を含む。
エントリーポイントの役割
実行可能バイナリの起点はsrc/app_entry.cppです。以下に最小限の初期化フローを示します:
#include <iostream>
#include "surface_generator.h"
int main() {
SurfaceGenerator renderer;
// メタボールの物理的特性を設定
renderer.configureIsosurfaceLevel(0.42f);
renderer.defineVolumeGrid(128, 128, 64);
// 複数の影響源(球体)を追加
renderer.addInfluenceSource({0.0f, 0.0f, 0.0f}, 1.5f);
renderer.addInfluenceSource({1.2f, -0.8f, 0.3f}, 0.9f);
// ボリュームデータを生成し、出力ファイルへ書き出し
auto voxel_data = renderer.computeScalarField();
renderer.exportAsRawBinary("output.raw");
std::cout << "ボリューム生成完了: " << voxel_data.size() << " ボクセル\n";
return 0;
}
上記コードでは、等値面の閾値、3次元グリッドサイズ、および複数の球状影響源(位置+半径)を明示的に指定しています。`computeScalarField()`は各ボクセル中心における総和型メタボール関数の評価を行い、float配列を返します。
CMakeビルド設定の要点
CMakeLists.txtはモダンなC++17対応を前提とし、静的ライブラリとしての再利用性も考慮して設計されています:
cmake_minimum_required(VERSION 3.14)
project(MetaVolume LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# ヘッダー公開用のインターフェースターゲット
add_library(meta_volume INTERFACE)
target_include_directories(meta_volume INTERFACE include)
# 実行可能ファイルの構築
add_executable(vol_demo src/app_entry.cpp src/volume_processor.cpp)
target_link_libraries(vol_demo PRIVATE meta_volume)
# テストターゲット(Catch2 v3)
find_package(catch2 REQUIRED)
add_executable(vol_tests tests/generator_unit_tests.cpp src/volume_processor.cpp)
target_link_libraries(vol_tests PRIVATE meta_volume catch2::catch2)
enable_testing()
add_test(NAME unit_tests COMMAND vol_tests)
この設定により、アプリケーション側はmeta_volumeインターフェースライブラリを経由してヘッダーのみをインクルードでき、実装の隠蔽性とビルド高速化が達成されます。