7

ご挨拶、

六角形のタイル マップの 3D バリアントを使用するゲーム プロジェクトに取り組んでいます。タイルは実際にはヘックスではなく立方体ですが、ヘックスのように配置されます (2D から 3D に外挿するために正方形を立方体に変えることができますが、ヘックスの 3D バージョンがないため)。詳細な説明ではなく、4x4x4 マップの例を次に示します。

(任意のタイル (緑) とそれに隣接するタイル (黄色) を強調表示して、全体がどのように機能するかを説明していますが、隣接機能は問題ではなく、既に解決されています。)

タイルを表す構造体型があり、マップはタイルの 3D 配列として表されます (Mapいくつかのユーティリティ メソッドを追加するためにクラスにラップされますが、あまり関係ありません)。各タイルは完全な立方体の空間を表すと想定されており、それらはすべてまったく同じサイズです。また、隣接する「行」間のオフセットは、タイルのちょうど半分のサイズです。

コンテキストはこれで十分です。私の質問は次のとおりです。
と の 2 点の座標が与えられた場合、Aとの間のB直線が交差するタイル (または、それらの座標) のリストを生成するにはどうすればよいですか?AB

これは後で、見通し線や充電パスの合法性などを判断するなど、さまざまな目的に使用されます。

ところで、これは役に立つかもしれません: 私のマップは (0,0,0) を参照位置として使用します。((y+z) mod 2) * tileSize/2.0マップの「ギザギザ」は、各タイルを「正常な」デカルト座標系での位置から右にオフセットすることとして定義できます。ギザギザでない行の場合は 0 になります。が 1の行の場合(y+z) mod 2、0.5 タイルが得られます。

私は、.Net Framework 4.0 をターゲットとする C#4 に取り組んでいます。しかし、特定のコードは本当に必要ありません。奇妙な幾何学/数学の問題を解決するためのアルゴリズムだけです。私はこれを無駄に解決するために数日間試みてきました。そして、「視覚化」するために紙に全体を描こうとしても役に立ちませんでした:( .

ご回答ありがとうございます。

4

2 に答える 2

3

賢い SOer の 1 人が現れるまで、これが私のばかげた解決策です。説明しやすいように2Dで説明しますが、3Dに一般化するのは簡単です。セル インデックス スペースでこれを完全に処理しようとする試みは、失敗する運命にあると思います (ただし、それが私の考えであることは認めますが、間違っていることが証明されることを楽しみにしています)。

したがって、デカルト座標からセル インデックスにマップする関数を定義する必要があります。少しトリッキーな場合でも、これは簡単です。まず、point(0,0)が左下隅cell(0,0)か中央か、それとも他の点かを決定します。説明がわかりやすいので、左下にします。any がpoint(x,floor(y)==0)にマップされていることを確認しcell(floor(x),0)ます。実際、 anypoint(x,even(floor(y)))は にマップされcell(floor(x),floor(y))ます。

evenここで、引数が偶数の場合に True を返すブール関数を発明します。次に使用しますodd: 任意の点point(x,odd(floor(y))が にマップされcell(floor(x-0.5),floor(y))ます。

これで、視線を決定するためのレシピの基本ができました。

cell(m,n)また、デカルト空間のポイントにマップする関数も必要です。原点がどこにあるかを決定したら、それは簡単なはずです。

さて、私がいくつかのブラケットを置き忘れていない限り、あなたは進んでいると思います. 次のことを行う必要があります。

  • cell(0,0)あなたの位置を決定しますpoint(0,0)。それに応じて関数を調整します。
  • セル境界に沿ったポイントがどこにあるかを決定します。と
  • これを 3 次元に一般化します。

競技場のサイズに応じて、セル境界のデカルト座標をルックアップ テーブル (または他のデータ構造) に格納できます。これにより、処理速度が向上する可能性があります。

于 2010-04-17T15:41:40.053 に答える
1

問題を別の方法で見ると、複雑な計算をすべて回避できる可能性があります。

最初の軸に沿ってブロックサイズの半分だけブロックを (交互に) シフトしていることがわかります。この軸に沿ってブロックを分割すると、上記の例は (シフトを使用して) 通常の積み上げブロックを持つ (9x4x4) 単純なデカルト座標系になります。レイトレーシングの実行がはるかに簡単になり、エラーが発生しにくくなりました。

于 2010-04-18T19:19:54.187 に答える