2016-10-01 8 views
0

私はthree.jsの限界について興味があります。次の質問は、主に挑戦として尋ねられます。なぜなら、私は実際に特定の知識/コードを実際に必要としているからではありません。three.jsを使って、地球儀を画面上の地図にどのように投影しますか?

Populousの世界のように、地球を表す球のジオメトリの周りにゲーム/シミュレーションワールドモデルがあるとします。ポリゴンとテクスチャの解像度は、グローブが普通のカメラの視点を満たすときに滑らかに見えるのに十分です。表面にはアニメーション化された巨視的な物体があります。

モデルからグローバルマップ投影までのすべてをリアルタイムで画面に投影することが課題です。プロジェクションの選択はあなたのものですが、シームレスで連続的でなければならず、ユーザがそれを回転させて、スクリーンの中心の惑星表面上の任意の点を置くことが可能でなければならない。 (視覚化のためだけに世界の代替モデルを維持する選択肢ではありません)

カメラの数などに制限はありませんが、パフォーマンスは「リアルタイム」、たとえば2 FPS以上である。

私は実行中のアプリケーションの形でayn proofを期待していませんが(それはすばらしいでしょうが)、どのように実行できるかについてのいくつかの説明があります。

私自身の最初のアイデアは、地図投影のあらゆるピクセル、地球のまわり、いくつかの種類の軌道制御(回転のみ)に添付されたグループオブジェクト内の多くのカメラを配置することです。私はオブジェクトの間引き操作の数が大きなパフォーマンス上の問題になることを期待しています。より洗練された(そしてより速い)ソリューションが存在しなければならないと確信しています。 :-)

+0

球からマップに再投影する必要がある場合は間違っていると思います。あなたが球上にオブジェクトを置いているときには、すでにマップ上の位置(緯度/経度など)を知っているので、そこからフラットマップを作成できます。 – mlkn

答えて

0

なぜ球状のカメラモデル(360°カメラと考える)を使用して球体の中心に置くのはなぜですか?したがって、このカメラは(物理的に可能な場合)すべての方向から中心に向かって球の周りを包み込むことになります。

このカメラは、(通常の投影行列ではなく)惑星表面の等角投影画像(または実際に球形メルカトル投影のような任意の他の投影画像)を生成します。

私が知る限り、頂点シェーダは任意の投影を実装でき、物理的に可能なカメラを表す必要はありません。すべての頂点に対して一貫したクリップスペース座標を生成するだけで済みます。フラグメントシェーダは、照明のために元の座標、法線などを操作する必要がありますが、それは達成可能でなければなりません。だから、頂点シェーダは(x,y,z) => (phi,theta,r)を計算するだけで済みます。

オクルージョンカリングは無効にする必要がありますが、iirc three.jsはそれを実行しません。

+0

お返事ありがとうございます。私は、この答えを理解するために、頂点シェーダについてのより基本的な知識が必要であることを認識しています。私はあなたの答えを受け入れることを検討しています。3Dグラフィックスを知っている誰かが提示した実用的なアプローチのように、一目瞭然です。あなたはこのアプローチについて自信を持っているのですか、それとも教育的に推測されていますか?これはリアルタイムで実行できますか?前に頂点シェーダーで奇妙な投影をしたことがありますか、または頂点シェーダーを使用してカスタムカメラを定義しましたか? –

+0

まあ、投影が実際には通常の投影行列のようなビューボリューム変換を説明していないという欠点が1つあります。これには、地図の左端と右端の両方で表される縫い目が地球上になければならないという1つの問題があります。この線を横切る三角形は、マップ全体の幅に広がり、最初に破棄する必要があります。しかし、それはおそらく何らかの形で世話をすることができるものです。実際に書いたものではありませんが、通常のレンダリングと比較してパフォーマンスに影響を与えることなく可能でなければなりません。 –

関連する問題