あなたはすでにあなた自身の質問に答えているようです。A *が最善のアプローチです。もちろん、山を避けるために高さ情報を使用するなど、あなたが説明する方法で使用できます。自分の世界の表面にあるグリッドに関する情報にアクセスできる限り、A *ヒューリスティックで使用できない理由はありません。
最後に、質問の最後のパス検索とパス追跡を混同しています。パスファインディングは、ヒューリスティックとして追加しない限り、重力を気にしません。惑星の表面上にいるので、重力は表面全体で本質的に同じになります。多くのゲームには動きと重力があります。できない理由はありません。
基本的に、赤から青へのマッピングを行い、球体でも立方体でも同じになるようにします。
A *は現在のノードに頻繁に隣接ノードを取得しているため、隣接ノードを取得するための一連の関数を簡単に作成できます。たとえば、getXPlus()
、getXMinus()
、getZPlus()
とのようにします。これらの関数は現在のノードを取得し、関数名で指定された方向にノードを返します。
ほとんどの場合、これらの関数は値をインクリメントするだけで実行できますが、エッジでは変更されます。
キューブの表面を2D座標系にマップする必要があります。ただし、各グリッド空間に一意のX、Y座標を指定するだけで、これらを並べる必要はありません。
エッジ上で、隣接するグリッドスペースを取得するとき、必ずしも座標をインクリメントするだけではありません。どの面に移動しているかを見つけ、その面の座標に切り替える必要があります。
たとえば、ここでXPlus座標を取得すると、X座標とY座標の両方が変更されます。これは、新しいフェースの新しいグリッドスペースに移動しているためです。緑の線は、2つの面の間のエッジを表します。
現在、これらは単なるグローバル座標であるため、現在の立方体の面を表す3次元の内部ローカル座標系を使用する方が簡単かもしれません。
いずれにしても、立方体の面の各グリッド空間に一意の座標が必要です。それらの間の移動は、座標系の実装方法によって異なります。その座標が球体の表面にどこにマッピングされるかを知る必要があります。
このすべては最終的には抽象化され、あなたもそれを知らないはずです。