5

私の懸念は、レンダリングのためにテッセレートしようとしている2次ベジェ三角形です。

ウィキペディアのページで説明されているように、三角形を再帰的に細分化することで、これを実装することができました。細分化の精度を上げたいのですが。問題は、そのアルゴリズムの反復ごとにサーフェスの量が2倍になるため、細分割が少なすぎるか多すぎることです。

特に、エッジのセグメントの量を定義できる適応型テッセレーションアルゴリズムが必要になります。でもそれができるかどうかわからないので、均一なテッセレーションのテクニックについても聞きたいです。

最も難しい問題ベジェ曲面の点の法線を計算するのに問題があります。これが必要かどうかはわかりませんが、解決しようとしています。

4

1 に答える 1

1

アダプティブテッセレーション。これには多くのアルゴリズムがあります。しかし、ここに1つあります。

def line_angle((x0,y0),(x1,y1)):
    return atan2(y1-y0,x1-x0)

def adaptive_bezier(p0,p1,p2,lev=32):
    p01 = midpoint(p0,p1)
    p12 = midpoint(p1,p2)
    m = midpoint(p01, p12)
    da = abs(line_angle(p0,p1) - line_angle(p1,p2))
    if da <= max_tolerance or lev <= 0:
        yield m
    else:
        for p in adaptive_bezier(p0,p01,m,lev-1): yield p
        for p in adaptive_bezier(m,p12,p2,lev-1): yield p

このように三角形をテッセレーションする場合、問題は複雑になります。エッジベジエの角度に応じて、適応テッセレータアルゴリズムを駆動する必要があります。テッセレーション時に三角形を分割する方法は3つあります。

 2 edges      one edge     3 edges    
--------     ---------    --------
\  ...//     \   |   /    \ /  \ /
 \/___/       \  |  /      \____/
  \  /         \ | /        \  /
   \/           \|/          \/

これらのパターンのテッセレーション結果を定義すれば、問題はありません。ウィキペディアの記事では、片方のエッジを持つテッセレーションのみが説明されています。

1つのエッジ分割の場合を検討することにより、他の2つのテッセレーション結果を取得できます。

「2つのエッジ」は、最初に1つのエッジを分割し、次に別のエッジを分割することによってまっすぐに取得できます。

「3つのエッジ」を見つけるにはもう少し手間がかかります。しかし、あなたは「2つのエッジ」を見ることができます-ケースはあなたにミッドエッジをもたらします。二次ベジェ三角形の場合、そこに現れるダイヤモンドの平均合計です。

--------      /\
\      /     /  \
 \____/     -____-
  \  /       \  /
   \/         \/
于 2010-05-19T06:49:42.570 に答える