4

スプラインの曲線に沿って立体を描くプログラムを書いています。Visual Studio 2005 を使用しており、OpenGL 用に C++ で記述しています。FLTK を使用してウィンドウを開いています (高速で軽量なツールキット)。

私は現在、ポイント間の間隔をサブ間隔に分割し、これらのサブポイント間に線分を描画することにより、一連の制御点を指定してカーディナル キュービック スプラインを描画するアルゴリズムを持っています。サブインターバルの数は可変です。

線画コードは素晴らしく機能し、基本的には次のように機能します: スプライン方程式を使用してスプライン曲線に沿って点のセットを生成し、それらを配列に格納します (Pnt3f と呼ばれる特別なデータ構造として、座標は 3 つの float であり、距離、長さ、ドット、クロス積などのいくつかの便利な関数)。次に、ポイントの配列を反復処理して次のように描画する単一のループがあります。

glBegin(GL_LINE_STRIP);
for(pt = 0; pt<=numsubsegements ; ++pt) {
    glVertex3fv(pt.v());
}
glEnd();

前述のとおり、このコードはうまく機能します。今私がやりたいのは、線を描く代わりに、ソリッドを押し出したいということです。私の現在の調査では、「円柱」二次曲線を使用して線に沿ってチューブを作成しています。円柱を描画したい方向にopenGLを向ける必要があるため、これは少しトリッキーです。私の考えはこれを行うことです:

疑似コード:

Push the current matrix,
translate to the first control point
rotate to face the next point
draw a cylinder (length = distance between the points)
Pop the matrix
repeat

私の問題は、ポイント間の角度を取得することです。必要なのはヨーとピッチだけで、ロールは重要ではありません。2 つの点の内積を両方の点の大きさで割った値の逆余弦を取ると、それらの間の角度が返されることはわかっていますが、これを OpenGL に供給して回転させることはできません。XZ平面を使用してx回転を取得し、原点からポイントベクトルを作成して、これを2dで実行しようとしましたが、正しい角度が返されません。

私の現在のアプローチははるかに単純です。各回転面 (X および Y) について、次の方法で角度を見つけます。

arc-cosine( (「x」値の差)/ポイント間の距離)

「x」の値は、飛行機の設定方法によって異なりますが、私の計算では常にワールド x を使用します。

まだ解決していない正しい象限に描画するといういくつかの問題がなければ、これが良い実装であるかどうか、または誰かがより良い方法を知っているかどうかを確認するためにアドバイスを求めたい.

4

3 に答える 3

1

2 つの隣接する線分の 3 点から 2 つのベクトルを形成し、内積のアークコサインを使用してそれらの間の角度を取得することは正しいです。この角度を利用するには、回転が発生する軸を決定する必要があります。この軸を取得するには、同じ 2 つのベクトルの外積をとります。次に、この軸角度を使用して変換マトリックスを構築するか、パラメーターとしてglRotateに渡すことができます。

于 2008-11-12T18:48:59.413 に答える
1

いくつかのメモ:
まず第一に、これ:

for(pt = 0; pt<=numsubsegements ; ++pt) {
  glBegin(GL_LINE_STRIP);
    glVertex3fv(pt.v());
}
glEnd();

何かを描く良い方法ではありません。glBegin() ごとに 1 つの glEnd() が必要です。おそらく glBegin() をループから外したいと思うでしょう。これが機能するという事実は、純粋な運です。

二番目のこと

私の現在の調査では、「円柱」二次曲線を使用して線に沿ってチューブを作成しています

これは期待どおりには機能しません。「円柱」の四角形には、平らな上部ベースと平らな下部ベースがあります。スプラインに従って正しい回転を行うことに成功したとしても、フラットトップのエッジが意図したチューブのボリュームから飛び出し、滑らかになりません. ペンと紙だけで 2D で試すことができます。底が平らな短いチューブのみを使用して、滑らかなチューブを描くようにしてください。不可能だよ。

第三に、実際の質問に対して、そのような回転の決定的なツールは四元数です。この範囲で説明するのは少し複雑ですが、どこを見ても豊富な情報を見つけることができます。FLTK の代わりに QT を使用した場合は、 libQGLViewer
も使用できます。実装を節約する統合された Quaternion クラスがあります。まだ選択肢がある場合は、QT に移行することを強くお勧めします。

于 2008-11-08T20:29:42.130 に答える
0

検討しましたgluLookAtか?制御点を視点に、次の点を基準点に置き、2 つの差に垂直なアップ ベクトルを作成します。

于 2008-11-08T18:54:44.660 に答える