mruby-siren icon indicating copy to clipboard operation
mruby-siren copied to clipboard

Filler の別実装

Open shizuo-kaji opened this issue 9 years ago • 6 comments

境界曲線や通るべき点を指定して曲面を貼る filler について、現状 BRepFill を使用しているが、GeomFill_ConstrainedFilling を試してみよう: https://www.opencascade.com/doc/occt-7.0.0/overview/html/occt_user_guides__modeling_algos.html#occt_modalg_2_5_5

  • そもそも現状ではまずい理由は?
  • GeomFill_BoundWithSurf は隣接面との整合性も考慮してくれるようだ
  • 実装の参考になる: https://mail.gna.org/public/pythonocc-users/2009-03/msg00018.html

shizuo-kaji avatar Sep 13 '16 13:09 shizuo-kaji

別 API の開拓、賛成です。

そもそも現状ではまずい理由は?

特に現在 Siren::Filler で実装済みの BRepFill_Filling で問題が発生しているわけではありません。与える引数の意味や取り得る値の範囲・与える引数によって生成される曲面の傾向…etc. を私があまり理解していないところが大きいです。API 内部で曲面を生成しているので仕方ないのかもしれませんが、強いて言うなら、処理コストが少しかかります。 種類を増やして、それぞれの傾向を見て、使い分けができる環境を整えていきます。

dyama avatar Sep 14 '16 00:09 dyama

Siren::Filler は NURBS 曲面を作るかどうか理解していませんが,NURBS 曲面となると,球面も含まれると思います.以下のコードでは球面を作ることができませんでした.原点中心の半径10の円をxy平面内とyz平面内の2つ作る.この2つの円を通る曲面を Siren::Filler で作る.この API は NURBS 曲面を作っているのではないのか,NURBS 曲面を作ろうとしているがアルゴリズムの特性上不可能なのか不明です.

include Siren
faces = []
edge1 = circle [0, 0, 0], [0, 0, 1], 10
edge2 = circle [0, 0, 0], [1, 0, 0], 10
filler = Filler.new
filler.add edge1
filler.add edge2
filler.build
faces << filler.face
comp = compound faces
save_brep comp, "face.brep"

HiroyasuHamada avatar Sep 15 '16 01:09 HiroyasuHamada

上記の境界を指定したバージョンです.球面の4分の1が表示されることを想定しています.原点中心の半径10の半円をxy平面内とzx平面内の2つを境界として曲面を作ります.曲面は表示されますが想定外の曲面です.さらに1点を与えてその点を通るように指定したバージョンも合わせて書いておきます.この場合はコメントを外して実行してください.こちらもダメでした.

include Siren
# a = 10 * (1/3) ** (1/2)
faces = []
edge1 = arc3p [10, 0, 0], [0, 10, 0], [-10, 0, 0]
edge2 = arc3p [10, 0, 0], [0, 0, 10], [-10, 0, 0]
# point = [a, a, a]
filler = Filler.new
filler.add_bound edge1, 0
filler.add_bound edge2, 0
# filler.add point
filler.build
faces << filler.face
comp = compound faces
save_brep comp, "face.brep"

HiroyasuHamada avatar Sep 15 '16 09:09 HiroyasuHamada

まあまあ球に見える:

include Siren #a = 50 ** (1/2) a = 6 edge1 = arc3p [10, 0, 0], [0, 10, 0], [-10, 0, 0] edge2 = arc3p [10, 0, 0], [0, 0, 10], [-10, 0, 0] edge3 = arc3p [10, 0, 0], [0, a, a], [-10, 0, 0] filler = Filler.new filler.add_bound edge1, 0 filler.add_bound edge2, 0 filler.add edge3, 0 filler.build save_brep filler.face, "face.brep" save_stl filler.face, "model.stl"

ただし、a=7とか大きくするとなぜか落ちる

shizuo-kaji avatar Sep 16 '16 03:09 shizuo-kaji

ただし、a=7とか大きくするとなぜか落ちる

もう少し調べなければわからないことかもしれませんが,やはり球面の一部は Siren::Filler では作れないのではないかと考えています.上記の a=6 の場合は,1/4球面に見えますが,実際は少し違う曲面になっているはずです.a=7 にすると a=6 のときよりも1/4球面に近いものを作成することになり,実際は作成できず落ちるのではないかと推察しています.

HiroyasuHamada avatar Sep 16 '16 08:09 HiroyasuHamada

Siren::Filler は NURBS 曲面を作るかどうか理解していませんが,NURBS 曲面となると,球面も含まれると思います.

内部で生成される曲面の状態をパラメータ(NURBS 曲面の場合は uv それぞれの degree, knots, poles/control vertices, weights)として確認できるようにするため、Surface クラスの新規実装を #23 に追加しておきました。

OCCT の Geom_Surface のクラス派生図は次のとおりです。

Geom_SphericalSurface もありますが、Filler 内部で仕様している OCCT API の BRepFill_Filling は Geom_BSplineSurface で生成しようとしていると予測しています。検証します。

dyama avatar Sep 16 '16 15:09 dyama