1

少し前にこれを twitter に投稿しましたが、私のフォロワーの誰も数学/プログラミングの天才ではないように見えるので、ここでも運試しをします. 私のソリューションの一部が含まれている可能性があるこれを見つけたので、ここに来ました。

私が達成しようとしているものの写真を含む、次のpdfドキュメントで私の問題を説明しました。

さらに詳細を説明するために、12 面体の五角形 (12 個の五角形) を三角形 (5 個/五角形、合計 60 個の三角形) に分割し、これらの各三角形に関連する一連のデータ ポイントを収集しました。

アイデアは、個々の三角形ごとに地形メッシュを生成することです。そのためには、データを 32K x 32K の正方形 (idTech4 Megatexture) でフラットに表現する必要があります。

変換マトリックスについて漠然と聞いたことがありますが、適切に設定すると、すべてのデータポイントを通過させて適切な場所に表示させることができます。

私はこのソースコードをここで見ましたが、そこにポイントを出し入れする方法がわかりません。セットアップを行う方法は言うまでもなく、各ポイントを順番に提示して結果を取得する方法は言うまでもありません振り返る。

右後ろの隅にあるポイントを特定するのと同じくらい速くなりました。すべての 3D ポイントは、もともと緯度/経度のペアで保存されています。この方法で 3D ベクトルを取得します。

coord getcoord(point* p) 
{
    coord c;
    c.x=cos(p->lat*pi/180.l) * cos(p->lon*pi/180.l);
    c.y=cos(p->lat*pi/180.l) * sin(p->lon*pi/180.l);
    c.z=sin(p->lat*pi/180.l);
    return c;
};

私の考えでは、三角形の中心を見つけることができ、球の中心から三角形の中央までのベクトルが 90N に移動するように角度をオフセットする方法を発見できれば、ポイントはすでに適切な平面にあると考えられます。それらをすべて同じ角度に沿って回転させました。次に、それらをすべて 3D に変換し、y から半径を差し引くと、正しい y 位置にもなります。

あとは、回転、スケーリング、および最終位置への移動だけです。

三角形にはいくつかの種類の「中心」があります。私が必要とするのは、三角形の角から等距離にあるものだと思います (外心?)

しかし、問題全体へのより簡単なアプローチがあるかもしれないので、私が自分の研究を続けている間、おそらくあなたの何人かが私を正しい方向に向けるのを助けることができます.

いくつかのサンプル データが用意されているように見えます。これらの三角形のいくつかを obj ファイル形式で示します。

v 0.000000 0.000000 3396.000000
v 2061.582356 0.000000 2698.646733
v 637.063983 1960.681333 2698.646733
f 1 2 3

そして別:

v -938.631230 2888.810129 1518.737455
v 637.063983 1960.681333 2698.646733
v 1030.791271 3172.449325 637.064076
f 1 2 3

各ポイントが 0,0,0 から 3396 の距離にあることに気付くでしょう。「球上」と言いました。これは、球の中心から離れた面が、変換されたときに「上」になる必要がある面であることを意味します。広場。

理論的には、これらすべての三角形は実際には同じサイズである必要がありますが、それらを生成した数学の丸め誤差により、これが完全に正しいとは限りません。

私が間違っていなければ、ここに表示される最初のポイントが常に最も長い境界線の反対側にあることを確認するための対策を既に講じているため、左端隅に配置する必要があります (上記の 2 つのサンプルをテストすると、これが確認されますが、とにかく念のために測定しています)この点から離れた両方の脚も理論的には同じ長さである必要がありますが、丸め誤差がそれをわずかに相殺する可能性があります.

私が正しくやった場合、長い辺は 2 つの短い辺よりも 1,113587 倍長くなります。それらが同一であると仮定して、Excel でいくつかのゴール シークを行うと、この三角形を翻訳しただけであると仮定すると、最終的なポイントは次のようになると推測できます。

v 16384.000000 0.000000 16384.000000
v -16384.000000 0.000000 9916.165306
v 9916.165306 0.000000 -16384.000000
f 1 2 3

したがって、以下で説明するように、できれば 4x4 マトリックスを使用して、この変換を行うようにマトリックスをセットアップする必要があります。

4

1 に答える 1

1

変換行列を使用することをお勧めします。3D 変換マトリックスは、平行移動と回転 (場合によってはスケール) を記述する 4x4 データ構造です。マトリックスを取得したら、次のようにポイントを変換できます

 result.x = (tmp->pt.x * m->element[0][0]) + 
            (tmp->pt.y * m->element[1][0]) + 
            (tmp->pt.z * m->element[2][0]) + 
            m->element[3][0];

 result.y = (tmp->pt.x * m->element[0][1]) + 
            (tmp->pt.y * m->element[1][1]) + 
            (tmp->pt.z * m->element[2][1]) + 
            m->element[3][1];
 result.z = (tmp->pt.x * m->element[0][2]) + 
            (tmp->pt.y * m->element[1][2]) + 
            (tmp->pt.z * m->element[2][2]) + 
            m->element[3][2];
 int w = (tmp->pt.x * m->element[0][3]) + (tmp->pt.y * m->element[1][3])
      + (tmp->pt.z * m->element[2][3]) + m->element[3][3];
 if (w!=0 || w!=1)
 result.x/=w; result.y/=w; result.z/=w;

これにより、3D ポイント pt が行列 m によって変換されます。少し行列の計算をすると、原点を行列に対してベクトルとして乗算しているだけであることがわかります (そして、それが歪んだ行列の場合は少し正規化を行っています)。行列を乗算して複雑な変換を形成できるため、非常に便利です。

マトリックスの作成の詳細については、このリンクを読むことをお勧めします。 http://en.wikipedia.org/wiki/Transformation_matrix

于 2012-01-31T21:30:58.380 に答える