曲線にストロークを適用するときに自己交差を回避するにはどうすればよいですか?


11

私のコードにはいくつかのSpline2Dオブジェクトがあり、それぞれに特定の時間に指定された数量のベクトルを返すPosition、Velocity、およびAccelerationメソッドがあります。これらのベクトルを使用してジオメトリを作成し、曲線のグラデーションストロークを作成しましたが、急な曲線での自己交差に問題があります。例として、これが発生している1つの曲線を次に示します。

ワイヤーフレーム:http : //twitpic.com/2zplw1/full
塗りつぶし:http : //twitpic.com/2zpmnt/full

ご覧のとおり、2番目の曲げでは、内側部分がそれ自体と交差しているため、醜いアーティファクトが発生しています。その自己交差を引き起こさずに曲線をストロークするための良いアルゴリズム/方法はありますか?

編集:もっと極端な例に加えて、私が達成したいことのモックアップ:

ワイヤーフレーム:http : //twitpic.com/2ztwzi/full
塗りつぶし:http : //twitpic.com/2ztwkt/full
理想的な結果(モックアップ):http : //twitpic.com/2ztxa8/full


うわー、書いてもタイトルの意味がわかりませんでした。:)
ThatsGobbles

回答:


3

これらをGPUおよび最新の3D API(OpenGL / D3Dなど)でレンダリングしている場合、深度テストでこれを取り除くことができるように見えます。外側の頂点をz = FARに割り当て、内側の頂点をz = NEARに割り当てる場合、深度テストでは重複が表示されないようにする必要があります。OpenGLの場合:


  // don't forget to clear depth buffer to 1.0f at beginning of frame.
  glClearDepth(1.0f);
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  // enable depth testing.
  glEnable(GL_DEPTH_TEST);
  glDepthFunc(GL_LEQUAL);

// draw the Spline2D for each segment in spline for each vert in segment if (vert is an outer vert), set vert.z = 1.0, otherwise set vert.z=0.0

警告のエンプター:半透明のストロークが必要な場合、これは機能しません。


1
いい答えですが、私が考えていただけですが、zbufferを1つのパスで書き込んでから2番目のパスでカラーを実行する場合、半透明のストロークで機能しないのは間違いです。
Richard Fabian、

おかげで、私のストロークは確かに不透明なので、これは非常に単純かつ素晴らしく機能しました!
ThatsGobbles

1

「修正」は、結果の出力をどのように見せたいかに依存します。問題は実際にはここで十分に定義されていません。それはどのように見えるのですか?

最初にグリッチのさらに極端な例を作ってみて、次にphotoshop / paintを使用してそれを修正して、解決策のインスピレーションを見つけることをお勧めします。

折りたたみますか?エッジと重なりますか?重ならないまで引き込みますか?


良い点は、本日後半にIllustratorまたはInkscapeでより鋭いカーブと「理想的な」カーブを作成することです。
ThatsGobbles

元の投稿が編集されました!
ThatsGobbles
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.