シャープエッジの再現限界を実証:3D点群CVAE/VAEにおけるFoldingNet採用と、CAD化を見据えた幾何精度検証
1.目的
デコーダを従来のMLP(各点を独立に出力)から FoldingNet へ変更した。
MLPでは点群がバラバラに生成されるため、形状の「面」としての連続性が欠ける課題があった。FoldingNetの「2Dグリッドを3D空間へ折りたたむ」というアーキテクチャを採用することで、再構成データおよび潜在空間における形状の滑らかさ(曲面の連続性)の向上を期待し、その特性を検証する。
本検証は、将来的な「CAD化への自動化パイプライン」の構築を見据えた前段の検証である。形状の滑らかさの表現力に優れる FoldingNet をデコーダに採用し、実用的な生成精度があるかを実証比較する。
(※補足:本記事の「シャープエッジの再現限界を実証」はCVAE/VAEに広く適用可能な知見である。今回の具体的な実証は、Variational Autoencoder(VAE)を用いて実施している。)
2.FoldingNet
class FoldingNetDecoder(nn.Module):
def __init__(self, z_dim=3, num_points=4096):
super().__init__()
self.num_points = num_points
# 4096点は 64x64 の正方形グリッドになる
side = int(num_points ** 0.5)
assert side * side == num_points, "num_points must be a perfect square for FoldingNet (e.g., 4096)"
# 2Dグリッドの作成 (-1.0 から 1.0 の範囲)
x = torch.linspace(-1, 1, side)
y = torch.linspace(-1, 1, side)
grid = torch.meshgrid(x, y, indexing='ij')
# モデルのデバイス(GPU等)に自動同期させるために buffer として登録
grid_2d = torch.stack(grid, dim=-1).view(-1, 2)
self.register_buffer('grid_2d', grid_2d)
# 1回目のFolding: (2Dグリッド + 潜在変数z) -> 3D座標
self.fold1 = nn.Sequential(
nn.Conv1d(z_dim + 2, 512, 1),
nn.BatchNorm1d(512),
nn.ReLU(True),
nn.Conv1d(512, 512, 1),
nn.BatchNorm1d(512),
nn.ReLU(True),
nn.Conv1d(512, 3, 1)
)
# 2回目のFolding: (1回目の3D座標 + 潜在変数z) -> 最終的な3D座標
self.fold2 = nn.Sequential(
nn.Conv1d(z_dim + 3, 512, 1),
nn.BatchNorm1d(512),
nn.ReLU(True),
nn.Conv1d(512, 512, 1),
nn.BatchNorm1d(512),
nn.ReLU(True),
nn.Conv1d(512, 3, 1)
)
def forward(self, z):
B = z.size(0)
# グリッドをバッチサイズ分に拡張し、Conv1d用に次元を入れ替え: (B, 2, num_points)
grid = self.grid_2d.unsqueeze(0).expand(B, -1, -1).transpose(1, 2)
# 潜在変数を全点に結合するために拡張: (B, z_dim, num_points)
z_expanded = z.unsqueeze(2).expand(-1, -1, self.num_points)
# 1回目のFold
feat1 = torch.cat([grid, z_expanded], dim=1) # (B, z_dim + 2, num_points)
fold1_out = self.fold1(feat1) # (B, 3, num_points)
# 2回目のFold
feat2 = torch.cat([fold1_out, z_expanded], dim=1) # (B, z_dim + 3, num_points)
fold2_out = self.fold2(feat2) # (B, 3, num_points)
# 出力を元の (B, num_points, 3) の形に戻して返す
return fold2_out.transpose(1, 2)
学習データ可視化

再構成データ可視化
FoldingNetによる出力。2Dグリッド由来のメッシュ状の構造が見て取れる。

潜在変数を2軸で変更し可視化
1枚のシートが連続的に変形し、滑らかな形状を形成していることが確認できる。

潜在空間の点群形状変遷(アニメーション)

