(57)【要約】【課題】分散処理システムを用いて、３次元空間内における凹形状を含む物体の衝突を、Octreeを利用して高速に検出する衝突検出方法を提供する。【解決手段】クライアント１が、３次元空間を分割した部分空間を、少なくとも複数のサーバ２の各々に割り当てる。少なくともサーバ２の各々が、その割り当てられた部分空間におけるOctreeを生成する。少なくともサーバ２の各々が、その生成したOctreeに基づいて当該部分空間における衝突を検出する。クライアント１が、少なくとも複数のサーバ２の各々における衝突検出の結果を統合する。【選択図】図１
2005310021.tif 000002
【特許請求の範囲】
【請求項１】
３次元空間における物体の衝突を検出する衝突検出システムにおける衝突検出方法であって、
グレイノードを物体を形成する面が含まれている空間と定義し、ホワイトノードを物体を形成する面がまったく存在しない空間と定義し、ブラックノードを一定の深さに達したグレイノードと定義することにより、前記物体のオクトリーを生成し、
当該生成したオクトリーに基づいて、衝突する面を検出することにより、前記物体の衝突を検出する
ことを特徴とする衝突検出方法。
【請求項２】
前記物体が凹形状を含み、
当該生成したオクトリーに基づいて、衝突する面を検出することにより、前記凹形状を含む物体の衝突を検出する
ことを特徴とする請求項１に記載の衝突検出方法。
【請求項３】
３次元空間における物体の衝突を検出する衝突検出システムであって、
グレイノードを物体を形成する面が含まれている空間と定義し、ホワイトノードを物体を形成する面がまったく存在しない空間と定義し、ブラックノードを一定の深さに達したグレイノードと定義することにより、前記物体のオクトリーを生成するオクトリー生成部と、
当該生成したオクトリーに基づいて、衝突する面を検出することにより、前記物体の衝突を検出する衝突検出部とを備える
ことを特徴とする衝突検出システム。
【請求項４】
クライアントと複数のサーバとからなる分散処理システムにおいて３次元空間における物体の衝突を検出する衝突検出方法であって、
前記クライアントが、前記３次元空間を分割した部分空間を、少なくとも前記複数のサーバの各々に割り当て、
少なくとも前記サーバの各々が、当該割り当てられた部分空間におけるオクトリーを生成し、
少なくとも前記サーバの各々が、当該生成したオクトリーに基づいて当該部分空間における衝突を検出し、
前記クライアントが、少なくとも前記サーバの各々における前記衝突検出の結果を統合する
ことを特徴とする衝突検出方法。
【請求項５】
前記クライアントが、前記部分空間を当該クライアントにも割り当て、当該割り当てられた部分空間におけるオクトリーを生成し、当該生成したオクトリーに基づいて当該部分空間における衝突を検出し、当該クライアント及び前記複数のサーバの各々における前記衝突検出の結果を統合する
ことを特徴とする請求項４に記載の衝突検出方法。
【請求項６】
前記物体が凹形状を含み、
グレイノードを当該物体を形成する面が含まれている空間と定義し、ホワイトノードを当該物体を形成する面がまったく存在しない空間と定義し、ブラックノードを一定の深さに達したグレイノードと定義することにより、前記凹形状を含む物体のオクトリーを生成し、
当該生成したオクトリーに基づいて、衝突する面を検出することにより、前記物体の衝突を検出する
ことを特徴とする請求項４に記載の衝突検出方法。
【請求項７】
複数の物体を分散させる処理において、各々の物体からオクトリーを生成し、前記クライアント及び複数のサーバの各々に対して、同一の部分空間を割り当てる
ことを特徴とする請求項４に記載の衝突検出方法。
【請求項８】
前記クライアント及び複数のサーバが、前記部分空間を割り当てられた場合、スレッドを生成し、前記スレッドにおいて、前記３次元空間における物体が記述されたオブジェクトファイルを読み込み、前記オブジェクトファイルの中の当該割り当てられた部分空間についてのオクトリーを生成し、当該生成したオクトリーに基づいて前記物体の衝突を検出する
ことを特徴とする請求項４に記載の衝突検出方法。
【請求項９】
前記クライアント及び複数のサーバが、前記部分空間を割り当てられた場合、当該物体の移動に伴って、当該物体の移動前について生成したオクトリーを廃棄し、新たにスレッドを生成し、前記新たに生成したスレッドにおいて、座標値を更新し、再度オクトリーを生成する
ことを特徴とする請求項４に記載の衝突検出方法。
【請求項１０】
クライアント及び複数のサーバからなる３次元空間における物体の衝突を検出する衝突検出システムであって、
前記クライアントが、
前記３次元空間を分割した部分空間を、前記クライアント及び複数のサーバの各々に割り当てる部分空間割当部と、
当該割り当てられた部分空間におけるオクトリーを生成するオクトリー生成部と、
当該生成したオクトリーに基づいて当該部分空間における衝突を検出する衝突検出部と、
前記クライアント及び複数のサーバの各々における前記衝突検出の結果を統合する結果統合部とを備え、
前記複数のサーバの各々が、
当該割り当てられた部分空間におけるオクトリーを生成するオクトリー生成部と、
当該生成したオクトリーに基づいて当該部分空間における衝突を検出する衝突検出部とを備える
ことを特徴とする衝突検出システム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、衝突検出方法及び衝突検出システムに関し、特に、複数のコンピュータからなる分散処理システムにおいて、３次元空間内における凹形状を含む物体の衝突を、オクトリー（以下、Octreeとも言う）を利用して高速に検出する衝突検出方法及び衝突検出システムに関する。
【背景技術】
【０００２】
３次元空間内における物体の衝突検出法の多くは、物体相互の幾何学的な交差を求めるものである。例えば、AABBTree（Axis-Aligned Bounding Box Tree）（非特許文献１参照）、OBBTree （Oriented Bounding Box Tree）（非特許文献２参照）、 Sphere Tree（非特許文献３参照）等を利用した手法のように、外接する凸多面体を再起的に定義する手法や、Octree（非特許文献４参照）、ボロノイ分割、 BSP（Binary Space Partitioning ）等によって空間を分割し、検出対象となる隣接物体対を絞り込む空間分割法と呼ばれる手法等がある。
【０００３】
凸多面体を再帰的に定義する手法は、物体の数が増加するにつれて、衝突検出コストが大きく増加する。それに対し、空間分割法は、物体の数の増加に対して衝突検出コストの増加は線形である。しかし、空間分割法を用いても、物体の数が非常に多い場合や、形状が非常に複雑な場合には、衝突検出のコストが大きくなってしまい、リアルタイムで衝突検出を行うのは困難である。
【０００４】
ところで、Octree表現は、３次元空間内の物体を位置に関して階層的に表現したソリッドモデルである。図１２は、３次元空間内の物体の一例である正八面体と、そのOctree表現例を示す。Octreeは、図１３に示すように、ｘ方向、ｙ方向、ｚ方向の各々で分割することによって、（３次元）空間を再帰的に８分割していき、分割木の各ノードが８つの子ノードをもつ８分木である。図１４は、このようなOctreeの例である。Octreeの各ノードは、ノードの示す空間の位置と物体との位置関係によって、ブラック（以下、black とも言う）ノード、ホワイト（以下、white とも言う）ノード、グレイ（以下、grayとも言う）ノードの３種類に分類される。
【０００５】
Octreeの生成手法として、例えば非特許文献５に示される手法が知られている（本発明においても、後述するように、基本的にはこの手法を用いる）。非特許文献５の手法においては、Octreeの３種類のノードは、各々、以下のように定義されている。即ち、
（１）grayノード：物体を形成する面が含まれている空間、つまり物体の内外にまたがる空間を示し、更に８つの子ノードに分割される。
（２）white ノード：物体を形成するいずれかの面に対して、面が持つ無限平面の外側、つまり物体の外部である空間を示す。
（３）black ノード：物体を形成する全ての面に対して、面が持つ無限平面の内側、つまり物体の内部である空間を示す。また、一定の深さに達したgrayノードは、black ノードとして扱われる。
【０００６】
図１５は、非特許文献５の手法を用いて各ノードを分類した場合の結果を示す、２次元的な模式図である。図１５（ａ）は空間を２度分割した結果を表している。（１）の空間（〇で１を囲んで示す空間、以下同じ）は、物体を形成する面の外側に位置するので、white ノードと分類される。（２）の空間は、物体を形成する全ての面の内側に位置するので、black ノードと分類される。残りの空間は、物体を形成する面を含むので、grayノードと分類される。図１５（ｂ）は、図１５（ａ）において、そのgrayノードを更に分割し、かつ、Octreeの深さが一定の深さに達したとみなされたgrayノードを再分類した結果を表している。分割されたgrayノードの一部は、一定の深さに達しているため、black ノードに再分類される。これにより、物体の面を含んだ空間（元のgrayノードの空間）もblack ノードに分類される。
【０００７】
以上のように、各ノードは３種類のノードに分類される。しかし、 blackノードの「物体を形成する全ての面に対して、面が持つ無限平面の内側である」という定義によって、凹形状を含んだ物体については、そのOctreeを生成することが困難である。即ち、凹形状を含んだ物体においては、物体の内部であっても「物体を形成する全ての無限平面の内側である」とはならない。このために、３種類のノードのうち、 blackノードをうまく生成することができない。
【０００８】
図１６は、凹形状を含んだ物体について非特許文献５の手法を用いたときの問題点を、２次元的な模式図により表している。上部中央が凹形状である。（１）の領域は、物体の内部であるにもかかわらず、面（が持つ無限平面）ａの外側に位置している。（２）の領域も、同様に、面（が持つ無限平面）ｂの外側に位置している。図１６から判るように、凹形状を含んだ物体の場合、空間が物体の内部に位置するのか、又は、外部に位置するのか、という判断が困難である。
【非特許文献１】Gottshalk S., Monocha D., ："OBBTree : A Hierarchical Structure for Rapid Interference Dtection", Proc.ACM siggraph'96, pp.177-180, 1996.
【非特許文献２】Van den Bergen G. ："Efficient Collision Detection of Complex Deformable Models using AABB Trees", journal of Graphics Tools, Vol.2, No.4, pp.1-14, 1997.
【非特許文献３】Hubbard, P. M.："Approximating Polyhedra with Spheres for Time-Critical Collision Detection", ACM Trans Graphics, Vol.15, No.3, pp.179-210, 1996.
【非特許文献４】北村善文, 竹村治雄, アフジャナンドラ, 岸野文郎："Octree と多面体表現を用いた三次元物体間の衝突面検出",ロボット学会誌, Vol.14, N.5, pp.121-130, September 1996.
【非特許文献５】登尾啓史, 福田尚三, 有本卓："Brep からオクトツリーへの変換アルゴリズムとその評価",情報処理学会論文誌, Vol.28, No.10, pp.1-10, May 2001.
【発明の開示】
【発明が解決しようとする課題】
【０００９】
前述のように、Octreeを利用した衝突検出法では、物体ごとにOctreeを生成し、各々のOctreeを並列にたどることによって衝突を検出する。しかし、従来は、前述の非特許文献５に示すように、凸形状である物体のOctree生成手法は知られているが、凹形状を含んだ物体には対応していない。実世界においては、一般的な物体の多くが凹形状を含んでいるので、凸形状のみに対応しているのでは実用的とはいえない。
【００１０】
本発明者の検討によれば、前述の非特許文献５の手法において、凹形状を含んだ物体のOctree生成が困難な原因は、前述の３種類のノードの定義にある。そこで、本発明者は、３種類のノードの定義を、凹形状を含んだ物体のOctree生成が可能なように変更（拡張）すれば、凹形状を含んだ物体についても、Octreeを利用した衝突検出が可能になると考えた。
【００１１】
また、従来は、物体を形成する面数が多い場合、Octree生成時間が非常に長くなってしまっていた。このため、衝突検出の実用化の障害となっていた。更に、Octreeを利用した衝突検出では、物体が移動するたびにOctreeを生成しなおさなければならない。このため、Octreeの生成時間が長いと、リアルタイムで衝突検出を行うことが困難になる。
【００１２】
本発明者の検討によれば、衝突検出の実用化のためには、Octree生成時間の短縮が最も重要である。そこで、本発明者は、Octreeの生成を、複数のコンピュータを用いた分散処理、いわゆるグリッドコンピューティング（grid computing）によれば、複数のコンピュータでの並列処理により高速で大量の処理を実行できるので、Octree生成時間を短縮することができると考えた。
【００１３】
本発明は、３次元空間内における凹形状を含む物体の衝突を、Octreeを利用して検出する衝突検出方法を提供することを目的とする。
【００１４】
また、本発明は、３次元空間内における凹形状を含む物体の衝突を、Octreeを利用して検出する衝突検出システムを提供することを目的とする。
【００１５】
また、本発明は、クライアント及び複数のサーバからなる分散処理システムを用いて、３次元空間内における凹形状を含む物体の衝突を、Octreeを利用して高速に検出する衝突検出方法を提供することを目的とする。
【００１６】
また、本発明は、クライアント及び複数のサーバからなる分散処理システムにおいて、３次元空間内における凹形状を含む物体の衝突を、Octreeを利用して高速に検出する衝突検出システムを提供することを目的とする。
【課題を解決するための手段】
【００１７】
本発明の衝突検出方法は、３次元空間における物体の衝突を検出する衝突検出システムにおける衝突検出方法である。本発明の衝突検出方法においては、グレイノードを物体を形成する面が含まれている空間と定義し、ホワイトノードを物体を形成する面がまったく存在しない空間と定義し、ブラックノードを一定の深さに達したグレイノードと定義することにより、前記物体のオクトリーを生成し、当該生成したオクトリーに基づいて、衝突する面を検出することにより、前記物体の衝突を検出する。
【００１８】
本発明の衝突検出システムは、３次元空間における物体の衝突を検出する。本発明の衝突検出システムは、グレイノードを物体を形成する面が含まれている空間と定義し、ホワイトノードを物体を形成する面がまったく存在しない空間と定義し、ブラックノードを一定の深さに達したグレイノードと定義することにより、前記物体のオクトリーを生成するオクトリー生成部と、当該生成したオクトリーに基づいて、衝突する面を検出することにより、前記物体の衝突を検出する衝突検出部とを備える。
【００１９】
本発明の衝突検出方法は、クライアントと複数のサーバとからなる分散処理システムにおいて３次元空間における物体の衝突を検出する。本発明の衝突検出方法においては、前記クライアントが、前記３次元空間を分割した部分空間を、少なくとも前記複数のサーバの各々に割り当て、少なくとも前記サーバの各々が、当該割り当てられた部分空間におけるオクトリーを生成し、少なくとも前記サーバの各々が、当該生成したオクトリーに基づいて当該部分空間における衝突を検出し、前記クライアントが、少なくとも前記サーバの各々における前記衝突検出の結果を統合する。
【００２０】
本発明の衝突検出システムは、クライアント及び複数のサーバからなる３次元空間における物体の衝突を検出する。本発明の衝突検出システムにおいては、前記クライアントが、前記３次元空間を分割した部分空間を、前記クライアント及び複数のサーバの各々に割り当てる部分空間割当部と、当該割り当てられた部分空間におけるオクトリーを生成するオクトリー生成部と、当該生成したオクトリーに基づいて当該部分空間における衝突を検出する衝突検出部と、前記クライアント及び複数のサーバの各々における前記衝突検出の結果を統合する結果統合部とを備える。前記複数のサーバの各々が、当該割り当てられた部分空間におけるオクトリーを生成するオクトリー生成部と、当該生成したオクトリーに基づいて当該部分空間における衝突を検出する衝突検出部とを備える。
【発明の効果】
【００２１】
本発明の衝突検出方法及び衝突検出システムによれば、grayノードを物体を形成する面が含まれている空間と定義し、white ノードを物体を形成する面がまったく存在しない空間と定義し、black ノードを一定の深さに達したgrayノードと定義する。前述のように、本発明者の検討によれば、前述の非特許文献５の手法において凹形状を含んだ物体のOctree生成が困難な原因は、３種類のノードの定義にある。そこで、３種類のノードの定義を前述のように変更（拡張）する。このように３種類のノードの定義を拡張することによって、凹形状を含んだ物体のOctreeを生成することができる。即ち、black ノードが物体の表面にのみ存在し、サーフェスモデルとなる。衝突検出とは衝突する面を検出することであるので、サーフェスモデルでも衝突検出に何ら問題は無い。これにより、凸形状である物体のOctreeの生成に限らず、凹形状を含んだ物体についても、衝突検出のための情報としてのOctreeを生成することができる。従って、凹形状を含んだ物体についてもOctreeを利用した衝突検出を行うことができ、物体の多くが凹形状を含む実世界についても衝突検出を行うことができる。
【００２２】
また、本発明の衝突検出方法及び衝突検出システムによれば、クライアントが部分空間を少なくとも複数のサーバに割り当て、サーバがOctreeを生成して衝突を検出し、クライアントが衝突検出の結果を統合する。前述のように、本発明者の検討によれば、衝突検出の実用化のためには、Octree生成時間の短縮が最も重要である。そこで、Octreeの生成と衝突検出とを複数のコンピュータを用いた並列処理により行う。このようにOctree生成処理及び衝突検出処理を分散することにより、高速で大量の処理を実行できるので、Octree生成時間を短縮することができる。これにより、物体を形成する面数が多い場合でも、Octree生成時間を短縮することができ、この結果、物体が移動するたびにOctreeを生成し直す際も、Octreeの生成時間が短いので、リアルタイムで衝突検出を行うことができる。
【発明を実施するための最良の形態】
【００２３】
図１は、衝突検出システム構成図であり、本発明の衝突検出システムの構成の一例を示す。この衝突検出システムは、複数のコンピュータ、即ち、クライアント１及び複数のサーバ２と、オブジェクトファイル（obj ファイル）３と、これらの間を接続するネットワーク４とからなり、３次元空間における物体の衝突を検出する。衝突検出には、Octreeを生成して、これを利用する。ネットワーク４は、例えばインターネット、ＬＡＮ（Local Area Network）等からなる。
【００２４】
クライアント１は衝突検出システムに１個設けられる。クライアント１は、部分空間割当部１１、オブジェクト読込部１２、Octree生成部１３、衝突検出部１４、結果統合部１５を備える。即ち、クライアント１は、衝突検出システムの複数のコンピュータの中で、３次元空間を分割した部分空間を割り当て、衝突検出の結果を統合する処理を実行するコンピュータである。なお、３次元空間の部分空間への分割は、当該割り当て処理に先立って、クライアント１及び複数のサーバ２のいずれにおいても行われる。
【００２５】
サーバ２は衝突検出システムに複数個（Ｎ個、例えばＮ＝１〜８、１６や３２等でも良い）設けられる。サーバ２は、オブジェクト読込部２１、Octree生成部２２、衝突検出部２３を備える。即ち、サーバ２は、衝突検出システムの複数のコンピュータの中で、Octreeの生成及びこれに基づく衝突の検出処理のみを実行するコンピュータである。サーバ２を区別する場合、サーバ２Ａ、２Ｂ、・・・２Ｎと表す。サーバ２Ａのオブジェクト読込部を２１Ａと表し、Octree生成部を２２Ａと表し、衝突検出部を２３Ａと表す（他のサーバ２Ｂ等についても同じ）。
【００２６】
ここで、本発明は、Octree生成処理及び衝突検出処理について分散処理を利用することにより、Octree生成時間を短縮する。即ち、Octree生成時間を短縮する手段として、複数のコンピュータを用いた分散処理、いわゆるグリッドコンピューティングを行う。グリッドコンピューティングについては、例えば、Charles Hansen, Chris Johnson "Graphics Applications for Grid Computing",IEEE Computer Graphics and Applications, Vol.23, No.2, pp.20-21, March/April 2003に示されている。グリッドコンピューティングとは、ネットワークを介して複数のコンピュータを接続することにより仮想的に高性能コンピュータを作るシステムである。複数のコンピュータで並列処理を行わせることにより、１台あたりの性能は低くとも高速に大量の処理を実行できるようになる。本発明では、例えばグリッドコンピューティングを利用して、Octree生成時間を短縮する。
【００２７】
クライアント１において、部分空間割当部１１は、３次元空間を分割した部分空間を、少なくとも複数のサーバ２の各々に割り当てる。この例では、部分空間割当部１１は、部分空間をクライアント１（自コンピュータ）にも割り当てる。これにより、クライアント１にもOctree生成等の処理を行わせ、衝突検出システムにおいて資源利用の無駄が生じないようにすることができる。なお、部分空間を複数のサーバ２の全てに割り当てる必要はない。部分空間を割り当てられたサーバ２がその時点での衝突検出システムを構成すると考えて良い。
【００２８】
部分空間割当部１１は、部分空間を割り当てた結果を、当該サーバ２に通知する。実際には、当該通知に代えて、割り当てた部分空間についてのOctreeの生成依頼が行われる。例えば、クライアント１は、サーバ２Ａに部分空間（１）〜（３）を割り当てた場合、サーバ２Ａに部分空間（１）〜（３）についてのOctreeの生成依頼を行う。クライアント１は、部分空間を割り当てた全てのサーバ２にOctreeの生成依頼を行った後、自コンピュータにおけるOctreeの生成を行う。
【００２９】
ここで、この例では、Octreeを利用するために、３次元空間を８分割する。これに応じて、クライアント１及び複数のサーバ２（システム中のコンピュータ）の合計数Ｎを最大でＮ＝８とする。即ち、コンピュータの台数は１〜８台となり、Ｎの最大値はＮ＝８である。Ｎ＝８の場合、８分割した３次元空間を８個のコンピュータで処理することができ、簡易な構成を採用することができる。
【００３０】
このように複数のコンピュータで分散処理を行うにあたって、コンピュータは１台のクライアント１と複数のサーバ２に分けられる。図２に示すように、クライアント１がサーバ２に処理を依頼し、サーバ２は処理結果をクライアント１に返す。これにより、３次元空間をＮ個に分散して処理する。なお、図２はサーバ２を４個設けた（Ｎ＝５の）例である。
【００３１】
本発明において、分散処理を行うのは、Octree生成処理と衝突検出処理である。Octree生成では、空間を分割するので、分割した部分空間を各サーバに割り当てることにより、分散処理を行う。例えば、図３のように、２個のサーバを用いる（Ｎ＝２の）場合、サーバ２Ａ（図３ではサーバ１）が部分空間（１）〜（３）の処理を行い、サーバ２Ｂ（図３ではサーバ２）が部分空間（４）〜（６）、クライアント１が部分空間（７）、（８）の処理を行うようにすることが可能である。本発明では全体空間を８分割して、分割した部分空間をクライアント１とサーバ２Ａ、２Ｂに分散する。
【００３２】
また、異なる３次元空間の処理において、異なる３次元空間を同一に分割し（例えば、８分割し）、クライアント１及び複数のサーバ２の各々に対して、異なる３次元空間の同一の部分空間を割り当てる。これにより、各々のコンピュータに常に決められた部分空間を割り当て、処理コストの高いOctreeの結合の処理を簡易に行うことができる。
【００３３】
即ち、衝突検出の処理コストは、Octree生成の処理コストと比較して、分散する必要がないほど微小である。しかし、１台のコンピュータのみで衝突検出を行うには、クライアント１とサーバ２が生成したOctreeのパーツを結合する必要がある。Octreeの結合は処理コストが高い。そこで、クライアント１とサーバ２には、各々、常に決められた部分空間を割り当て、Octreeを生成し、衝突検出を行うようにする。例えば、物体ａに対して８つに分割された部分空間の（１）〜（３）をサーバ２Ａに、（４）〜（６）をサーバ２Ｂに、（７）、（８）をクライアント１に割り当てたならば、物体ｂに対しても（１）〜（３）をサーバ２Ａに、（４）〜（６）をサーバ２Ｂに、（７）、（８）をクライアント１に割り当てる。クライアント１は、サーバ２Ａ、２Ｂ及びクライアント１における衝突検出結果、つまり「衝突した」と判断された面情報を統合化することによって、最終的な衝突検出結果を求める。衝突検出結果のみを統合することによって、Octreeを結合してから衝突検出を行うよりも処理コストが小さく、クライアント１とサーバ２Ａ、２Ｂ間の通信回数も少なくなる。
【００３４】
オブジェクト読込部１２は、obj ファイル３を読み込んで、所定の記憶領域に格納する。この時、この例では、当該部分空間ではなく、obj ファイル３の全体を読み込む。obj ファイル３は、衝突検出の処理対象である３次元空間における当該物体についてのデータを、オブジェクト形式（拡張子が.objであるファイル形式）で格納する。obj ファイル３（のデータ）は、本発明に従って、３次元空間において凹形状を含む物体を含むことができる。読み込まれたobj ファイル３の中の当該割り当てられた部分空間についてのみが、クライアント１における処理対象とされる。
【００３５】
Octree生成部１３は、Octreeの生成依頼を受けると、obj ファイル３の中の当該割り当てられた部分空間におけるOctreeを生成する。即ち、この例では、クライアント１にも部分空間が割り当てられるので、クライアント１もOctreeを生成する。クライアント１においてOctreeを生成しない場合、Octree生成部１３は省略される。obj ファイル３が凹形状を含む物体のデータを含む場合、Octree生成部１３は、凹形状を含む物体のOctreeを生成する。
【００３６】
ここで、本発明は、空間分割法を拡張することにより、凹形状を含んだ物体のOctree生成を可能にする。即ち、凹形状を含んだ物体のOctree生成を行うために、前述の非特許文献５の手法を変更（拡張）する。非特許文献５の手法において凹形状を含んだ物体のOctree生成が困難な原因は、３種類のノードの定義にある。そこで、３種類のノードの定義を以下のように拡張した。即ち、
（１）grayノード：物体を形成する面が含まれている空間と定義する。即ち、物体の内外にまたがる空間を示し、更に８つの子ノードに分割される。grayノードの定義は非特許文献５と同様である。
（２）white ノード：物体を形成する面がまったく存在しない空間と定義する。
（３）black ノード：一定の深さに達したgrayノードと定義する。
【００３７】
このように、３種類のノードの定義を拡張することによって、凹形状を含んだ物体のOctreeを生成することができる。図４はノードの定義を拡張して各ノードを分類したときの２次元的な模式図である。図４（ａ）は空間を２度分割した結果である。（１）の空間は、物体を形成する面がまったく存在しない空間なので、white ノードと分類されている。残りの空間は、物体を形成する面を含んでいるので、grayノードと分類されている。図４（ｂ）は、図４（ａ）のgrayノードを更に分割し、かつ、Octreeの深さが一定の深さに達したとみなされた結果である。図４（ｂ）から、black ノードが物体の表面にのみ存在することが判る。即ち、サーフェスモデルとなるのである。衝突検出とは衝突する面を検出することであるので、サーフェスモデルでも衝突検出に何ら問題は無い。
【００３８】
衝突検出部１４は、Octreeが生成されると、当該生成したOctreeに基づいて、当該部分空間における衝突を検出する。即ち、この例では、クライアント１にも部分空間が割り当てられるので、クライアント１も衝突検出を行う。クライアント１において衝突検出を行わない場合、衝突検出部１４は省略される。この例では、各ノードの分類の結果がサーフェスモデルとなるので、衝突検出部１４は、当該生成したOctreeに基づいて、衝突する面を検出する。本発明のノードの定義に従って、衝突検出の対象である複数の物体において、双方のblack ノードが重なった位置（部分空間）が衝突部分（実際には、衝突の可能性がある部分）として検出（抽出）される。これにより、衝突検出部１４は、凸形状の物体のみならず、凹形状を含む物体の衝突を検出することができる。
【００３９】
結果統合部１５は、少なくとも複数のサーバ２の各々における衝突検出の結果を統合する。この例では、クライアント１にも部分空間を割り当てるので、結果統合部１５は、クライアント１及び複数のサーバ２の各々における衝突検出の結果を統合する。この衝突検出の結果の統合処理において、結果統合部１５は、衝突が検出された面を全て集約することにより、衝突検出の結果を得る。
【００４０】
例えば、第１の正八面体（図１２参照）のある頂点が第２の正八面体のある平面に衝突したとする。本発明により、black ノードは物体の表面にのみ存在する。従って、この場合、当該頂点の先端部分と当該平面の一部とにおいて、双方のblack ノードが重なる。そこで、当該black ノードの重なりにより、当該位置において第１及び第２の正八面体が「衝突した」と判断される。そして、第１の正八面体の当該頂点を含む４つの面が「衝突した」と判断された面とされ、第２の正八面体の当該平面が「衝突した」と判断された面とされる。従って、これらの面の面番号（のみ）がクライアント１の結果統合部１５に通知される。従って、通信量は少なくて済む。面番号は、予めユニークに定められ、クライアント１及びサーバ２の各々にobj ファイル3 の一部として与えられる。結果統合部１５は、受信した面番号に基づいて、これらの「衝突した」と判断された面番号を集約する（複数の衝突した面を特定する）ことによって、最終的な衝突検出結果を求める。なお、以上の説明は、正八面体についてのものであるので、凹形状を含まないが、本発明により凹形状を含む物体についても、同様に衝突を検出することができる。また、衝突した位置の厳密な座標位置は他の手段によって求めることができる。
【００４１】
サーバ２の各々において、オブジェクト読込部２１は、obj ファイル３の全体を読み込んで、所定の記憶領域に格納する。従って、少なくともサーバ２の各々がobj ファイル３を読み込む。obj ファイル３（のデータ）は、３次元空間において凹形状を含む物体を含むことができる。読み込まれたobj ファイル３の中の当該割り当てられた部分空間についてのみが、当該サーバ２における処理対象とされる。
【００４２】
サーバ２の各々において、Octree生成部２２は、Octreeの生成依頼を受けると、obj ファイル３の中の当該割り当てられた部分空間におけるOctreeを生成する。従って、少なくともサーバ２の各々が、当該割り当てられた部分空間におけるOctreeを生成する。前述のOctree生成部１３と同様に、obj ファイル３が凹形状を含む物体のデータを含む場合、Octree生成部２２は、凹形状を含む物体のOctreeを生成する。
【００４３】
また、サーバ２の各々において、衝突検出部２３は、Octreeが生成されると、当該生成したOctreeに基づいて、当該部分空間における衝突を検出する。従って、少なくともサーバ２の各々が、当該生成したOctreeに基づいて、当該部分空間における衝突を検出する。前述の衝突検出部１４と同様に、衝突検出部２３は、当該生成したOctreeに基づいて衝突する面を検出し、凸形状の物体のみならず、凹形状を含む物体の衝突を検出することができる。
【００４４】
実際には、クライアント１及び複数のサーバ２は、部分空間を割り当てられた場合、スレッド１７及び２５を生成することにより、Octree生成処理を行い、同一のスレッド１７及び２５において物体の衝突検出処理を行う。即ち、クライアント１及び複数のサーバ２は、生成したスレッド１７及び２５において、３次元空間における物体が記述されたobj ファイル３の中の当該割り当てられた部分空間についてのOctreeを生成し、当該生成したOctreeに基づいて物体の衝突を検出する。これにより、衝突検出結果の統合の処理時における（Octree生成処理及び）衝突検出処理の待ち合わせ時間をできる限り少なくして、処理時間を短縮することができる。Octree生成部１３及び２２と衝突検出部１４及び２３はスレッドとして生成される。
【００４５】
なお、クライアント１及び複数のサーバ２は、obj ファイル３の読み込みも、スレッド１７及び２５とは異なるスレッド１６及び２４を生成することにより、読込み処理を行う。即ち、クライアント１及び複数のサーバ２は、部分空間を割り当てられた場合、スレッド１６及び２４を生成することにより、読込み処理を行う。読込み処理を行うスレッドとOctree生成処理を行うスレッドとを別に生成することにより、双方の処理の間に存在するタイムラグを吸収することができ、また、obj ファイル３からの形状データの読込みを１回だけとすることができる。オブジェクト読込部１２及び２１はスレッドとして生成される。
【００４６】
また、クライアント１及び複数のサーバ２は、部分空間を割り当てられた場合、当該物体の移動に伴って、当該物体の移動前について生成したOctreeを廃棄し、新たにスレッド１７及び２５を生成し、新たに生成したスレッド１７及び２５において、座標値を更新し、再度Octreeを生成する。これにより、不要となったOctreeの廃棄処理と新たなOctree生成処理とを円滑に切り換えることができる。
【００４７】
図５は、衝突検出処理フローであり、本発明の衝突検出方法における衝突検出処理の一例の概略を示し、図５（Ａ）はクライアント１における概略処理フローを示し、図５（Ｂ）はサーバ２における概略処理フローを示す。なお、この例はサーバ２の数が２個（Ｎ＝３）の場合の例である。
【００４８】
図５（Ａ）において、クライアント１は、前処理として、例えば図１３に示すように分割した部分空間であって、クライアント１と複数のサーバ２の各々が処理を行う部分空間を割り当て（ステップＳ１１）、各々のサーバ２に読込み依頼をした後に、Octreeを生成する準備処理として、スレッド１６を生成してobj ファイル３から形状データを読み込む（ステップＳ１２）。この後、クライアント１は、各々のサーバ２にOctree生成依頼をした後に、スレッド１７を生成して当該割り当てられた部分空間内のOctreeを生成し（ステップＳ１３）、当該Octreeを生成した部分空間内での衝突を検出し（ステップＳ１４）、複数のサーバ２とクライアント１の衝突検出結果を統合し（ステップＳ１５）、ステップＳ１５において求めた最終的な衝突検出結果を、例えば図１０（後述する）に示すようにクライアント１の表示装置（図示せず）の表示画面上に表示し（ステップＳ１６）、この後検出対象である物体の移動を行い（ステップＳ１７）、ステップＳ１３以下を繰り返す。なお、この例では、結果の表示処理はクライアントのみが行う。
【００４９】
図５（Ｂ）において、各々のサーバ２は、クライアント１からの読込み依頼に応じて、Octreeを生成する準備処理として、スレッド２４を生成してobj ファイル３から形状データを読み込む（ステップＳ２１）。この後、各々のサーバ２は、クライアント１からのOctree生成依頼に応じて、スレッド２５を生成して当該割り当てられた部分空間内のOctreeを生成し（ステップＳ２２）、当該Octreeを生成した部分空間内での衝突を検出し（ステップＳ２３）、クライアント１に衝突検出の結果を返信し（ステップＳ２４）、この後物体の移動を行い（ステップＳ２５）、ステップＳ２２以下を繰り返す。
【００５０】
ステップＳ１２及びステップＳ２１における形状データの読み込みにおいて、前述のように、形状データの形式として、obj 形式が用いられる。図６は形状データの読み込み処理の流れを示す。まず、クライアント１（図６では単にクライアント、図７〜図９において同じ）は、ユーザが指定したＩＰアドレスに基づいてサーバ２Ａ（図６ではサーバ１、図７〜図９において同じ）と接続する。サーバ２Ａは接続できたことをクライアント１に返信して知らせる。クライアント１は、同様にして、サーバ２Ｂ（図６ではサーバ２、図７〜図９において同じ）と接続する。次に、クライアント１は、ユーザに指定されたobj ファイル３の読み込みを、サーバ２Ａに依頼する。サーバ２Ａは、新たにスレッド２４Ａ（即ち、オブジェクト読込部２４Ａ）を生成し、クライアント１に依頼を受け取ったことを返信した後に、当該スレッド２４Ａにおいてobj ファイル３を読み込む。この時、サーバ２Ａは、新たにスレッド２４Ａを生成するため、obj ファイル３の読み込みが終了するまで、クライアント１の処理と並行に処理を行うことになる。サーバ２Ａからの返信を受け取ったクライアント１は、サーバ２Ｂにもobj ファイル３の読み込みを依頼する。サーバ２Ｂは、サーバ２Ａと同様の処理により、obj ファイル３を読み込む。全てのサーバ２Ａ、２Ｂにobj ファイル３の読み込み依頼を終えたクライアント１は、自分自身の処理のためにスレッド１６（即ち、オブジェクト読込部１２）を生成し、obj ファイル３を読み込む。
【００５１】
ステップＳ１３及びステップＳ２２におけるOctree生成処理において、図７に示すように、まず、クライアント１と全てのサーバ２Ａ、２Ｂは全体空間を８分割しておく。次に、クライアント１はクライアント１とサーバ２Ａ、２Ｂの各々に、割り当てる部分空間を８つの部分空間から決定する。図７の例の場合、サーバ２Ａには８つの部分空間から部分空間（１）〜（３）を、サーバ２Ｂには部分空間（４）〜（６）を、クライアント１には部分空間（７）、（８）を割り当てる。クライアント１は、サーバ２Ａに、（１）〜（３）の部分空間内のOctree生成を依頼する。サーバ２Ａは、スレッド２５Ａ（即ち、Octree生成部２２Ａ及び衝突検出部２３Ａ）を新た生成し、依頼を受け取ったことをクライアント１に返信した後に、（１）〜（３）の部分空間内のOctreeを生成する。サーバ２Ａからの返信を受け取ったクライアント１は、次に、サーバ２Ｂにも（４）〜（６）の部分空間内のOctree生成を依頼する。サーバ２Ｂは、サーバ２Ａと同様の処理により、（４）〜（６）の部分空間内のOctreeを生成し始める。全てのサーバ２Ａ、２ＢにOctree生成の依頼を終えたクライアント１は、スレッド１７（即ち、Octree生成部１３及び衝突検出部１４）を生成し、当該スレッド１７において割り当てられた（７）、（８）の部分空間内のOctreeを生成する。
【００５２】
ステップＳ１３及びステップＳ２２における衝突検出処理において、図８に示すように、まず、クライアント１と全てのサーバ２Ａ、２Ｂは、各々、スレッド１７及び２５において、Octreeを生成した空間内の衝突検出を行う。次に、クライアント１は、サーバ２Ａからサーバ２Ａの衝突検出結果、即ち、衝突する面の面番号を受け取る。更に、サーバ２Ｂからもサーバ２Ｂの衝突検出結果を受け取る。全てのサーバ２Ａ、２Ｂから衝突検出結果を受け取ったクライアント１は、全ての衝突検出結果の和をとることによって、最終的な衝突検出結果を求める。
【００５３】
ステップＳ１７及びステップＳ２５における物体の移動による処理において、図９に示すように、物体のOctreeを新たに生成しなおす必要がある。従って、物体が移動する前のOctreeや衝突検出結果等は不必要になってしまうため、破棄する必要がある。まず、クライアント１は、サーバ２Ａに対して、サーバ２Ａが所持している不必要になったOctreeの破棄を依頼する。サーバ２Ａは、新たなスレッド２５Ａを生成し、依頼を受け取ったことをクライアント１に返信した後で、不必要になったOctreeを破棄する。サーバ２Ａの返信を受け取ったクライアント１は、サーバ２Ｂに対しても同様に不必要になったOctreeの破棄を依頼する。サーバ２Ｂは、サーバ２Ａと同様の処理により、不必要になったOctreeを破棄する。全てのサーバ２Ａ、２Ｂに不必要になったOctreeの破棄を依頼し終えたクライアント１は、所持している不必要になったOctree及び衝突検出結果を破棄する。次に、新たに移動後の物体のOctreeを生成する準備として物体の座標値を、移動後の値に更新する必要がある。クライアント１は、サーバ２Ａに物体の移動先の座標を渡し、座標の更新を依頼する。サーバ２Ａは、新たなスレッド２５Ａを生成し、依頼を受け取ったことを返信した後で、座標値を更新する。サーバ２Ａからの返信を受け取ったクライアント１は、サーバ２Ｂにも物体の座標値の更新を依頼する。サーバ２Ｂは、サーバ２Ａと同様の処理により、物体の座標値を更新する。全てのサーバ２Ａ、２Ｂに物体の座標値の更新を依頼し終わったクライアント１は、物体の座標値の更新を行う。そして、新たにOctreeを生成するために、Octree生成処理を実施する。なお、物体の座標値の初期値はobj ファイル3 により与えられる。
【００５４】
なお、本発明ではクライアント１とサーバ２の通信にDCOM（Distributed Component Object Model）を用いた。DCOMについては、例えば、Frank E. Redmond III、”ＤＣＯＭデプロイメントガイド”、翔泳社出版、１９９８に示されている。DCOMはMicrosoft 社が定めた分散オブジェクト技術の仕様である。同社のCOM （Component Object Model）仕様に従って作成されたCOM オブジェクト同士がネットワークを通じて通信を行い、データの交換や処理依頼のやり取り等を行うことができる
次に、本発明による衝突検出の例について説明する。図１０は、凹形状を含んだ物体であるドラゴン（龍）のOctreeを生成し、正八面体と衝突検出を行った結果である。ドラゴンのように複雑な形状のOctreeを生成し、正しく衝突検出が行われていることがわかる。分散処理は４台のコンピュータを用いて評価した。使用したコンピュータはいずれも、 CPU Pentium４（３．００ＧＨｚ）（登録商標）、メモリ１ＧＢである。また、全てのコンピュータはギガビットイーサネット（登録商標）接続である。図１１はドラゴンと正八面体のOctreeを分散処理で生成したときの処理時間を表している。図１１からわかるようにドラゴンのような複雑な形状のOctree生成に分散処理が有効であることがわかる。更に、正八面体のように、単純な形状でも分散処理によって高速化できていることがわかる。本発明にて分散処理を行い、処理時間を約１／２に短縮することができた。
【００５５】
本発明によれば、衝突検出方法及び衝突検出システムにおいて、３種類のノードの定義を変更することにより、衝突検出に何ら影響を与えることなく、凸形状である物体に限らず、凹形状を含んだ物体についても、衝突検出のための情報としてのOctreeを生成することができるので、物体の多くが凹形状を含む実世界についてもOctreeを利用した衝突検出を行うことができる。
【００５６】
また、本発明によれば、衝突検出方法及び衝突検出システムにおいて、オクトリーの生成及びこれに基づく衝突検出を少なくとも複数のサーバに分散することにより、Octreeの生成時間を短縮することができるので、物体を形成する面数が多い場合でも、又は、物体が移動するたびにOctreeを生成し直す場合でも、リアルタイムでOctreeを生成し衝突検出を行うことができる。
【図面の簡単な説明】
【００５７】
【図１】衝突検出装置構成図であり、本発明の衝突検出方法を実現する衝突検出装置の構成の一例を示す。
【図２】分散処理のイメージを示す説明図である。
【図３】分散処理の例を示す説明図である。
【図４】ノードを分類したときの２次元的な模式図である。
【図５】全体の処理の流れを示す。
【図６】形状データの読み込み処理の流れを示す。
【図７】Octree生成処理の流れを示す。
【図８】衝突検出処理の流れを示す。
【図９】物体の移動処理の流れを示す。
【図１０】凹形状を含んだ物体であるドラゴンのOctreeを生成し、正八面体と衝突検出を行った結果を示す。
【図１１】ドラゴンと正八面体のOctreeを分散処理で生成した場合の処理時間を示す。
【図１２】Octree説明図であり、正八面体のOctree表現例である。
【図１３】Octree説明図であり、空間の８分割の例である。
【図１４】Octree説明図であり、Octreeの例である。
【図１５】Octree説明図であり、各ノードを分類したときの一例を示す２次元的な模式図である。
【図１６】Octree説明図であり、凹形状を含んだ物体において生じる不都合の例を２次元的に示す。
【符号の説明】
【００５８】
１    クライアント
２    サーバ
３    オブジェクトファイル
４    ネットワーク
１１    部分空間割当部
１２    オブジェクト読込部
１３    Octree生成部
１４    衝突検出部
１５    結果統合部
１６、１７、２４、２５    スレッド
２１    オブジェクト読込部
２２    Octree生成部
２３    衝突検出部
【図１】
2005310021.tif 000003
【図２】
2005310021.tif 000004
【図３】
2005310021.tif 000005
【図４】
2005310021.tif 000006
【図５】
2005310021.tif 000007
【図６】
2005310021.tif 000008
【図７】
2005310021.tif 000009
【図８】
2005310021.tif 000010
【図９】
2005310021.tif 000011
【図１０】
2005310021.tif 000012
【図１１】
2005310021.tif 000013
【図１２】
2005310021.tif 000014
【図１３】
2005310021.tif 000015
【図１４】
2005310021.tif 000016
【図１５】
2005310021.tif 000017
【図１６】
2005310021.tif 000018