超軽量経路探索 for unity

14
自自自自自自自自自 自自自自自自自自自

Upload: tomioka-yuusei

Post on 20-Mar-2017

981 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: 超軽量経路探索 for Unity

自作三次元経路探索アルゴリズムのお話

Page 2: 超軽量経路探索 for Unity

経路探索アルゴリズム例

• A*( エースター )–各点 ( ノード )を評価し最短経路を導く–障害物を避ける経路を必ず見つける–処理が重く評価を行う指標が必要

• 幅優先探索–始点から近い順に各点を辿る–障害物を避ける経路を必ず見つける–全ての経路を探索するため計算量が莫大

Page 3: 超軽量経路探索 for Unity

経路探索の問題点

計算量のせいで処理が重い!–三次元となるとなおさら–重くて複数同時に処理を回せない

理由は?

「計算対象 (ノード )」が多すぎるのではないか

Page 4: 超軽量経路探索 for Unity

解決策 (for Unity)

• Bounds(バウンス )を用いる– AABB(軸平行境界ボックス )–「バウンディングボックス」ともいう–オブジェクトを囲んでいる (下画像の紫部 )

目的:計算対象を減らす

Page 5: 超軽量経路探索 for Unity

解決策 (for Unity)

• Raycast(レイキャスト )を用いる–不可視の光線を飛ばし衝突判定を行う– Debug.DrawRay(引数色々 )で描画可能–「 SphereCast( スフィアキャスト )」も存在する

目的:計算対象を減らす

Page 6: 超軽量経路探索 for Unity

アルゴリズム

1. 自座標から目標座標へ Rayを飛ばす目的:計算対象を減らす

自分障害物 目標

間に障害物がなければ直線的に移動

Ray

Page 7: 超軽量経路探索 for Unity

目標

アルゴリズム

2. 障害物が存在する際、障害物の Bouns情報を取得

目的:計算対象を減らす

自分

障害物

!))) 目標

自分

障害物

Bouds情報

Page 8: 超軽量経路探索 for Unity

アルゴリズム

3. Bouns情報からノードを 4つ作成目的:計算対象を減らす

障害物

1. 情報からボックスの角の座標を取得2. 中心から離れるベクトル方向へ座標

ずらし (障害物から離れさせる )3. 自分の現在高さへ調整

||計算対象が 4つのみで良くなった!

Page 9: 超軽量経路探索 for Unity

アルゴリズム

4. ノードを絞り込む目的:計算対象を減らす

障害物

• 自分から見えないもの• ほぼ正面にあるもの

除外条件

除外対象

(例 )

Page 10: 超軽量経路探索 for Unity

アルゴリズム

5. 距離の合計から最も短いルートを選択目的:計算対象を減らす

相障害物を跨ぐような経路は考慮しないよう配慮する

Page 11: 超軽量経路探索 for Unity

結果 1

Page 12: 超軽量経路探索 for Unity

結果 2

Page 13: 超軽量経路探索 for Unity

結果 3

Page 14: 超軽量経路探索 for Unity

メリット

• 動作がかなり軽い• 三次元的な経路探索が可能

デメリット

• 複雑な形状や穴が開いた障害物に対応不可• 障害物が隣り合っていると探索が上手くいかないときがある (再探索で対応可能 )• 上下の経路作成に未対応