2011-02-28 29 views
2

これはmath.stackexchange.comに適合するかもしれませんが、OpenGLでプログラミングしているので、ここでそれを尋ねます。OpenGLで超球面の表面を移動する

私は、世界が4-D超球(3球とも呼ばれる)の表面に閉じ込められている宇宙船のアイディアを持っていました。したがって、それを内部から見ると、それは3次元の世界のように見えますが、あらゆる方向にナビゲートすることで、私は3球の限られた量を決して残しません。

3つのシャープを「フラットな」3次元空間として表現するために、GLSLシェーダとして実装するのが非常に簡単な立体投影を使用します。入力ベクトルを1からw座標。

オブジェクトの頂点を表すには、x²+y²+z²+w²= 1となるような正規化された4dベクトルを使用しています。

解決する最初の問題は回転でした。しかし、私はすぐに、通常の3d回転行列では、3次元投影で見る人の周りを回転させるのに十分であることを理解しました。これは、z軸の周りの球を回転させることは、立体投影法)。

次に、w軸に沿った回転は、3d投影内での翻訳と同等であることを理解しました(通常の3次元変換を「フラット」空間として変換するのではなく)軸回転行列(x '、y')=(x * cos a - y * sin a、x * sin a + y * cos a)を中心に、

これはこれまでのところ私が得たところであり、視聴者が投影から直面している位置に基づいて、どのように前進するかを理解できませんでした。私は逆変換を適用して、視聴者が超球座標系で直面している正規化された4-Dベクトル(Fと呼ばれます)を導き出すことができますが、4x4行列を使用してその方向にナビゲートする方法はわかりません)。すべての頂点Vについて、V '= normalize(d * F + V)を実行します。ここで、dは前方に移動した距離です(ちょっと奇妙な単位では正確にはできません)。この方法は、dの小さな値に対してのみ機能し、dと角度の変化との間には直接の相関はない。

したがって、問題は次のとおりです。4次元超球面の表面に(4x4行列変換を使用して)前進する方法は?

+0

Hypersphereの数学的記述の参考資料はありますか? – ja72

+0

私が言ったように、それはちょうどx2 + y2 + z2 + w2 = 1 – lvella

答えて

1

私はmath.stackexchange.comで同じ質問をしました。なぜなら、質問はあまりにも数学的な関係であり、おそらくもっと良い答えが得られるからです。あなたが実際に使った元の答えに興味があるなら、hereを見てください。

4Dに入っているので、回転に垂直なベクトルは1つではありませんが、実際には垂直ベクトルの平面全体が混乱しています。

また、OpenGLでは、私はいつも私が4D投影原点(0,0,0、-1)にあると仮定できるので、与えられた解の計算を簡略化できることを理解しました。 0,0、-1,0)、zとwに沿って与えられた角度を変換し、それを前のフレームから既に蓄積されたGL_MODELVIEW_MATRIXに掛けます。だからMODELVIEW <= MODELVIEW x Mの代わりにMODELVIEW <= M x MODELVIEWをしました。私が単にglMultMatrix(M)と呼んだ場合、私はそれを得るでしょう。

1

4空間で操作しているので、おそらく5x5行列が必要です。均質座標の考え方は、線形演算子を適用して加算演算を表すための追加の次元を導入することです。

あなたのアイデアは本当に好きですが、好奇心から外れています:サイクリック3スペース、つまり指定された値でラップ座標を定義するだけではいかがですか?ジオメトリシェーダを使用すると、ラップアラウンドしているプリミティブの頂点を複製できます(クリップする必要があり、クリップされた頂点を導入したヘルパー頂点とともにスペースの反対側に移動する必要があります)。これは一種のミラー効果のホールにつながります。そのため、何らかの水平線を導入する必要もあります。

+0

です。効果は同じではありません。サイクリックラッピング3次元空間を使用すると、1本の軸に沿って見ると、水平線であなた自身の背中を見ることができ、歩く角度に応じて、1回の往復の後に同じ位置に入らないことがあります。 3球の効果は、よくわかるようにコード化する必要があります。 – lvella

+0

@Ivella、実際には、サイクリック座標は、あなたが探しているのと同じような効果をもたらすでしょう。任意の次元の球上をナビゲートする際の主な特徴の1つは、どの方向に回しても、常に同じ距離の出発点に戻ることができることです。周期的な座標では、対角線の方向は軸の方向をまっすぐ上回るよりも長くなります。 –

+0

