Three.jsのSVGLoaderでstrokeをdepth有りのgeometryにしたい!
ゴール
前提
SVGで設定されているstroke
はpath
の境界線が中央に来るように指定されたstroke-width
の幅で描画される。
目指すもの
今回は下記条件を満たすようなプログラムの作成をゴールとする。
-
stroke
の外側とpath
の外側が一致している。 -
stroke
をExtrudeGeometry等を利用して高さを変更できるようにする。
現状
SVGファイルのロード
SVGファイルをロードする際はSVGLoaderを利用している。
SVGの読み込みに成功すると、ShapePath
の配列を返却する。
path
SVGファイルのpath
で記述されている部分については、ShapePathで利用できるtoShapes
を利用してshape
を取得することができる。
取得したshape
をExtrudeGeometryに渡すことで描画している。
stroke
SVGファイルのpath
内のstroke
部分については、SVGLoader
のpointsToStroke
を利用してBufferGeometry
として描画している。
実装方針
stroke
の情報からshape
を返却するようにする
方針1:方針2:すでにレンダーできているBufferGeometryからExtrudeGeometryに変換する
path
の情報からstroke
用のshape
のデータを作成する
方針3:path
で利用しているShapePath
のデータはあるので、これを利用して所望のstroke
のShapePath
を計算する。
参考資料
Painting: Filling, Stroking and Marker Symbols — SVG 2
SVGに関する規格
SVG: スケーラブルベクターグラフィック | MDN
SVGに関するMDNのドキュメント
SVGLoader – three.js docs
Three.jsでSVGをロードする際に利用。
Extrude SVG strokes and svg loader example extrude option. by repalash · Pull Request #20796 · mrdoob/three.js
SVGLoaderにstroke
をExtrudeGeometry
として出力するオプションを追加するPR。2021年5月で更新が止まっており、マージされる様子はない。
pointsToStroke: Return a shape rather than a geometry · Issue #21326 · mrdoob/three.js
pointsToStroke
でgeometry
ではなくshape
を返却する方が良いのでは?と言う提案をするIssue。
r3f svg react-spring transitions - CodeSandbox
react-three-fiber
でSVGをロードしてそれぞれのpath
をディレイ付きでアニメーション表示する例。
SVGLoader: Add stroke support by yomboprime · Pull Request #16077 · mrdoob/three.js
SVGのstroke
のサポートを追加するPR