Gazebo/MoveIt のための 3D モデリング(9)滑らかなサーフェス – 作成編(その4)

著者:yamamoto.yosuke

Gazebo/MoveIt のための 3D モデリング(9)滑らかなサーフェス – 作成編(その4)

前回は「Gazebo/MoveIt のための 3D モデリング(8)滑らかなサーフェス – 作成編(その3)」として NURBS サーフェスの制御点や次数を編集する作成・調整方法について紹介をしました.

今回は制御点の大幅な位置調整も含めた NURBS サーフェスの調整をして残りの暫定オープンエッジ周辺のサーフェスを作成します.また洗濯機の洗剤投入部を開けるために指を入れる凹み形状も制御点の移動での作成例も紹介します.

今回のゴールは左の図の状態です.

洗濯機前面・側面・上面間コーナ部のサーフェス

左の図に赤色で示している洗濯機前面・側面・上面間コーナ部のサーフェスを作成します.

編集対象となる「サーフェスを抽出(ExtractSrf)」します.

新たに作成するサーフェスの1辺の形状を表す曲線を作成したいので,その基礎形状とするためにまず洗濯機前面・上面間のフィレットサーフェスの「アイソカーブを抽出(ExtractIsocurve)」します.

抽出したアイソカーブを洗濯機側面と平行な平面上に「投影(Project)」して基礎形状曲線として利用する配置にします.

投影する際に投影方向を「カスタム」にして始点をアイソカーブの上端点,終点をフィレットサーフェスの上端点に指定します.

結果的に洗濯機前面・上面間のフィレットサーフェスのトリムされた端部形状とほぼ同じ曲線になります.それでは最初からそのトリムラインを「複製(DupEdge)」すれば良いのでは? となるかと思いますが,曲面をトリムした端部形状は 多点3次 の NURBS 曲線になってしまうので滑らかな曲線にならずそれを基に作成するサーフェスもなめらかになりません.曲面の制御点・次数がそのまま反映されるアイソカーブを「平面」に投影することで 8点7次 のままの NURBS 曲線を作成するサーフェスの基礎形状としたいのでこの手順を採用しています.

投影した基礎形状とする曲線から「点を抽出(ExtractPt)」と「グループ化(Group)」を行い,新たに作成するサーフェスの辺形状曲線の基となる制御点の参考点とします.

トリムのための平面や洗濯機側面と新たに作成するサーフェス間の曲線形状端の配置のための直線を準備します.

以前の記事で洗濯機前面・上面間のフィレットサーフェスの高さは 30mm として作成しました.それと大体同じ大きさのフィレット曲線で洗濯機側面の平面サーフェスを再トリムして,その部分を新しく作成するサーフェスの1辺とします.そのために先程,洗濯機側面平面の上前頂点から水平に描画した直線を下方(Z軸のマイナス方向)に 30mm 移動させます.

先程抽出した制御点参考点グループを直線移動でできたた交点にコピーします.

サーフェスをトリムするためのサーフェスを作成するためにコピー前とコピー後の制御点参考点グループの対応する両端点間に「直線(Line)」を描画します.

トリムするためのサーフェスを「曲線を押し出し > 曲線に沿って(ExtrudeCrvAlongCrv)」で作成します.

トリムのための交差部が確実に算出されるように「サーフェス > 延長(ExtendSrf)」でトリムするためのサーフェスを拡大します.

角部サーフェスをトリムします.

洗濯機側面上の新しいトリム曲線を「曲線をブレンド(BlendCrv)」でコピーしていた制御点の参考点に合わせて作成します.

もう一方のレール曲線についても制御点の参考点をコピーして「曲線をブレンド(BlendCrv)」でそれに合わせて作成します.

またサーフェスをトリムしたトリムラインは 多点3次 の NURBS 曲線になってしまっているので,それに近しい形状の曲線としてサーフェスのアイソカーブをカスタム方向で平面のトリムサーフェスに「投影(Project)」してアイソカーブと同じ次数・制御点の NURBS カーブをサーフェス作成に利用します.

作成したいサーフェス周りの4辺の曲線が準備できましたので「2レールスイープ(Sweep2)」でサーフェスを作成します.4辺全て曲線から作成しますので接続条件は「位置」連続しか選択できませんが,サーフェスを作成後に「マッチング(MatchSrf)」などで曲率や曲率変化率を周辺サーフェスに合わせる手順で行います.

