隣接するタイルの高さが異なるタイルマップ/地形の実装


10

アホイ!

タイルマップに関する情報、つまり、特定の種類のタイルマップの名前を探しています。

私はジェットコースターの大物や輸送の大物ゲームのシリーズで使用されている種類の実装に興味があり、ベクターフィールドの地形と高さマップの地形を調べてきましたが、それらが私が探しているものに適しているかどうかわかりません発展させる。

ほとんどの人がアイソメトリックタイルマップと呼んでいるので、適切な情報を見つけるのは大変でしたが、正射投影法を固定して3Dで何かを作成したいと考えています。タイルマップの基盤となるストレージはレンダリング方法とは関係がないことを理解していますが、古い学校のポケモン/ゼルダゲームのような2Dタイルマップを作成するつもりはありません。張り出した崖と傾斜した地形。

私は、Googleとstackoverflowでリソースを検索するための適切な用語を見つけようとしています。これは、どのパスに進むかを決定するのに役立ちます。

これまでのところ、VBOに格納され、ワイヤーフレームとしてレンダリングされた高さ/ yコンポーネントを使用せずに、基本的なタイルマップを具体化できました。これはこれまでは問題ないように見えますが、隣接するタイルに影響を与えずに1つの頂点を操作して崖やスロープを作成しようとすると問題が発生することを想定しています。

調査する必要がある特定のタイプの実装はありますか?ベクターフィールドの地形に関する情報がかなりの量を見つけたときにそれをクラックしたと思いましたが、これでも正しい結果が得られるかどうかはわかりません。

誰かが私にこれについていくつかの光を当てることができれば、助けは大歓迎です:)

更新

私が達成したいことについてさらに明確にするために画像を含めました:

2.5Dタイルマップ

傾斜(高さ)アイソメトリックタイルの作成方法から借用した画像

この画像は、生成したい地形のタイプを示していますが、「崖」やモデリングに関心のある張り出した地形タイプは含まれていません。しかし、それは私が考慮していなかった他のいくつかの質問を引き起こします。

  • 水などの「レイヤー」(画像の左上)は、水の下に見える地面を含めるためにどのように処理されますか?
  • 地球/泥がレンダリングされて世界が非平坦なエンティティとして表現されるように、マップの「エッジ」はどのように提供されますか?
  • この種の地形の基礎となるストレージを使用して、丘を転がるボールや坂を横切るプレーヤーの移動速度などの物理学をモデル化できますか?

地形の各タイルは8つの頂点でモデル化でき、4つの主要な頂点が実際のタイル自体をカバーし、残りの4つの頂点は各タイルの側面/壁をモデル化するために使用されるという考えがありました。この実装で私が目にする2つの問題は、a)世界地図のサイズが基本的に2倍になることと、b)すべてのタイルに「壁」が含まれるわけではないため、一部のタイルが使用されない冗長な頂点になることです。

各タイルを変形させたり、ゲームのプレイ中に地形を変更する機能を組み込んだ地形エディターを作成したいと思います。これ自体、次のような追加の質問が発生します。VBOを使用して、オンザフライで変更しながら地形を保存およびレンダリングできますか?また、隣接するタイルに影響を与えることなく頂点を変更できますか?

自分がやりたいことをどのようにして達成するのかを明確に考えずに問題を解決するためのコードを書くのを怠っているので、複雑すぎたり分析麻痺に陥ったりしているように見えます。

繰り返しますが、私は本当にこれで正しい方向への突き出しを探しています。マップエディターとゲームプレイの両方で3Dマップが変形する特定の種類のタイルマップ/地形の実装はありますか?いわば、自分でロールする必要がありますか?私はここで車輪を再発明しようとしているわけではありませんが、何を探しているのかわからないため、リソースを見つけるのに苦労しています。

誰かが情報、リソース、またはコードのスニペットを提供できる場合は、手を汚して、現在持っているフラットワイヤーフレーム以外のものの作成を開始したいと強く思っています。

読んでくれてありがとう!

回答:


2

私があなただったら、ボクセル、より具体的にはMinecraftタイプのキューブレンダリングを調べます。ハイトマップとは異なり、オーバーハング、洞窟、複数の床を持つ建物などを処理できます。

地形を整数の3D配列に格納します。ここで、数値は特定のタイプの地形にマッピングされます:0 =空気、1 =汚れ、2 =水など。次に、レンダリングするメッシュを作成するには、空でないボクセルごとに立方体の面を作成します。

このチュートリアルは、Ogre3Dを使用してC ++でこれを行う方法についての素晴らしい説明です。OpenGLでもう少し低レベルにする必要があると思います。

立方体を作成したら、エッジを滑らかにして、画像に表示されているような滑らかな地形を作成します。PolyVox(C ++でも)がこれを行うと思います。あなたは彼らのコードを見ることができます。基本的には、画像が2Dで表示するものを3Dで行うと思います。周囲の立方体の位置を平均化して、各頂点を配置する場所を把握します。

