メタボール可視化ライブラリの構造とビルド手順

このプロジェクトは、等値面(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インターフェースライブラリを経由してヘッダーのみをインクルードでき、実装の隠蔽性とビルド高速化が達成されます。

タグ: cpp17 CMake metaballs marching-cubes volume-rendering

7月4日 16:09 投稿