作成したサーフェスの「マッチング(MatchSrf)」を行います.まずは次の図に示す2辺を「アイソカーブ方向の調整」の設定を「ターゲットアイソカーブの方向をマッチング(M)」にして「マッチング(MatchSrf)」を実行します.結果を得てサーフェスを周辺サーフェスと「結合(Join)」して「エッジを表示(ShowEdges)」するとマッチングを行った辺が接続されています.

次に洗濯機側面の平面に接続する辺を「連続性」の設定を「位置」にして「マッチング(MatchSrf)」を実行します.位置連続性でのマッチングの場合はその辺から1つ目の制御点のみ調整されます.結果を得てサーフェスを周辺サーフェスと「結合(Join)」して「エッジを表示(ShowEdges)」するとマッチングを行った辺も接続されています.

ここは主に現状の制御点数で洗濯機側面平面のトリム部と接続が可能かの確認を目的としています.今回は現状接続先のある3辺で接続可能なことが確認できましたので後は辺から2つ目以降の制御点の調整をして接線方向,曲率や曲率変化率の連続性を調整すれば良いことがわかりました.

続いてサーフェス3辺の曲率連続条件での接続を調整します.「アイソカーブ方向の調整」の設定を「アイソカーブの方向を維持(P)」にして「マッチング(MatchSrf)」を実行します.Rhinoceros では「アイソカーブ方向の調整」が複数辺マッチング時に各辺別の設定ができないので各辺ごとの「アイソカーブ方向の調整」を設定したい場合は何度か設定を変えながら「マッチング(MatchSrf)」を繰り返してサーフェスの連続性を調整する必要があります.

「ゼブラ(Zebra)」でサーフェスの接続状況を確認すると少しずれている箇所が見受けられるので制御点を直接的に調整します.

洗濯機側面に接続する辺から数えて4番目の制御点までは他の2辺が接続するサーフェスも洗濯機側面の平面サーフェスに対して曲率変化率連続で接続しているので Y方向 の座標を洗濯機側面平面に合わせると大体合うはずです.

これらの制御点に対して変形の「XYZを設定(SetPt)」でワールド座標系の Y座標 をセットします.

曲率連続以上の滑らかさを求めている場合は制御点の第3点以内を編集したら再度「マッチング(MatchSrf)」を曲率連続条件にて実行して,「エッジを表示(ShowEdges)」や「曲率表示(CurvatureGraph)」などで確認しながら進めます.

制御点の第3点までの配置できたら(曲率連続),制御点の第4点を調整します.第4点各点を第1〜3点の延長上に配置すると「曲率変化率連続」に近いサーフェスになります.

第4点の配置の基本的な手順は接続先のサーフェスの曲率からくる第1〜3点までの状況によりいくつかあり,またそれらの組み合わせるなどして曲率変化率連続になるように配置します.

  • 曲率変化率連続のための第4制御点配置手順の例
    • 第1〜3点までの座標が XYZ のどれかで同値ならば「XYZを設定(SetPt)」で座標を指定して配置
    • 接続先のサーフェスが曲率ゼロの平面なら第1〜3点の延長直線上に第4点をガムボールなどで移動して配置
    • 接続先のサーフェスが曲率一定なら第1〜3点の延長円弧上付近に第4点をガムボールなどで移動して配置
    • 接続先のサーフェスの曲率が変化する場合は「曲率表示(CurvatureGraph)」をして接続先の曲率変化に合うように第4点を移動配置
    • UV 方向で共有する制御点第4点は両方向の都合が合う位置に移動配置
少し余談ですが,このように曲率変化率連続に調整するためには第1〜3の制御点とそれぞれの第4制御点を比較できる視点で第4制御点をガムボール移動する必要が多くなるので, 3D マウスがあると視点を移動しやすく作業効率が良くなると思います.

サーフェスの「マッチング(MatchSrf)」や制御点の「XYZを設定(SetPt)」,ガムボール移動などを繰り返して曲率変化率連続になるようにサーフェスを修正します.

おおよそ曲率変化率連続に近づいた状態でここで編集しているサーフェスとその周辺のサーフェスを「ゼブラマッピング(Zebra)」して縞の方向を縦と横にしたものが次の図です.だいぶゼブラが滑らかに通るようになったのではないかと思います.

残りのフレット部分のサーフェスを作成します.

先程と同様にアイソカーブをトリム平面にカスタム方向にて「投影(Project)」してフィレットサーフェス両端のプロファイル曲線とします.

