スプラインの曲線に沿って立体を描くプログラムを書いています。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 を使用します。
まだ解決していない正しい象限に描画するといういくつかの問題がなければ、これが良い実装であるかどうか、または誰かがより良い方法を知っているかどうかを確認するためにアドバイスを求めたい.