空間分割
Amusement Creators
ライトニングトーク資料
C+C (HALTMAN)
自己紹介
●

HN :HALTMAN(Twitter:@c_plus_c)

●

所属 :筑波大学 情報学群 情報メディア創成学類 3年
(元高専生)

●

主な環境 :
C/C++/C#/Java/Python
Blender/OpenGL/MonoGame/DXライブラリ

●

主な産廃 :アクションゲーム、音ゲーム、Textエディタ

●

Gentoo Linuxへたれ勢

●

こいしちゃんはかわいい(自明)
主にグラフィックスプログラミング向けの
テーマです
空間分割とは…-1/2
処理の対象となる空間を複数の小空間(グリッド)に分
割すること。
例:等間隔グリッド(ユニフォームグリッド)による空間分割
空間分割とは…-2/2
調査対象空間内に位置するオブジェクトは
いずれかの小空間に属する
この敵は緑枠小空間内に属する
この自機は赤枠小空間内に属する
何ができるの?

処理を行う範囲を限定することができる。
→計算量を減らせる。
自機と敵弾の当たり判定の例-1/2
空間分割適用なし

空間上にある敵弾全てについ
て、衝突判定する必要がある。
→明らかに自機から離れてい
る敵弾が多いので無駄
自機と敵弾の当たり判定の例-2/2
空間分割適用あり

赤枠の小空間内に属する敵弾
のみと衝突判定すればいい。
→計算量は格段に減る
使いどころ
●

オブジェクトの処理の計算量軽減
→特定の領域のみに処理を限定できる。

●

レイトレーシング法による
3DCGレンダリングの高速化
→光源や反射によって生ずる光線(レイ)が通過する小空間の
み照射判定を行えばよくなる。
ユニフォームグリッド分割の問題
●

複数のグリッドをまたぐオブジェクトを正常に処理できない
赤枠内に示した7つのグリッド
をまたいでしまっている

これらはグリッド内に収まって
いるので問題ないが…
木構造に基づいた空間分割
●

4分木←このLTで取り上げます

●

8分木←このLTで取り上げます

●

BSP木

●

kd木
4分木を用いた空間分割

ルート空間

…
分解能レベル1
分解能レベル2
必要な分解能まで分割していく‥
所属先の空間を決定する手順
①調査対象の空間をルート空間にセットする。
②今調べている空間を4分割したいずれの小空間に調査オブジェク
トが収まるを否かを調べる。
③
収まる場合:
 分割後の4つの中で調査オブジェクトが収まった小空間に調査対
象を移し、②に戻る。
収まらない場合:
 分割前の空間に所属するとして、調査終了。
所属の例

…
衝突判定の調べ方

主に調べる必要があるのは2つ
①調査対象のオブジェクトが属するノードの親を始点に親を
たどっていき、ルートまで調べる。
②調査対象のオブジェクトが属するノードの下方につながっ
ているノードを葉まで調べる。
衝突判定の調査例-1/2
調査範囲

調査対象オブジェクトの
所属ノード

…
…
…

…

…
衝突判定の調査例-2/2
調査範囲

調査対象オブジェクトの
所属ノード

…
…
…

…

…

…
8分木
●

4分木を3次元空間用に拡張したもの
緩い4(8)分木-1/2
●
●

木の上位に属するオブジェクトが多いほど、処理時間は長くなる。
オブジェクトを所属させるにあたって小空間の半分のはみ出しを
許容する4分木もしくは8分木。
この青の囲いに収まる時、
赤で囲った空間に属する。
本来なら、4つのグリッドを跨ぐため、
上位のノードに属さなければいけな
いが、緩い4(8)分木だと赤の領域内
に属する。

●

いくつかの小空間を跨ぐオブジェクトがあった時に所属の階層を
低めに設定できる。
緩い4(8)分木-2/2
●

当たり判定などの調査を行う場合、本来の探索範囲の半サイズ
拡張した領域について調査する必要がある。

本来の探索範囲

緩い4分木における探査範囲
・青枠を跨ぐ空間(ルート空間)
及び小空間すべてを調べる。
まとめ
●

●

●

●

空間分割することによって、衝突計算などの回数を減らすこと
が出来る。
ユニフォーム形式だと小空間をまたぐオブジェクトを正しく処理
できない。
正しく処理するには、4(8)分木・BSP木・kd木などの木構造に
基づいた空間分割を利用する。
緩い4(8)分木を使うことによって、オブジェクトをより細かい小空
間に属させることが出来る。→処理が減る
ご静聴ありがとうございました

空間分割