3

私は3D環境に宇宙船を持っています。コントロールポイントを使用してBスプライン曲線を描画しました(描画できるようにベジェ曲線に変換されました)。ドローイベントが呼び出されるたびに、船はポイント(0,0,0)にあり、カーブ上の次の座標に変換されます。さて、この変換を行う前に、船の向きがそのポイントでのカーブの接線に沿っているように回転させる必要があります。

これを行うことで、現在のポイントに近いカーブ上のポイントを見つけることで、接線を概算できます。私はC++でOpenGLを使用しています

float mDifference[1][3] = {nearPoint[0][0] - currentPosition[0][0],
                           nearPoint[0][1] - currentPosition[0][1],
                           nearPoint[0][2] - currentPosition[0][2]};

float norm = sqrt(mDifference[0][0] * mDifference[0][0] 
             + mDifference[0][1] * mDifference[0][1]
             + mDifference[0][2] * mDifference[0][2]);

float tangent[1][3] = { mDifference[0][0] / norm,
                        mDifference[0][1] / norm,
                        mDifference[0][2] / norm};

//tangent = rotationVector?
spacecraftTransformGroup->setRotationVector(tangent[0][0],tangent[0][1],tangent[0][2]);

回転ベクトルは接線だと思いますが、船を回転させるのに必要な角度がわかりません。船を回転させて接線に合わせるにはどうすればよいですか?

4

2 に答える 2

2

正規直交(つまり方向)行列は、次のもので構成されています。

方向、接線、BiTangent(上向きベクトル)。

したがって、方向と接線がある場合は、外積を使用して接線を取得し、次のように3つの方向ベクトル(D、T、B)と位置ベクトル(P)から行列を形成できます。

 Tx, Bx, Dx, Px
 Ty, By, Dy, Py
 Tz, Bz, Dz, Pz
  0,  0,  0,  1

これで、オブジェクトは方向ベクトルに沿って方向付けられます...

于 2010-12-03T22:57:10.263 に答える
1

まず、Bスプライン曲線に沿った特定の点での実際の接線を見つける方法については、このサイトを参照してください。

次に、を使用atan(y/x)して、接線ベクトルの角度(ラジアン)を取得できます。「ゼロ」の角度で船がx軸に沿って向いていると仮定して、その角度を使用して船を回転させます。

于 2010-12-03T22:58:48.440 に答える