1

OpenGL で任意の幅の連続した曲線の線を描画しようとしています。私はタッチ スクリーン用に開発しており、古い X & Y 座標と新しい X & Y 座標の間に線を引くことで、目的の効果を既に達成しています。ユーザーが画面上で指をスワイプすると、指に沿って線が生成されます。線が滑らかであることを確認するために、次を使用しました。

pGL.glEnable(GL10.GL_LINE_SMOOTH); 
pGL.glHint(GL10.GL_LINE_SMOOTH_HINT, GL10.GL_NICEST);

ただし、これは本質的に、線の幅が常にデフォルトで 1 であるため、制御できないことを意味します。したがって、この効果を作成するには別の方法を考え出す必要があると結論付けました。

4

1 に答える 1

2

線の代わりに、ストロークに沿って中央に配置され、必要な幅のクワッド ストリップまたはトライアングル ストリップを使用します。

コメントによる編集

四角形または三角形を使用して太い線を描くには、次の方法があります。

モデルビューの左上の 3×3 サブマトリックスが回転部分です。画面スペースに太い線を描画したい、つまりローカル回転を逆にしたい。これを行うには、モデルビューの回転の逆が必要です。回転は直交変換なので、inverse(M) = transpose(M).

技術的には、逆投影された Z 軸 "Z_local" のみに関心があります。これには、modelview 行列の 3 番目の行ベクトルを単純に取得できます。最後の要素 "w" をゼロに設定し、ベクトル全体を正規化します。つまり、

Z_local_i = MV_i,3

次に、接線ベクトルが必要です。これは、線分の間の方向と同じくらい単純です。もっと数学的に言えば、直線が関数 C(t) で表される場合、接線は次のようになります。

T=∂C(t)/∂t 

tangent と Z_local の間の外積を取ることができるようになり、法線が得られます。

N(t) = Z_local × T(t)

法線 N(t) を C(t) に追加すると、C に平行な等距離曲線が得られます。これにより、四角形を描くことができます。

for t in range(0, T):
    T = deriv(C(t), t)
    N = cross(Z_local, T)
    emit_vertex(C(t) + width*N)
    emit_vertex(C(t) - width*N)
于 2011-10-20T15:19:43.553 に答える