私は単なる回転のために5x5行列を必要としません、4x4で十分です、同じ方法3x3行列は3D回転のために十分です。私は4D Euclidian空間で翻訳することができません。なぜなら、それは私を超球体から引き抜くので、私は5x5行列を必要としません。 – lvella

6

私は以前、この分野でいくつかの論文を書いていました。この1つ(Interactive Visualization Methods For Four Dimensions)はあなたの特定の問題に最も密接に当てはまりますが、これを引用した他の文書も役立ちます。その特定のアプリケーションでは、ビューアではなく4Dで観測されるオブジェクトを回転させていましたが、数学は同等です。4-D 超球の表面にある(4×4の変換行列を使用して) 前方を移動する方法 :この特定の質問について

したがって問題はありますか?あなたは超球の表面上の周りに移動している場合は

、あなたは wをに翻訳されていません。実際には、大きな半径の円の周りを球形のジオメトリで移動する必要があります。つまり、あなたの参照フレームに適切な軸を構築できれば、あなたがいる場所と行く場所の間にspherically interpolateを入れることができます。

たとえば、このようなslerpのために使用できる1つの構造は、まっすぐ前方を指す単位ベクトル(Wikipediaの式ではp_1)を使用することです。あなたの頭(p_0)とあなたの右の耳から指すベクトル(右手の座標系を作るため)。

球面上の速度を線形ではなく角速度で追跡する場合は、ウィキペディアでt(経過時間)の値を差し込んで新しい角度位置を見つけることができます。

この式は、頂点のコンポーネント数に制限がないことに注意してください。p。球形補間は、どのジオメトリでも機能します。

EDIT(コメントでの質問への対応):私は時間をかけて2つのベクトル間 回転を補間したくないので

Slerpはここの場合、 ではないように思われます。 代わりに、各時間ステップで、私は の方角にあるすべての頂点を、 の方向に移動して、視聴者がその時点で移動していることを尋ねます 瞬間です。したがって、私は位置(0、0、 0,1)にあり、次のフレームに(sqrt(2)/ 2, sqrt(2)/ 2,0,0)になりたい。

このように考える:(任意の次元の)球面上のあなたの位置は、あなたを中心から面に置き換えるベクトルです。特定の角速度で動き回っていると、p0とt0、p1の時刻t1などになります。Slerpは特定の時刻にそれらの位置を計算する便利な方法です。

同様に、視線は変位ベクトルに対して直角のベクトルです。視線は時刻t0でv0であり、時刻t1でv1であり、以下同様である。 Slerpは、そのベクトルの計算にも便利です。私はすべての頂点 はそれ の逆数を乗じたでしょうか?、特派 変換行列を構築することができますどのように

これらの2つのベクトルを使用すると、orthogonalizationは新しい参照フレームを持っています。元の参照フレームからこの新しいフレームへのsingle quaternion that defines the rotationがあります。それはあなたが探しているものです。

あなたの世界を2次元画面にレンダリングするには、まず4Dから3Dにレンダリングする必要があります。 OpenGL(これは意外にも)はこれを直接サポートしていません。

理由を確認するには、perspective projection matrixをご覧ください。これは、3D空間内の均質な点をレンダリングしていることを前提としています.x、y、zは最初の3つのコンポーネントにあり、w(スケーリングファクタ)は4番目にあります。 w = 0はベクトルを示し、w =その他のものは点を示します。 w = 1以外のものは正規化されていない点です。

したがって、(0、0、0、0)の4D原点に点を描画する方法はありません。

ただし、行列の構成からわかるように、4Dから3Dへの投影行列を作ることは難しくありません。 OpenGLの行列パイプラインとは独立してジオメトリセットに最初に適用します。次に、OpenGLの標準マトリックスを3D用にスクリーンに使用することができます。

+0

私は表面上を移動しているならwで翻訳していないことを知っていますが、回転中のw座標を変化させると、投影されたものがビューアに表示され、世界が翻訳されました。 – lvella

+0

slerpについて、私はどのように変換マトリックスにすることができます理解できません。 ここではSlerpは当てはまりません.2つのベクトル間の回転を時間の経過とともに内挿したくないためです。代わりに、各時間ステップで、*すべての*頂点を、視聴者がその瞬間に移動している反対方向に移動したいです。 したがって、私は位置(0、0、0、1)にあり、次のフレームで(sqrt(2)/ 2、sqrt(2)/ 2、0、0)になりたいです。どうやって対応する変換行列を作ることができるのですか?すべての頂点に逆行列を掛けます。 – lvella

関連する問題