色々と試しているときに洗濯機前面と側面間のフィレットサーフェスの長さが足りなかったので「サーフェスを抽出(ExtractSrf)」,「トリム解除(Untrim)」してから「サーフェス延長(ExtendSrf)」(タイプ: スムーズ)を行って,再度トリム平面で「トリム(Trim)」しました.

フィレットサーフェスを「2レールスイープ(Sweep2)」で作成します.レール曲線にサーフェス端部形状を使い,断面曲線に先程アイソカーブをトリム平面に「投影(Project)」した曲線を使います.後で「マッチング(MatchSrf)」で曲率連続での接続に修正するので,今回の作成時は接続条件は位置のみにします.

作成したフィレットサーフェスの制御点を「制御点表示オン(POn)」で表示してみると V方向 は 8点 ですが U方向 は多くの点で構成されていることが分かります.また次数は V方向 は投影したアイソカーブが反映されていて 7次 で U方向 はレール曲線の1つがサーフェス断面なので 3次 です.

U方向 の制御点数がサーフェス内での滑らかさの調整や周辺サーフェスとの曲率変化率連続のために第4点を全て手動で調整するには多いように思いますので「RebuildUV(メニューにはない)」で “U方向のみ” サーフェスを再構築します.

今回は再構築後の U方向の 制御点数を 11個 にしています.また「RebuildUV」オプションで「タイプ(T)=ユニフォーム」にしたので再構築後の次数は 3次 になります.

Rebuild と RebuildUV
「RebuildUV」は “UもしくはVの1方向” のみですが,「サーフェスをリビルド(Rebuild)」は “UV両方向” についてサーフェスを再構築しますので適宜使い分けます.

  • Rebuild
    • UV両方向を再構築
    • 再構築後の次数は制御点数より少ない数で任意に設定可能
    • 制御点数と次数が再構築前と同じでも再構築により少し形状が変化
  • RebuildUV
    • UもしくはVの1方向のみを再構築
    • 再構築後の次数は最大でオプション「タイプ(T)=ユニフォーム」にて 3次
    • 再構築を行わない方向の制御点数および次数は元のままで比較的再構築前の制御点配置がそのまま反映

再構築したフィレットサーフェスの U方向 の次数は 3次 なので最終的には「次数を変更(ChangeDegree)」で 7次 にします.「次数を変更(ChangeDegree)」で 3次 から 7次 にする場合,次数を変更する方向の制御点に新たに4つ(セット)が元のサーフェスに対して増えます.

「次数を変更(ChangeDegree)」で 7次 に変更して制御点が増える前にまず 3次 の時点で制御点の配置を整えておきます.

洗濯機上面と側面間のフィレットおよび前面と側面間のフィレットはそのプロファイル曲線の制御点の Y座標 をほぼ一致するようにしていましたので両フィレットサーフェス間にある今編集しているサーフェスの制御点の Y座標 もそれらと大体一致するものと考えられます.そこで「制御点を選択 > U方向をすべて選択(SelU)」で8列の1つずつ U方向 の制御点を選択して「XYZを設定(SetPt)」でワールド座標系の Y座標 の設定にて各端点を選択して Y座標 位置を整えます.

U方向 だけ次数が 3次 のうちに一度曲率連続で接続先サーフェスに「マッチング(MatchSrf)」を「ターゲットアイソカーブの方向をマッチング(M)」で行い接続します.

フィレットサーフェスの U方向 の次数を 「次数を変更(ChangeDegree)」で 3次 から 7次 に変更します.

次数が 7次 に変更された U方向 だけ曲率連続で接続先サーフェスに「マッチング(MatchSrf)」を「ターゲットアイソカーブの方向をマッチング(M)」で行い接続します.

今度は4辺全てにおいて曲率連続で接続先サーフェスに「マッチング(MatchSrf)」を「アイソカーブの方向を維持(P)」で行い接続します.

フィレットサーフェスの4辺が曲率連続で接続されているはずですので周辺のサーフェスと全て「結合(Join)」してから「エッジを表示(ShowEdges)」で隙間が無いことを確認し.また「曲率分析(CurvatureAnalysis)」でおおよその曲率連続性を見てみます.

