1

私はOpenGLES2.0用の3Dアプリを書いています。このアプリでは、ユーザーがパスを設定し、いくつかの地形を飛行します。基本的にはレール上のフライトシミュレーターです。

パスは、スプラインから作成された一連のポイントによって定義されます。タイムスライスごとに、補間を使用して現在の位置を進めます。つまり、p0からp1の間で補間し、p1に到達したら、p1とp2の間で補間し、最後にpNからp0に戻ります。

gluLookAtに類似したものでビューマトリックスを作成します。アイコーディネイトは現在の位置であり、ルックアットはパスに沿った次の位置であり、上(0、0、1)です。そのため、カメラは次に飛んでいる場所を向いており、Zは空を向いています。

しかし今、私は向きを変えながら「バンク」したいと思っています。つまり、アップベクトルは必ずしも直接真っ直ぐではなく、回転率に基づいて変化します。現在の方向と最後の方向がわかっているので、バンクをある程度インクリメントまたはデクリメントできます。内積は回転角度を教えてくれ、外積は左か右かを教えてくれます。バンク角を維持し、-/ + 70度の範囲内に維持して、適切にインクリメントまたはデクリメントすることができました。

これは正しいアプローチだと思いますが、そうでないことを見つけるために長い時間をかけて実装することができました。

私は正しい方向に進んでいますか?私がやろうとしていることを示すサンプルはありますか?

4

3 に答える 3

2

通常の状態では滑らかな飛行機が飛んでいるように見えるので、それほど多くは必要ありません...アプローチはほぼ正しく、完全に自然に見えます。必要なのは、連続する 3 つの点 A、B、C: の間の外積だけですcross = cross(A-B, C-B)。クロスは、「前方」ベクトルを中心に平面を回転させるために必要なベクトルです。当然、平面のアップ ベクトルは (-重力) 通常は (0,0,1) であり、点 B の前方ベクトルは CB です (補間が必要ない場合)。 ) 今、「サイド」ベクトルはside = normalized(cross(forward, up))、バンキングを使用する場所です:side = side + cross*planeCorrectionParameterそしてup = cross(normalized(side), normalized(forward)). "planeCorrectionParameter" は、操作する必要があるパラメーターです。実際には、翼と船体の寸法、空気密度、重力、速度、質量などのパラメーターの組み合わせを表します...

上記の一部のクロス操作では、パラメーターの順序を入れ替える必要がある場合があることに注意してください (cross(a,b) は cross(b,a) にする必要があります)。

于 2012-11-23T08:52:34.103 に答える
0

位置と回転がスプラインの曲率のみに依存する場合、最も簡単な方法は3Dスプラインの数値微分です(垂直成分用と水平成分用の2つの導関数があります)。UPとサイドは接線の法線になります。

于 2012-11-22T15:06:21.917 に答える
0

あなたのアプローチは正しいように聞こえますが、不自然に見えます。たとえば、sin 関数のように見えるパスを考えてみましょう。飛行機は、実際には右に進んでいるときに、左に「進んでいる」可能性があります。

あなたの問題に対する2つの解決策を挙げることができます。まず、スプラインの導関数を取得できます。あなたのスプラインはf(t)point を返す関数であると仮定しています(x, y, z)。パラメトリック カーブの導関数は、回転の中心を指すベクトルです。つまり、円形パスの中心を指します。

上記の方法で注意すべき点がいくつかあります。直線の導関数は0であり、ベクトルも になる0ため、アップ ベクトルを手動で修正する必要があります。また、逆さまにならないように、このベクトルを修正することもできます。

それは機能し、あなたの方法よりも見栄えがします。ただし、一部の曲線では不自然に見えます。私が言及できる最良の方法は、 Slerpなどのクォータニオン補間です。曲線の各ポイントには、「右」ベクトル (平面の右を指すベクトル) もあります。曲線とこのベクトルから、この時点でアップ ベクトルを計算できます。次に、クォータニオン補間を使用して、カーブに沿ってアップ ベクトルを補間します。

于 2012-11-22T14:50:38.470 に答える