



Random Thoughts |
If knees were backwards, what would chairs look like?
|

言語 |
|




|
 |
フォーラムニュース: 質問、相談カテゴリに「SolidWorks操作方法」に関するフォーラムを追加しました。(2003/11/27) |
いらっしゃい、 ゲストさん. まずはこちら→ ログイン または 登録. 2025/04/19 - 19:33:01 |
|
 |
|

著者
|
トピック: サーフェスに描かれたカーブ上の法線の取得に失敗する (閲覧数 2128 回) |
|
chura
Jr. メンバー  
オフライン
投稿: 25

I'm a llama!
|
 |
サーフェスに描かれたカーブ上の法線の取得に失敗する
« 投稿日: 2006/08/31 - 16:15:49 » |
|
いつもお世話になっております。
フェイス上に描いたカーブの法線を取得するため次のような手順で プログラミングしています。
(1)対象となるフェイスとカーブを取得 ←当然これは交差している (2)カーブ上の点を取得(Evaluate) ←カーブ上の点なのでフェイス上の点のはず (3)フェイスからサーフェスを取得 (4)点を指定してサーフェス上の法線を取得(EvaluateAtPoint) ほぼ、これで正常に動作しているのですが、曲面上に描かれたカーブに ついては部分的に失敗するのです。具体的には(4)のEvaluateAtPoint にてエラーが返ってきます。
サンプル(VB6版)を添付しましたのでお手すきの方は一度確認していた だければ幸いです(当方の環境はSW2004+VB6、またはVC6です)。 <使い方> (1)アドイン(sample.dll)をSWに登録します (2)添付のパーツ(spline_Work.sldprt)を読み込みます (3)メニューにSampleが表示されるのでクリックします (4)SW上でフェイスとエッジ(カーブ)を選択します
最後にクリックされたフェイスとカーブの法線が描画されます。 パーツ上のエッジのうち大半は正常に描画されますが、曲面上の カーブは数本しか描画されないことが確認いただけるかと思います。
もしなにか心当たりのある方は些細な情報でも結構ですのでご教授 いただけると幸いですm(_"_)m
#なお、VB上から実行する場合は、OpenGL描画できません。
|
|
|
|
chura
Jr. メンバー  
オフライン
投稿: 25

I'm a llama!
|
 |
Re:サーフェスに描かれたカーブ上の法線の取得に失敗する
« 返信 #1 投稿日: 2006/09/04 - 16:49:32 » |
|
いつもお世話になっております。
ファイルを添付し忘れていましたので再送します。
また、本VBプロジェクトをコンパイルする際にはOpenGLのタイプライブラリが必要です。タイプライブラリは以下のURLよりダウンロードできます。
http://home.pacific.net.hk/~edx/tlb.htm
なお、当方の開発環境は次のようになります。 Windows XP sp2 SolidWorks 2004〜2006 VisualBasic6 ※最終的にはVCへ移植しますのでVCでの回答も大歓迎です。
|
|
|
|
chura
Jr. メンバー  
オフライン
投稿: 25

I'm a llama!
|
 |
(解決!)Re:サーフェスに描かれたカーブ上の法線の取得に失敗する
« 返信 #2 投稿日: 2006/09/14 - 15:58:42 » |
|
本件について解決しましたので報告しておきます。
ポイントは、
・サーフェスに描かれたカーブはスプライン曲線である ・スプライン曲線は近似的な曲線なので必ずしもサーフェスと一致していない
ということです。 これを解決するための関数が用意されていました。勉強不足を反省です(^^; この関数は指定点に最も近いサーフェス上の点を取得します。プログラムにするとこんな感じ。
' カーブ上の点を取り出す vArray = swCurve.Evaluate((eParam - sParam) * N / 分割数)
' サーフェス上の情報を取得する vParams = swSurface.EvaluateAtPoint(vArray(0), vArray(1), vArray(2))
' 情報取得に失敗した場合の処理 If (IsEmpty(vParams)) Then ' 指定点に最も近いサーフェス上の点を取得する vClosestPoint = swSurface.GetClosestPointOn(vArray(0), vArray(1), vArray(2))
'取得できた点を使ってもう一度サーフェス上の情報を取得する vParams = swSurface.EvaluateAtPoint(vClosestPoint(0), vClosestPoint(1), vClosestPoint(2)) End If
それでは失礼します。
|
|
|
|
|
|
|

|