今回のフィレットサーフェスは U方向: 15点7次,V方向: 8点7次 で4辺とも周辺のサーフェスと隙間なく接続することができました.
しかしこのようなフィレットサーフェス作成・修正時には曲率の大きい接続部周辺で制御点が足らずに形状が精度内で一致せずに隙間が出来てしまうことが頻繁にあります.このような場合には次の手順を(繰り返し)行うと隙間なく接続されるようになります.

  1. 曲率の大きな接続部周辺に「ノットを追加(InsertKnot)」を実行(形状追従性を向上)
  2. 全辺に対して再度サーフェスの「マッチング(MatchSrf)」を実行
  3. 隙間の有無を「エッジを表示(ShowEdges)」で確認 → あれば 1. から再度実行

大体曲率連続接続になっているので後は「曲率変化率連続」になるように全ての第4制御点について第1〜3制御点に対する位置の調整を行います.

第4制御点の位置調整をする際にガムボールの白い丸をクリックするとガムボール設定が表示されるので適宜ガムボールの移動方向を「ワールドに合わせる」や「ビューに合わせる」に変更したり,「ドラッグ強度」を小さく設定して微妙な位置修正をできるようにするとより良く編集できると思います.

全ての第4制御点の位置を大体調整して「曲率表示オン(CurvatureGraph)」を行ったのが右の図です.おおよそ曲率変化率連続(G3)に近い状態になっているかと思います.

「ゼブラ(Zebra)」表示をして「縞の方向」と「縞のサイズ」を変更したものが次の図です.ゼブラも比較的良く通っているように見えます.

また,作成したポリサーフェスを「環境マッピング(Emap)」表示を行ってもサーフェスやその接続の滑らかさの様子を見ることができます.

これで洗濯機本体の隙間があった部分のサーフェスもできましたので今回作成・編集したサーフェスで置き換えた洗濯機本体のポリサーフェスを再構成して「結合(Join)」したものが右の図です.

洗剤トレイ付近形状 – 制御点移動による曲面の作成

今回の記事の最後に平面に接続する場合において曲率変化率連続接続されるサーフェスのパワープレー気味ですが簡単な制御点移動による曲面の作成方法を1つ紹介します.

本項で作成するのは左の図の赤い楕円で囲ったところにある洗濯機の洗剤投入トレイに指を掛けるためのトレイ後ろ側本体窪み形状のサーフェスです.

洗剤トレイとそれが入る洗濯機本体部分のモデリング手順はここでは省略して既にあるものとします.

上面図に少しサーフェス範囲の線が入っているので洗濯機上面平面前端曲線の同心円やトレイの中心線からのオフセットラインを描画してサーフェスの作成範囲の参照線とします.

新たに作成するサーフェスの1辺として同心円間に円の中心からサーフェス端の方向に「直線(Line)」を描画します.

描画した直線を同心円中心周りに「回転(Revolve)」でサーフェスを作成します.

この「回転(Revolve)」で作成されたサーフェスは円弧方向は 3点2次,直径方向は 2点1次 で構成されたサーフェスになります.

このサーフェスを変形して曲面にしても洗濯機上面の平面に曲率変化率連続で接続するには洗濯機上面につながるサーフェスの辺から第4の制御点までこの平面上に位置していれば良いので「リビルド(Rebuild)」して制御点と次数を変更して再構築します.

リビルド(Rebuild)」で U方向 を 16点7次 に V方向 を 8点7次 にします.

洗濯機上面の平面に接続する3辺から第4までの制御点以外の制御点を選択してガムボールで Z軸方向 に -15mm 移動させます.

「曲率表示オン(CurvatureGraph)」をすると平面に接続する3辺が曲率ゼロ,曲率変化率ゼロになっていることが見て取れます.

このように NURBS サーフェスの接続連続性と制御点と次数の関係が分かっていると単純な操作で滑らかに接続するサーフェスを作成できるケースもありますので便利です.

以前の記事も含めてこれまで紹介してきたようにサーフェスの作成方法は様々ありますが,最終的には適切な次数で「制御点群をどう配置して意図するサーフェスを作るか」という点が NURBS サーフェスでは大事な点となります.

今回作成したサーフェスを含めた洗濯機モデルの全体像は右の図のようになります.

今回の記事はここまでです.


「滑らかなサーフェス – 作成編」などサーフェスの作成方法に主眼を置いたモデリングの記事は今回で終了となります.

本シリーズ次回の記事は

「Gazebo/MoveIt のための 3D モデリング(10)部品作成編」

として,洗濯機の扉などの部品の作成例を紹介する予定です.

Gazebo/MoveIt のための 3D モデリング(8)滑らかなサーフェス - 作成編(その3)

著者について

yamamoto.yosuke administrator

コメントを投稿するにはログインしてください。