5

「ランプ」と+1の高さのタイルがある場合に、マウスの下に正しい「アクティブ」タイルを取得する方法を理解しようとしています(下の図を参照)。


アイソメ画像の例

私の世界がフラットなときは、すべてが問題なく機能します。高さ +1 のタイルを追加し、ランプを +0 に戻しても、画面 -> マップ ルーチンはすべてが「フラット」であるかのように見えます。

上の図で、緑の「ランプ」は、レンダリングしてマウス -> マップを計算したい実際のタイルですが、「下」に表示されている青いタイルは、計算される領域です。したがって、マウスを濃い緑色の領域のいずれかに移動すると、別のタイルにいると見なされます。

これが私のマップレンダリングです(非常に単純です)

canvas.width = canvas.width; // cheap clear in firefox 3.6, does not work in other browsers
for(i=0;i<map_y;i++){
    for(j=0;j<map_x;j++){
        var xpos = (i-j)*tile_h + current_x;
        var ypos = (i+j)*tile_h/2+ current_y;

      context.beginPath();
      context.moveTo(xpos, ypos+(tile_h/2));
      context.lineTo(xpos+(tile_w/2), ypos);
      context.lineTo(xpos+(tile_w), ypos+(tile_h/2));
      context.lineTo(xpos+(tile_w/2), ypos+(tile_h));
      context.fill();

    }
}    

そして、ここに私のマウス - >マップルーチンがあります:

ymouse=( (2*(ev.pageY-canvas.offsetTop-current_y)-ev.pageX+canvas.offsetLeft+current_x)/2 );
xmouse=( ev.pageX+ymouse-current_x-(tile_w/2)-canvas.offsetLeft );
ymouse=Math.round(ymouse/tile_h);
xmouse=Math.round(xmouse/(tile_w/2));

current_tile=[xmouse,ymouse];

単純な画面 -> マップ ルーチンではなく、最初からやり直して、ワールド ベースのマップ システムを実装する必要があると感じています。

ありがとう。

4

2 に答える 2

2

写真のように、視野角が常に 45 度で、常に同じ方向からの場合、マウス -> マップ ルーチンは次のようなアルゴリズムを使用できます。

  1. 現在行っているようにタイルのi、jを計算します(xmouse、ymouseの最終値)
  2. i、jでタイルの高さと角度を調べる
  3. 高さと角度が与えられた場合、このタイルはピッキング レイと交差しますか? その場合、lasti、lastj = i、j を設定します。
  4. i,j を視聴者に向かって斜めに 1 段階インクリメント/デクリメントする
  5. 私たちは地図の端から落ちましたか?もしそうなら、lasti、lastj を返します。それ以外の場合は 2 に戻ります。

タイルの最大高さによっては、マップの端まで行くのではなく、2 つのタイルだけをチェックする必要がある場合があります。

3 はトリッキーな部分であり、ワールド ジオメトリに依存します。いくつかの三角形を描くと、それを理解できるはずです。または、関数intersect_quadrilateral_ray() hereを調べてみてください。

于 2010-09-14T22:51:50.973 に答える
2

あなたの仮定は正しいです。ワールド ジオメトリに対して "選択" するには、ルーチンで (基本レベルのタイル構成だけでなく) ワールドを認識している必要があります。つまり、(現在のアルゴリズムによって) 現在選択されているタイルの近くのタイルの高さの概念がなければ、隣接するタイル (または許容される高さによってはさらに離れたタイル) を選択する必要があるかどうかを判断する方法がありません。ピッキングレイに迎撃。

ピッキング レイの最終的なポイントを既に取得しています。残っているのは、ワールド空間でレイの残りを定義し、そのレイとワールド ジオメトリとの交差をチェックすることです。

于 2010-09-13T16:41:31.717 に答える