FindShortestPath SOP

勾配コストやターンコストを追加して、勾配を考慮した経路を探索する。

事前にメッシュをConvertline SOPでポリラインのグラフ構造に変換しておき、Wrangleノードをつないで、勾配コストとターンコストを設定する。

勾配コストの計算

//
// 勾配コストの計算
// RunOver:Primitives
//
float power = 2.0;  // この値を大きくするほど、大きい値がさらに大きくなる
float scale = 100;  // 他の要素(距離など)に対するスケール(重み)

int pts[] = primpoints(0, @primnum);
vector p0 = point(0, "P", pts[0]);
vector p1 = point(0, "P", pts[1]);
vector diff = normalize(p1 - p0);
vector h = normalize(set(diff.x, 0, diff.z));
float angle = acos(dot(h, diff)) / PI;

// 小数点以下なので100倍して値を大きくしている
angle = pow(angle*100, power);

f@slopeCost = angle * scale;

勾配コストはプリミティブ(ポリライン)に設定している。勾配の角度を設定し、powerの値で値にばらつき加減を加えている。Scale値は他のコスト要素(距離、ターンコスト)に対する重みづけ。

ターンコストの計算

//
// ターンコストの計算
// RunOver:Points
//
float scale = 1.0;
f@turnCost = 1 * scale;

ターンコストはポイントに設定する。中で行われている計算はよくわからない・・。ここでは一律に設定しているけど、勾配によって値を変えるなどをするといいのかも。

FindShortestPath SOPはこのように設定。

最短経路

急勾配を迂回した経路

タイトルとURLをコピーしました