概要
SVGではCSSのような 透視変換(パース変換) がサポートされていないため、3Dオブジェクトの画像テクスチャ投影には工夫が必要。 アフィン変換 のみで近似する手法を模索し、画像の細分割+局所的なアフィン変換で高精度な見た目を実現。 SVGファイルサイズも抑えられ、 軽量かつ見た目が正確な3D表示 が可能。 GitHubでの回路基板レビューや視覚的スナップショットテストにも応用可能。 バグ修正も行い、安定した投影アルゴリズムを実装。
SVGで3Dオブジェクトに近いパース投影を実現する工夫
- SVG ではCSSのような perspective変換 が標準サポートされていない現状
- アフィン変換 (transform: matrix(a,b,c,d,e,f))のみが利用可能
- アフィン変換は 2D変形(拡大縮小・回転・平行移動) には有効だが、 3D的なパース投影 には非対応
- 1枚のアフィン変換画像では パースの歪み を再現できない制約
近似手法の検討と実装
- 画像をラスタライズして歪ませる案は SVGの軽量性 を損なうため不採用
- レイトレーシング的な全ピクセル計算も SVGの利点 を活かせないため不採用
- 画像を細分割し、各領域ごとに最も近似的なアフィン変換を適用 する手法を採用
- 各サブ領域に clip-path で切り抜き、個別のアフィン変換を割り当て
- 画像の再利用は SVGのdefs で実現し、ファイルサイズを抑制
細分割数による見た目の変化
- 細分割数2: 明らかな歪み (バルジ)発生
- 細分割数4: 表面が粗い 印象
- 細分割数16: まだ波打つ 見た目
- 細分割数512: ほぼ平坦で自然 な投影に見える
- 細分割を増やすことで パース近似精度 が向上
SVGファイルサイズと効率
- 画像は1つだけ定義 し、各サブ領域ごとに clip-pathとアフィン変換 を割り当て
- 細分割数を増やしても ファイルサイズは比較的コンパクト
- 実際のSVG例やファイルサイズの変化を 表やコードスニペット で検証
活用例と今後の展望
- GitHub上での回路基板レビュー や 視覚的スナップショットテスト への応用
- tscircuit 等のプロジェクトで 3D SVGアーティファクト を活用
- コードのバグ修正・最適化を進め、 正確なアフィン変換計算 を実装
まとめ
- SVGで3D的パース投影を近似的に再現 するには、画像細分割+局所アフィン変換が有効
- ファイルサイズと見た目のバランス を両立可能
- オープンソース実装 や ビジュアルテスト にも応用できる
- 今後も改良・応用が期待 される技術