2016-10-11 7 views
3

私はMetalでかなりの経験があり、Unityでかなりの経験があり、描画のためのメッシュ、バッファー、バッキングデータの設定に精通しています。あまりにも多くの数学/シェイダー側ではありません。私が苦労しているのは、無限のスクロール・ワールドを手に入れる方法です。だから、私が右に遠くにパンすると、私は左側を見て行くことができます。3次元マップ上での無限スクロール

このアプリケーションは、プレイヤーがいつでもどこでもスクロールしてラップさせるシームレスな領域になります。

私はドロー時にすべてを複製してオフセットしたくないのですが、それは恐ろしく非効率的です。私はマップをパニングするときにどこでラッピング/描画するかを得るために、いくつかのマジック行列の計算やシェーダを使用する方法を期待しています。私は何かのガイドや説明を探してきましたが、これをどうやって得るかについての説明はありましたが、何も出てこなかったのです。

私は古い(dos)ゲームをたくさん知っていますが、これは何とかしましたが、まだ可能ですか?業界がこのタイプのスクロール(バウンディングからエッジへのラッピング)から移行したように見える理由はありますか?

答えて

3

私はsimple exampleを探しています(私は思っています)。

MTLRenderCommandEncoderdrawPrimitives(type:vertexStart:vertexCount:instanceCount:)メソッドを使用して、繰り返しグリッドにマップを描画するという基本的な考え方です。インスタンスカウントとして、描画したい同一のマップの数を渡したい場合は、終了する場所を見ないために必要な限り拡大します。私の例では、単純な5x5グリッドを使用しました。

は、ユーザーがマップの端を見ていないために、我々はつもり自分の位置を法1を計算している(または、あなたのマップがあるどんなサイズ):

func didDrag(dx: CGFloat, dy: CGFloat) { 
    // Move user position on drag, adding 1 to not get below 0 
    x += Float(dx) * draggingSpeed + 1 
    z += Float(dy) * draggingSpeed + 1 

    x.formTruncatingRemainder(dividingBy: 1) 
    z.formTruncatingRemainder(dividingBy: 1) 
} 

これは、それがどのように見えるかです:

+0

これはきれいです。私の答えはおそらくコメントだったはずです。私はそれを削除した。これは素晴らしい。 –

+0

これは私が後にしたものです。すばらしい例をありがとう、今コードを試して理解してください。とてもかっこいい。ありがとう – utahwithak

0

私が実際に実装したものをフォローアップします。まず、高度、地形タイプ、すべてのジャズのx、yポイントの配列を基本的に持っています。いくつかの簡単な%と加算/減算を使用して、点の周りのノードを三角形を生成することは自明です

私は最初の表示点と最後の表示点を計算し、それらの点の間に表示される三角形のグループを計算します。最初/最後の点は折り返しを考慮して、無限の折り返しの世界を持つことはかなり簡単です。各グループについて、そのグループに属する均一な行列を介して変換オフセットが渡され、そのセクションが所属すべき位置に配置される。

renderEncoder.setVertexBytes(&uniform, length:..., offset:...)