編集:

  • 水タイルが空であるかのように、水に隣接する立方体の面を生成し、水面を透明にレンダリングします。
  • 世界の外のボクセルが空であると考える場合、「エッジ」の面は通常の面と同じように生成できます。
  • 物理:レンダリングされたメッシュを静的オブジェクトとして物理エンジンに送ることができます。
  • マップエディター:メッシュ自体ではなく、基になるボクセルデータを編集する必要があります。(メッシュはデータをミラーリングする必要があるため、ボクセルを編集するとメッシュに変更が生じるはずです。)モデルに精通していない場合は、モデル、ビュー、コントローラー(MVC)を調べることをお勧めします。

他にご不明な点がございましたら、お気軽にコメントをお寄せください。gamedev.SEへようこそ!


これは非常に複雑な解決策であり、比較的単純な問題に対応できます。多くのゲームは、ボクセルの複雑さなしに、OPが求めていることを実行しています。
Sean Middleditch、

ボクセルは複雑になる可能性があることに同意します。これらのゲームにリンクしていただけませんか?彼らがどうやってそれをしたか聞いてみたいです。
Wackidev

ボクセルを使用するという考えをいじっていました。この実装は、すべてのキューブがユニットディメンションであることを意味しますか、それとも単一のキューブを押し出すことができますか?y平面に沿って「オーバーラップ」する可能性のある水や他のタイルを考慮に入れるには、世界をレイヤーに格納する必要があると思います。
CaptainRedmuff

はい、通常、ボクセルは単位サイズです。それらを押し出すことができると思いますが、それはそれをより複雑にするだけだと思います。レイヤーについて何を言っているのか理解できていません。可変の高さの水タイルについて言及していますか?
Wackidev

それらの線に沿った何か。私は、押し出された立方体である「床」を単純に定義することについてさらに考えていました。この立方体は、2つが交差する平面によって定義された上部にウォーターキューブを持ちます。多分私は物事を再び複雑にしています。ボクセルについてもう少し読んで、それが私をどこに導くか見てみましょう。
CaptainRedmuff

6

これ:http : //30.media.tumblr.com/tumblr_m06qv6OREt1r2qjpao1_500.pngは、少し前に作成したマップの例です。

マップとさまざまなタイプのタイルを表すXMLがありました。各タイプにはいくつかの属性があります。

  • 高さ
  • ポジション
  • マージタイプ:このタイルがどのような種類のマージを行うかALL(周囲のタイルにマージする必要がある場合)、EQUAL(同じタイプのタイルとのみマージする)、(マージしNONEない)。
  • マージの高さ:傾斜の最大の高さ(オーバーハングに適しています)。同じ高さまたは1の差のタイルとのみタイルをマージするとします。値は1になります。

次に、すべてのタイルを読み取り、シーンに作成します。まず、位置のみを考慮します。各タイルは隣接していることを認識する必要があったので、マップを2回実行する必要がありました。1回はすべてを作成するためで、もう1回は各頂点を正しい位置に移動するためです。

私のモデルは六角形ですが、概念は同じです。タイルを表すために立方体が必要です。次に、ベース頂点を最低レベルに移動し、立方体の周りの立方体で立方体の上部を「滑らか」にします。また、キューブの2つの側面がマージされているかどうかを確認して、キューブからその側面を削除することもできます(マージされていない場合は、おそらく崖か何かです)。

物理学については、あなたの目標に依存します。あなたがジェットコースターの大物みたいなことをしているなら、あなたは本当にそれらを必要としません。各タイル間のプレーヤーの高さを確認し、歩行速度を決定できます。単独で移動するオブジェクト(ボールなど)についても同じことができ、周りのタイル(または現在のタイルの角度)を確認して、方向/速度を決定できます。現実的な物理学(重力、摩擦など)が必要な場合は、物理エンジンを使用する必要があり、エンジンで立方体の3D表現を使用できます。

レイヤーも可能ですが、Minecraftのようなものが必要になります(最上位レイヤーのキューブをスムージングします)。水のレイヤーのみが必要な場合は、タイルに「水源」を配置し、コードの周囲の同じ高さ以下のすべてのスペースを埋めることができます(再帰的なソリューションはここにうまく適合します)。

テレインエディターもシンプルです。コードに十分な柔軟性がある場合は、単一のタイル(変更中のタイル)またはタイルのリスト(ブラシを使用している場合)に変換を適用できます。それらを選択して移動します)。同じコードを使用して、ゲームの地形を変更できます。はい、VBOの頂点を変更できます。他に影響を与えずに頂点を変更することもできます(そのようなコーディングにも依存します)。


+1これについてのご意見ありがとうございます。今まで考えていなかった「湧水」について、重ね着の良さをアピール。私はそれが可能だとわかっているので、その場でVBOを変更することを検討します:)
CaptainRedmuff
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.