2つのコーナーがある斜めの見通し線


9

現在、私は視線にBresenhamのラインアルゴリズムを使用しています。問題は、プレイヤーが壁をのぞくことができるエッジケースを見つけたことです。プレイヤーが壁の2つの隅の間を、反対側に特定の角度でギャップがあるように見たときに発生します。

見通し線エッジケース

結果として、2つの壁の間のタイルに無効のマークが付けられます。

望ましい結果

これを解決するためにブレセンハムのラインアルゴリズムを修正する最も速い方法は何ですか?良い解決策がない場合、より適したアルゴリズムはありますか?どんなアイデアでも大歓迎です。ソリューションは3Dもサポートできる必要があることに注意してください。

編集:私の簡単な解決策は、線のx座標とy座標が変化したときに両方の角が閉じているかどうかを確認することでした。完成した製品の実際のソースコードとインタラクティブなデモについては、http://ashblue.github.io/javascript-pathfinding/を参照してください。


2
開始点と終了点を切り替えると違いはありますか?おそらく、両方の計算で遮るもののない視線が返される場合は、結果を受け入れるだけかもしれません。また、LOGBasinでLOSの記事が参考になるかもしれません。
タラドール2013年

1
いずれにせよ、4-5の対角線にある2つの黒いブロックはそもそも壁に接続されていません。これは、暗黙的に対角線の移動を許可しているためです。2-3や4-5のように純粋に対角線を描くのではなく、対角線を四角にして隣接する壁にするか、ラインウォーカーを対角線の動きから四角にする必要があります。
Patrick Hughes

フリップするのは良い考えのように思えましたが、問題は解決しませんでした。私が考えられる唯一のことは、2つのコーナーの1つが空であるかどうかをチェックして確認することです。高価なようですが。
アッシュブルー

5
「高価に思える」というのは、何かを試さない理由としては十分ではありません。「高すぎる」とは、一般的に、何かが遅すぎることを証明できると仮定した場合です。
Mokosha 2013年

3
必要なアルゴリズムの変更は、XとYの両方が同じステップで変更されている場合、最初にXを変更してからYを変更すると、対角成分が完全に削除されることです。
Patrick Hughes

回答:


7

Eric Lippertが、C#で長方形の平面グリッドにシャドウキャスティングを使用して見通し線を生成する優れたシリーズを執筆しました。

他の問題の中でも、エリックはさまざまな結果をもたらす見通し線要件について回答する必要があるさまざまな質問を扱い、いくつかの異なる結果の例を示しました。記事の1つは、彼のアルゴリズムの初期バージョンで発生した「角を曲がる」状況を詳しく扱います。

ここでエリックのアルゴリズムを六角形グリッドに適合させましたで、広い可視半径(> 60 hex)を持つ大きな六角形のグリッド(> 400 x 700)でうまく使用しました。この実装では、単一のi7 CPUを使用して、完全な視野を計算して点滅させることができます。これは確かに、私がそれを使用することを期待するあらゆる用途に対して十分に高速です。

更新 -高度付きの見通し:
上記にリンクされている六角グリッドの実装は、障害物だけでなく、高度付きの見通しを計算します。ドキュメンテーションノートでは、標高計算に関して行う必要がある追加の決定についても説明しています。ターゲットの高さと観測者の高さです。デフォルトの選択では両方を等しくすることで対称的な視野を作成しますが、地面から地面までと観測者の目から地面までを選択することもできます。(コードはMITライセンスの下のオープンソースです)


私は本当にシャドウキャスティングを掘っていますが、問題が発生しました。アルゴリズムをz軸で操作するためのスケーリングに関する情報を見つけるのに問題があります。申し訳ありませんが、3Dで動作させるための推奨リソースはありますか?
アッシュブルー

@AshBlue:上記の補遺を参照
Pieter Geerkens

私はあなたのコードベースを見ています。それは素晴らしいものを持っていますが、ヘクスに適応したブレゼンハムのような線描画アルゴリズムを見つけられないようです。あなたはLOSでそれをしますか?
MLProgrammer-CiM 2013年

@EfEs:FieldOfViewは返されるオブジェクトです。ShadowCastingFov * .csは、影を落として視野を生成します。コードについて特定の質問がある場合は、サイトの[ディスカッション]セクションで質問することをお勧めします。より一般的な質問ここで答えさせていただきます。
Pieter Geerkens 2013年

あなたがここで問題が見つけることができます@PieterGeerkens gamedev.stackexchange.com/questions/57087/...
MLProgrammer-CIM

1

LOS計算で、コーナーギャップを埋める別の「高解像度」グリッドがある場合はどうでしょうか。私はこのようなことを考えていました:

ここに画像の説明を入力してください

左は4つの正方形の元のブロックセクションです。

右側は「高解像度」バージョンです。元の各正方形が4分割され、コーナーの1つが塗りつぶされていることがわかります。これを生成するアルゴリズムをオフハンドで行うことはわかりませんが、事前に計算できます。現在のマップから。

これは、座標空間が4倍になることを意味しますが、それが重大なパフォーマンスの問題になるとは思いません。


高い方の解像度が元の解像度とまったく同じになることを確認してください。グリッドを小さなグリッドに分割すると、グリッドが小さくても同じ視覚的表現が得られます。それぞれの正方形は、同じスポットで4つの小さな正方形になります。
MichaelHouse

@ Byte56正解、私はそれを分割した後に追加のロジックを適用して、そのコピーに余分なブロックを追加することを意味しました。そのためのロジックは、読者に残された課題です。
Davy8 2013年

オリジナルをぼかして、高解像度グリッドを簡単に生成できます。次に、たとえば0.5高解像度のセルが満たされるかどうかのしきい値を定義します。したがって、高解像度グリッドを使用することは、私にとっては非常にハックに感じられます。
danijar 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.