3.考察:数理的トポロジー制約と2Dマニホールドの限界
① 2Dグリッド射影による幾何的連続性の獲得
期待通り、2Dの局所格子(正方形グリッド)を3D空間へ多段階で連続写像するアーキテクチャは、点群の配列に強力な規則性(一様性)をもたらした。各点が独立に座標を回帰する拡張MLP構成とは根本的に異なり、生成された点群の「近傍関係」が数理的に担保されるため、可視化結果からも極めて滑らかで水密性の高い曲面が形成されていることが実証された。
② 「1枚の紙(単一多様体)」が抱える不連続面の表現限界
しかし、位相幾何学(トポロジー)の観点から、1枚の2D平面を破ることなく3D空間内で折りたたむという制約は、致命的なトレードオフが存在する。
数理的に連続な写像を繰り返すため、物理的な製品形状に必ず存在する「立方体の鋭利なエッジ」や「錐体の頂点」といった『幾何学的な不連続面(シャープエッジ)』を再現しようとすると、境界が丸まってしまう現象が発生する。単一のシート(連続多様体)を引き伸ばすだけでは、製造業の金型や機械部品が求めるエッジの「曲率変化の急峻さ」を捉えきれないという構造的限界が浮き彫りとなった。
4.実務展開を見据えたデコーダ選定基準(技術意思決定の視点)
本システムを将来的に製造業の実際の製品開発パイプライン(複雑なリブ付き筐体、鋳物のリバースエンジニアリングなど)へ組み込む場合、単に「見た目が滑らかである」という評価だけでは実務要件を満たさない。
① 複雑筐体における「自己交差」と「肉厚不連続性」の課題
製品形状が複雑化するにつれ、1枚のシートを無理に変形させようとする結果、生成点群の内部で「自己交差」が発生しやすくなる。これは後段の処理でポアソン表面再構成等をかけた際、異常なメッシュ反転や中空構造の破綻を発生させる。また、リブやボスのように「不連続に肉厚が変化する形状」を単一の2Dマニホールドで表現することは極めて困難であり、シャープな実務要件に対して、現状の単一Folding構成は「単体での実用化は極めて困難である」と判断する。
② 次世代アーキテクチャへの移行:AtlasNetへの拡張スケーラビリティ
この幾何的限界を突破するため、選定基準を「単一シート」から「局所パッチの集合(AtlasNet等)」へと拡張する。
複数の独立した2Dパッチを個別に折り曲げ、3D空間上でモーフィングさせて組み合わせることで、複雑な位相(穴のあいた構造)や、パッチの境界線による「鋭利なエッジ」の両立が可能となる。計算コスト(Conv1dの並列演算)を一定に保ちつつ、表現力を向上させるアプローチとして、次段階ではこのマルチパッチ構成へのトポロジー最適化を検証軸とする。
5.結論
現段階の検証において、FoldingNetによる2D格子からのアプローチは、美しいサーフェス連続性を担保できる点において大きな優位性を確認した。しかし、製造業の実務課題であるシャープエッジの再現性や複雑筐体への寸法追従性を考慮すると、単一多様体の限界による表現力不足が明確となった。
したがって、今後は「滑らかな連続面はFoldingNetの思想を引き継ぎつつ、鋭利な境界はAtlasNetのマルチパッチ構造で表現する」というハイブリッドなアーキテクチャを検討する。
※余談
製造業の実務(CAD化)においては『自己交差』や『エッジの丸まり』は致命的な欠陥となるが、この『1枚の連続マニホールドが潜在空間内で滑らかに変形していく有機的な特性』は、ジェネレーティブアートや3D衣装デザイン、建築の膜構造のアイデア生成といったクリエイティブ領域においては、むしろ非常に高い表現可能性を秘めていると感じる。工学的な『正しさ』とデザイン的な『美しさ』の評価軸の反転が興味深い。
Discussion