上記のサーフェース変換手法では512の3乗程度のボクセルを基に、3次元的に三角形を生成する方法をとるため、三角形ポリゴンが膨大になり、CG分野においては、画面描画の際に時間がかかり対話操作の応答性が悪くなるという問題が指摘されている。これは3Dプリンタ出力においても問題を起こし、プリンタ出力前処理(ポリゴンから積層造形用のデータに変換する処理)に時間がかかり、場合によりワークメモリーオーバーフローを引き起こして出力不能になる。
これに対してCG分野においては、画面の解像度に合せてポリゴン分割を粗くして曲面を表現したり、可視化に供しないポリゴンを事前に削除したりする方法がとられる。例えば、平板オブジェクトでは、単一面だけで表現し裏面を構成するポリゴンを省略したり、特許文献4のように、視点方向から隠面にあたり可視化に供しないポリゴンを事前に削除したり、特許文献5のように、他のポリゴンによって隠される内側のポリゴンを判定して事前に削除し、描画対象ポリゴンを削減する方法が提案されている。また、特許文献6のように、微細な凹凸表現に対してポリゴンを用いず、テクスチャやバンプマッピングで代用する方法が提案されている。
しかし、3Dプリンタ出力においては、画面より細かい解像度が要求され、ポリゴンにより閉空間を構成する必要があるため、平板オブジェクトにおいて、裏面を構成するポリゴンを省略することはできない。また、造形物は種々のアングルから鑑賞されるため基本的に隠面は存在せず、造形物内部にも別の形状を造形可能なため、CG分野で提案されているオクルージョンカリングという手法は意味をもたない。微細な凹凸に対しても陰影などで視覚的に擬似表現することはできず、ポリゴン形状で表現せざるを得ない。特許文献7のように、建築模型においては極端にポリゴンを削減したデフォルメされた表現が要望される場合もあるが、医療応用ではそれなりにリアリティが要求される。そのため、特許文献8のように、造形物の外観を損なわない程度に、三角形ポリゴン自体を削減する手法をとらざるを得ない。
三角形ポリゴンの削減にあたっては、特許文献8の手法が基本になる。これは、(1)与えられたポリゴンから削減しても全体形状にあまり影響を与えない三角形および稜線を探索する処理と、(2)対象稜線を削減するとともにそれと頂点を共有する隣接三角形を探索し補正を行う処理との2種の探索処理を所望のデータ量に削減されるまで繰り返す。特許文献8の手法では、双方の処理において削除候補とする稜線と頂点を共有する隣接三角形を探索する処理を必要とし、与えられたポリゴン数の2乗に比例して処理負荷が増大するという問題を抱えていた。
ポリゴンモデルの削減の際、分離可能な位置においてポリゴンモデルを分離しておくことが望ましい。全体のポリゴンモデルをポリゴン数の少ない複数のポリゴンモデルに分離しておき、分離されたポリゴンモデルごとにポリゴンを削除することにより、全体として効率的なデータ量の削減が可能となるためである。
ポリゴン分離とは、例えば、ポリゴンが三角形の場合、ある集合に属する全ての三角形の3辺に共有する隣接三角形が、同一集合内に重複せずに1つずつ存在するように、複数の三角形の集合に分離する処理である。従来、このポリゴン分離を行うためには、多くの処理負荷を要していた。ポリゴン分離は、ポリゴン削減の際だけでなく、複数の部品からなる物体を3Dプリンタ等で出力する用途において、その処理を効率的に行う際にも有用である。
そこで、本発明は、立体物造形用データであるポリゴンモデルを効率的に複数のポリゴンモデルに分離することが可能な立体物造形用データ分離装置を提供することを課題とする。
上記課題を解決するため、本発明第1の態様では、
ポリゴンの集合として表現された立体物造形用のポリゴンモデルを、複数に分離する装置であって、
前記ポリゴンモデルの各ポリゴンの各稜線と共有する他のポリゴンとの対応関係を記録した隣接ポリゴンテーブルを作成する隣接ポリゴンテーブル作成手段と、
新規なグループIDを定義して、前記ポリゴンモデルの中でグループIDが未設定のポリゴンを1つ抽出し、抽出されたポリゴンに対して前記定義された新規なグループIDを仮設定するようにしているグループID仮設定手段と、
前記ポリゴンモデルの中でグループIDが仮設定されているポリゴンを全て抽出し、抽出されたポリゴンに対して前記グループIDを本設定するとともに、前記隣接ポリゴンテーブルを参照し、前記本設定されたポリゴンに隣接しグループIDが未設定の他のポリゴンに対して、前記本設定されたポリゴンに対応するグループIDと同一のグループIDを仮設定するグループID本設定手段と、
本設定されたポリゴンIDをグループIDごとに分離するポリゴンモデル分離手段と、を有し、
前記ポリゴンモデルの中でグループIDが仮設定されているポリゴンが存在する場合は、前記グループID本設定手段による処理を実行し、前記ポリゴンモデルの中でグループIDが未設定のポリゴンが存在する場合は、前記グループID仮設定手段による処理、および前記グループID本設定手段による処理を、全てのポリゴンが本設定されるまで繰り返し実行することを特徴とする立体物造形用データ分離装置を提供する。
なお、「グループIDが未設定」とは、本設定も仮設定も行われていない状態を意味する。
本発明第1の態様によれば、ポリゴンモデルの各ポリゴンの各稜線と共有する他のポリゴンとの対応関係を記録した隣接ポリゴンテーブルを作成し、新規なグループIDを定義して、ポリゴンモデルの中でグループIDが未設定のポリゴンを1つ抽出し、抽出されたポリゴンに対して定義された新規なグループIDを仮設定し、ポリゴンモデルの中でグループIDが仮設定されているポリゴンを全て抽出し、抽出されたポリゴンに対してグループIDを本設定するとともに、隣接ポリゴンテーブルを参照し、本設定されたポリゴンに隣接しグループIDが未設定の他のポリゴンに対して、本設定されたポリゴンに対応するグループIDと同一のグループIDを仮設定し、ポリゴンモデルの中でグループIDが仮設定されているポリゴンが存在する場合は、グループID本設定手段による処理を実行し、ポリゴンモデルの中でグループIDが未設定のポリゴンが存在する場合は、前記グループID仮設定手段による処理、および前記グループID本設定手段による処理を、全てのポリゴンが本設定されるまで繰り返し実行し、本設定されたポリゴンIDをグループIDごとに分離するようにしたので、ポリゴンモデルを高速に分離することが可能となる。
また、本発明第2の態様では、
前記ポリゴンモデルを構成する各ポリゴンの各稜線に対して、同一の稜線を共有する異なるポリゴンを探索し、前記同一の稜線を同一の稜線IDで表現し、各稜線を含むポリゴンと対応付けて記録した稜線構成テーブルを作成するポリゴン稜線構造化手段をさらに備え、
前記隣接ポリゴンテーブル作成手段は、
前記稜線構成テーブルに対して、各ポリゴンに稜線順に記録されている稜線IDを、当該稜線IDをもつ異なるポリゴンIDに置換することにより、隣接ポリゴンテーブルを作成することを特徴とする。
本発明第2の態様によれば、ポリゴンモデルを構成する各ポリゴンの各稜線に対して、同一の稜線を共有する異なるポリゴンを探索し、同一の稜線を同一の稜線IDで表現し、各稜線を含むポリゴンと対応付けて記録した稜線構成テーブルを作成し、稜線構成テーブルに対して、各ポリゴンに稜線順に記録されている稜線IDを、その稜線IDをもつ異なるポリゴンIDに置換することにより、隣接ポリゴンテーブルを作成するようにしたので、ポリゴンモデルを高速に分離するために必要な隣接ポリゴンテーブルを高速に作成することが可能となる。
また、本発明第3の態様では、
前記ポリゴンモデルを構成する各ポリゴンの各頂点に対して、同一の座標値をもつ異なるポリゴンの共有頂点を探索し、取得された一連の共有頂点を同一の頂点IDで表現し、各ポリゴンと頂点順に対応付けて記録した頂点構成テーブルを作成するポリゴンモデル構造化手段をさらに備え、
前記ポリゴン稜線構造化手段は、
前記頂点構成テーブルの各ポリゴンの各頂点IDと頂点順において隣接する頂点IDとで構成される頂点IDペアと、同一の構成の頂点IDペアをもつ異なるポリゴンを探索し、前記同一の構成の頂点IDペアに対して同一の稜線IDを付与することにより、前記頂点構成テーブルの各ポリゴンの頂点順の各頂点IDを稜線順の稜線IDに対応付けて置換し、前記稜線構成テーブルを作成することを特徴とする。
本発明第3の態様によれば、ポリゴンモデルを構成する各ポリゴンの各頂点に対して、同一の座標値をもつ異なるポリゴンの共有頂点を探索し、取得された一連の共有頂点を同一の頂点IDで表現し、各ポリゴンと頂点順に対応付けて記録した頂点構成テーブルを作成し、頂点構成テーブルの各ポリゴンの各頂点IDと頂点順において隣接する頂点IDとで構成される頂点IDペアと、同一の構成の頂点IDペアをもつ異なるポリゴンを探索し、同一の構成の頂点IDペアに対して同一の稜線IDを付与することにより、頂点構成テーブルの各ポリゴンの頂点順の各頂点IDを稜線順の稜線IDに対応付けて置換し、稜線構成テーブルを作成するようにしたので、隣接ポリゴンテーブルを作成するために用いる稜線構成テーブルを高速に作成することが可能となる。
また、本発明第4の態様では、
前記隣接ポリゴンテーブル作成手段は、
稜線ID別にポリゴンIDと稜線順を記録できる稜線ID別ポリゴンテーブルを備え、
前記ポリゴン稜線構造化手段により作成された前記稜線構成テーブルを用いて、ポリゴンIDのポリゴンの所定の稜線順に記録されている稜線IDに対応する前記稜線ID別ポリゴンテーブルに当該ポリゴンのポリゴンIDと当該稜線順を書き込むポリゴンテーブル登録手段と、
前記ポリゴンテーブル登録手段において、既に稜線IDに対応する前記稜線ID別ポリゴンテーブルに他のポリゴンIDと稜線順が書き込まれている場合、前記隣接ポリゴンテーブルのポリゴンIDの稜線順の位置にポリゴンIDを書き込む隣接ポリゴンテーブル登録手段を備え、
前記ポリゴンテーブル登録手段と隣接ポリゴンテーブル登録手段を繰り返し実行し、前記隣接ポリゴンテーブルを作成することを特徴とする。
本発明第4の態様によれば、稜線ID別にポリゴンIDと稜線順を記録できる稜線ID別ポリゴンテーブルを備え、稜線構成テーブルを用いて、ポリゴンIDNのポリゴンの所定の稜線順Nに記録されている稜線IDに対応する稜線ID別ポリゴンテーブルにそのポリゴンのポリゴンIDと稜線順を書き込み、既に稜線IDに対応する稜線ID別ポリゴンテーブルに他のポリゴンIDPと稜線順Pが書き込まれている場合、隣接ポリゴンテーブルのポリゴンIDPの稜線順Pの位置にポリゴンIDNを書き込むとともに、隣接ポリゴンテーブルのポリゴンIDNの稜線順Nの位置にポリゴンIDPを書き込むようにしたので、少ない処理負荷で、隣接ポリゴンテーブルを作成することが可能となる。
また、本発明第5の態様では、
前記ポリゴンモデル構造化手段は、
前記頂点構成テーブルを作成するとともに、前記頂点構成テーブルに頂点順に記録された各頂点IDと座標値を対応付けて記録した頂点座標テーブルとを作成するものであり、
前記ポリゴンIDに対応付けて、ポリゴンを構成する各頂点の座標値が記録された頂点座標配列データから各ポリゴンごとに頂点順に座標値を抽出し、当該抽出された座標値からハッシュ値を算出するハッシュ値算出手段と、
前記算出されたハッシュ値を用いて前記頂点座標テーブルを参照し、前記ハッシュ値で特定される既登録の頂点IDに対応する頂点座標テーブル上の座標値と、前記抽出された座標値を照合する座標値照合手段と、
前記座標値照合手段による照合の結果、両座標値が一致する場合は、前記頂点構成テーブルの前記抽出した座標値のポリゴンIDと頂点順の位置に、前記既登録の頂点IDを記録するようにし、前記座標値照合手段による照合の結果、両座標値が一致しない場合は、前記頂点構成テーブルの前記抽出した座標値のポリゴンIDと頂点順の位置に、新規な頂点IDを記録するようにしている頂点構成テーブル処理手段と、
前記頂点構成テーブル処理手段が新規な頂点IDを記録した場合、前記頂点座標テーブル上の頂点IDの位置に前記座標値を前記ハッシュ値で特定可能な形態で記録するようにしている頂点座標テーブル処理手段と、
を有することを特徴とする。
本発明第5の態様によれば、頂点座標配列データから各ポリゴンごとに頂点順に座標値を抽出し、抽出された座標値からハッシュ値を算出し、算出されたハッシュ値を用いて頂点座標テーブルを参照し、ハッシュ値で特定される既登録の頂点IDに対応する頂点座標テーブル上の座標値と、抽出された座標値を照合し、照合の結果、両座標値が一致する既登録の頂点IDが存在する場合は、頂点構成テーブルの抽出した座標値のポリゴンIDと頂点順の位置に、既登録の頂点IDを記録するようにし、照合の結果、両座標値が一致する既登録の頂点IDが存在しない場合は、頂点構成テーブルの抽出した座標値のポリゴンIDと頂点順の位置に、新規な頂点IDを記録するようにし、新規な頂点IDを記録した場合、頂点座標テーブル上の頂点IDの位置に座標値をハッシュ値で特定可能な形態で記録するようにしたので、ハッシュ値が異なる既登録の頂点IDの座標値とは一致する可能性が無いため、照合対象から外すことができ、ハッシュ値が同一となる既登録の頂点IDだけに照合対象を絞り込むことができ、ポリゴンと当該ポリゴンを構成する頂点の座標値との対応関係で表現した頂点座標配列データを、ポリゴンを特定するポリゴンIDと、ポリゴンモデル内で各頂点を特定する頂点IDを対応付けた頂点構成テーブルと、各頂点IDと座標値を対応付けた頂点座標テーブルで表現される形態に効率的に構造化することが可能となる。
また、本発明第6の態様では、前記頂点座標テーブルには、頂点IDに対応して座標値が記録されるとともに、当該座標値をもとに前記ハッシュ値算出手段により算出されるハッシュ値が同一の他の座標値を前記頂点IDより最近傍に記録した単一の頂点IDがリンク先として対応付けられていることを特徴とする。
本発明第6の態様によれば、頂点座標テーブルには、頂点IDに対応して座標値が記録されるとともに、座標値をもとに算出されるハッシュ値が同一の他の座標値を前記頂点IDより最近傍に記録した単一の頂点IDがリンク先として対応付けられているので、同一のハッシュ値を持つ頂点IDに対応する座標値だけを迅速に抽出することができ、効率的な照合を行うことが可能となる。
また、本発明第7の態様では、前記頂点座標テーブルに加え先頭頂点テーブルを設け、前記先頭頂点テーブルには、前記ハッシュ値算出手段により算出されるハッシュ値に対応して、前記頂点座標テーブル上に最初に記録されている前記ハッシュ値になる頂点IDがリンク先として対応付けられていることを特徴とする。
本発明第7の態様によれば、頂点座標テーブルに加え先頭頂点テーブルを設け、先頭頂点テーブルには、算出されるハッシュ値に対応して、頂点座標テーブル上に最初に記録されているハッシュ値になる頂点IDがリンク先として対応付けられているので、頂点座標テーブル内で照合対象となる同一ハッシュ値を持つ頂点IDに対応する座標値だけを迅速に抽出することが可能となる。
また、本発明第8の態様では、前記ハッシュ値算出手段は、前記座標値が(x、y、z)なる3次元の値で構成され、かつ各々の成分が、XminからXmax、YminからYmax、ZminからZmaxの範囲の実数値をもつ場合、各成分をhx=(x−Xmin)・S/(Xmax−Xmin),hy=(y−Ymin)・S/(Ymax−Ymin),hz=(z−Zmin)・S/(Zmax−Zmin)なる式で所定の整数S段階(hx, hy, hz)に分類し、ハッシュ値h=hx+hy・S+hz・S2として算出することを特徴とする。
本発明第8の態様によれば、座標値が(x、y、z)なる3次元の値で構成され、かつ各々の成分が、XminからXmax、YminからYmax、ZminからZmaxの範囲の実数値をもつ場合、各成分をhx=(x−Xmin)・S/(Xmax−Xmin),hy=(y−Ymin)・S/(Ymax−Ymin),hz=(z−Zmin)・S/(Zmax−Zmin)なる式で所定の整数S段階(hx, hy, hz)に分類し、ハッシュ値h=hx+hy・S+hz・S2として算出するようにしているので、3次元のポリゴンモデルにおける各頂点を空間的に均等分類して偏りのないハッシュ値を求めることが可能となる。
また、本発明第9の態様では、
前記ポリゴン稜線構造化手段は、
前記頂点構成テーブルの各ポリゴンの各頂点IDと頂点順において隣接する頂点IDとで構成される頂点IDペアに対して稜線IDで表現し、各ポリゴンの頂点順と対応付けて稜線順に稜線IDを記録した前記稜線構成テーブルを作成するとともに、前記稜線構成テーブルに記録された稜線IDと頂点IDペアを対応付けて記録した稜線テーブルとを作成するものであり、
前記頂点構成テーブルの前記ポリゴンのポリゴンIDおよび頂点順の位置の頂点IDと頂点順において隣接する頂点IDで構成される頂点IDペアXの中で小さい方の頂点IDSを用いて、前記稜線テーブル上で既登録の稜線IDに対応する頂点IDペアのうち小さい方の頂点IDが前記頂点IDSである稜線IDの頂点IDペアを抽出し、前記頂点IDペアXと照合する頂点ID照合手段と、
前記頂点ID照合手段により前記頂点IDペアXが既登録の稜線IDの頂点IDペアと一致する場合は、前記稜線構成テーブル上の前記ポリゴンIDおよび前記頂点順に対応する稜線順の位置に前記稜線IDを記録するようにし、前記頂点ID照合手段により前記頂点IDペアXがいずれの既登録の稜線IDの頂点IDペアとも一致しない場合は、前記頂点構成テーブル上の前記ポリゴンIDおよび前記頂点順に対応する稜線順の位置に前記稜線テーブルに記録されていない新規な稜線IDを作成して記録する稜線構成テーブル更新手段と、
前記稜線構成テーブル更新手段で新規な稜線IDを記録した場合、前記稜線テーブル上の前記稜線IDの位置に前記頂点IDペアXを前記頂点IDSで抽出可能な形態で記録するようにしている稜線テーブル更新手段と、
を有することを特徴とする。
本発明第9の態様によれば、頂点構成テーブルのポリゴンIDおよび頂点順の位置の頂点IDと頂点順において隣接する頂点IDで構成される頂点IDペアXの中で小さい方の頂点IDSを用いて、稜線テーブル上で既登録の頂点IDペアのうち小さい方の頂点IDが頂点IDSである稜線IDの頂点IDペアを抽出し、頂点IDペアXと照合し、頂点IDペアXが既登録の稜線IDの頂点IDペアと一致する場合は、稜線構成テーブル上のポリゴンIDおよび頂点順に対応する稜線順の位置に稜線IDを記録するようにし、頂点IDペアXがいずれの既登録の稜線IDの頂点IDペアとも一致しない場合は、頂点構成テーブル上のポリゴンIDおよび頂点順に対応する稜線順の位置に稜線テーブルに記録されていない新規な稜線IDを作成して記録し、稜線構成テーブル更新手段で新規な稜線IDを記録した場合、稜線テーブル上の稜線IDの位置に頂点IDペアXを頂点IDSで抽出可能な形態で記録するようにしたので、小さい方の頂点IDが異なる既登録の頂点IDペアに対応する稜線IDとは一致する可能性が無いため、照合対象から外すことができ、小さい方の頂点IDが同一となる既登録の稜線IDだけに照合対象を絞り込むことができ、ポリゴンIDに対して頂点順に頂点IDを対応付けた頂点構成テーブルを基に、頂点IDと頂点順において隣接する頂点IDとで構成される頂点IDペアに対して稜線IDで表現し、ポリゴンIDと頂点順に対応する稜線順に対応付けて稜線IDを記録した稜線構成テーブルと、稜線構成テーブルに記録された稜線IDと頂点IDペアを対応付けて記録した稜線テーブルで表現される形態に効率的に構造化することが可能となる。
また、本発明第10の態様では、前記稜線テーブルには、稜線IDに対応して頂点IDペアが記録されるとともに、当該頂点IDペアのうち小さい方の頂点IDが同一である他の頂点IDペアを最近傍に記録した単一の稜線IDがリンク先として対応付けられていることを特徴とする。
本発明第10の態様によれば、稜線テーブルには、稜線IDに対応して頂点IDペアが記録されるとともに、頂点IDペアのうち小さい方の頂点IDが同一である他の頂点IDペアを最近傍に記録した単一の稜線IDがリンク先として対応付けられているので、同一頂点IDを持つ稜線IDに対応する頂点IDペアだけを迅速に抽出することができ、効率的な照合を行うことが可能となる。
また、本発明第11の態様では、前記稜線テーブルに加え先頭稜線テーブルを設け、前記先頭稜線テーブルには、頂点IDに対応付けて、前記頂点IDペアのうち小さい方の頂点IDが同一となり、前記稜線テーブル上で最初に記録されている稜線IDがリンク先として対応付けられていることを特徴とする。
本発明第11の態様によれば、稜線テーブルに加え先頭稜線テーブルを設け、先頭稜線テーブルには、頂点IDに対応付けて、頂点IDペアのうち小さい方の頂点IDが同一となり、稜線テーブル上で最初に記録されている稜線IDがリンク先として対応付けられているので、稜線テーブル内で照合対象となる同一頂点IDペアを持つ稜線IDに対応する頂点IDペアだけを迅速に抽出することが可能となる。
本発明によれば、立体物造形用データであるポリゴンモデルを効率的に複数のポリゴンモデルに分離することが可能となる。
以下、本発明の好適な実施形態について図面を参照して詳細に説明する。
<1.装置構成>
図1は、本発明の一実施形態に係る立体物造形用データ分離装置200を含む立体物造形システムのハードウェア構成図である。本実施形態に係る立体物造形用データ分離装置200は、汎用のコンピュータで実現することができ、図1に示すように、CPU(Central Processing Unit)1と、コンピュータのメインメモリであるRAM(Random Access Memory)2と、CPU1が実行するプログラムやデータを記憶するためのハードディスク、フラッシュメモリ等の大容量の記憶装置3と、キーボード、マウス等のキー入力I/F(インターフェース)4と、3Dプリンタやデータ記憶媒体等の外部装置とデータ通信するためのデータ入出力I/F(インターフェース)5と、液晶ディスプレイ等の表示デバイスである表示部6と、を備え、互いにバスを介して接続されている。
3Dプリンタ7は、汎用の3Dプリンタであり、立体物の三次元形状をポリゴンの集合で表現したポリゴンモデルである立体物造形用データを基に樹脂、石膏等の素材を加工して立体物を造形する立体物造形装置である。3Dプリンタ7は、データ処理部7aと出力部7bを有している。3Dプリンタ7のデータ処理部7aは、データ入出力I/F5に接続されており、データ入出力I/F5から受け取った削減された立体物造形用データを基に、出力部7bが立体物を造形するようになっている。
図1では、立体物造形用データ分離装置200と3Dプリンタ7は分離した形態で示されているが、現在市販されている殆どの3Dプリンタ製品には立体物造形用データ分離装置200の構成要素である、CPU1、RAM2、記憶装置3、キー入力I/F4(汎用コンピュータ向けキーボード・マウスではなく、テンキーレベルの数種のボタン)、データ入出力I/F5、表示部6(数行の文字を表示可能な小型液晶パネル、タッチパネルを重畳させキー入力I/F4を兼ねることも多い)も小規模ながら重複して備えている。従って、3Dプリンタ7自体が外部記憶媒体経由で立体物造形用データを直接受け取り、単独で立体物を造形する運用も可能になっている(特に民生用の3Dプリンタではこちらの形態の方が多い)。すなわち、図1に示した立体物造形システムを1つの筐体に収めて、“3Dプリンタ”という製品として流通することも多い。
図2は、本実施形態に係る立体物造形用データ分離装置の構成を示す機能ブロック図である。図2において、10は制御手段、30はポリゴンモデル構造化手段、40はポリゴン稜線構造化手段、50は隣接ポリゴンテーブル作成手段、60はグループID仮設定手段、70はグループID本設定手段、80はポリゴンモデル分離手段、120はポリゴンモデル記憶手段、130は分離ポリゴンモデル記憶手段である。
制御手段10は、立体物造形用データ分離装置全体の制御を行う。ポリゴンモデル構造化手段30は、ポリゴンモデルから、各ポリゴンに含まれる各頂点を、同一座標の共有頂点を同一値とする頂点IDで表現し、ポリゴンを構成する各頂点を共有頂点の頂点IDで表現してポリゴンと対応付けて頂点順に記録した頂点構成テーブルと、頂点構成テーブルに付与された頂点IDと座標値を対応付けて記録した頂点座標テーブルを作成する。ポリゴン稜線構造化手段40は、各ポリゴンに含まれる各稜線を、共有する同一稜線を同一値とする稜線IDで表現し、ポリゴンを構成する各稜線を稜線IDで表現してポリゴンと稜線順に対応付けて記録した稜線構成テーブルと、稜線構成テーブルに付与された稜線IDと、稜線IDで特定される稜線の両端を特定する頂点IDペアを対応付けて記録した稜線テーブルを作成する。
隣接ポリゴンテーブル作成手段50は、ポリゴンモデルの各ポリゴンの各稜線と共有する他のポリゴンとの対応関係を稜線順に記録した隣接ポリゴンテーブルを作成する。
グループID仮設定手段60は、新規なグループIDを定義して、ポリゴンモデルの中でグループIDが未設定のポリゴンを抽出し、抽出されたポリゴンに対して定義された新規なグループIDを仮設定する。グループID本設定手段70は、ポリゴンモデルの中でグループIDが仮設定されているポリゴンを抽出し、抽出されたポリゴンに対してグループIDを本設定するとともに、隣接ポリゴンテーブルを参照し、本設定されたポリゴンに隣接しグループIDが未設定の他のポリゴンに対して、本設定されたポリゴンに対応するグループIDと同一のグループIDを仮設定する。ポリゴンモデル分離手段80は、各ポリゴンに本設定されたグループIDごとに当該ポリゴンを所定のグループに分離する。
制御手段10、ポリゴンモデル構造化手段30、ポリゴン稜線構造化手段40、隣接ポリゴンテーブル作成手段50、グループID仮設定手段60、グループID本設定手段70、ポリゴンモデル分離手段80は、CPU1が、記憶装置3に記憶されているプログラムを実行することにより実現される。
ポリゴンモデル記憶手段120は、分離前のポリゴンモデルを記憶した記憶手段であり、記憶装置3により実現される。分離ポリゴンモデル記憶手段130は、ポリゴンモデルを複数ファイルに分離した分離ポリゴンモデルを記憶する記憶手段であり、記憶装置3により実現される。分離ポリゴンモデル記憶手段130に記憶される分離ポリゴンモデルは、3Dプリンタ7への出力用の立体物造形用データとなる。ポリゴンモデル記憶手段120に記憶されたポリゴンモデル、分離ポリゴンモデル記憶手段130に記憶される分離ポリゴンモデルは、いずれもポリゴンの集合体であり、ポリゴン単位で各ポリゴンが有する頂点を記録した形式となっている。
図2に示した各構成手段は、現実には図1に示したように、コンピュータおよびその周辺機器等のハードウェアに専用のプログラムを搭載することにより実現される。すなわち、コンピュータが、専用のプログラムに従って各手段の内容を実行することになる。なお、本明細書において、コンピュータとは、CPU等の演算処理部を有し、データ処理が可能な装置を意味し、パーソナルコンピュータなどの汎用コンピュータだけでなく、製品としての“3Dプリンタ”に組み込まれたボードコンピュータも含む。
図1に示した記憶装置3には、CPU1を動作させ、コンピュータを、立体物造形用データ分離装置として機能させるための専用のプログラムが実装されている。この専用のプログラムを実行することにより、CPU1は、制御手段10、ポリゴンモデル構造化手段30、ポリゴン稜線構造化手段40、隣接ポリゴンテーブル作成手段50、グループID仮設定手段60、グループID本設定手段70、ポリゴンモデル分離手段80としての機能を実現することになる。また、記憶装置3は、ポリゴンモデル記憶手段120、分離ポリゴンモデル記憶手段130として機能するだけでなく、立体物造形用データ分離装置としての処理に必要な様々なデータを記憶する。
<2.処理動作>
<2.1.前処理>
次に、図1、図2に示した立体物造形用データ分離装置の処理動作について説明する。まず、医療用ボクセルデータからサーフェースデータであるポリゴンモデルを作成する前処理について説明する。サーフェースデータとは、サーフェースモデリングにより立体構造を表面形状として表現したデータであり、多角形のデータであるポリゴンにより構成されるポリゴンモデルである。前処理は、コンピュータが公知のプログラムを実行することにより行われる。ここでは、公知のプログラムとして、米国ハーバード大学が中心に開発したオープンソースソフトウェアである「3D-Slicer」を用いた場合を例にとって説明する。まず、コンピュータが、全体ボクセルデータから、特定臓器領域のボクセルデータを抽出する。次に、コンピュータが、特定臓器領域のボクセルデータをポリゴンモデルであるサーフェースデータに変換する。このようにして得られたポリゴンモデルは、ポリゴンモデル記憶手段120に格納される。前処理は、図1に示した立体物造形用データ分離装置を実現するコンピュータに、上記プログラムを実行させることにより行ってもよいし、図1に示した立体物造形用データ分離装置を実現するコンピュータとは別のコンピュータにより実行し、得られたポリゴンモデルを記憶装置3により実現されるポリゴンモデル記憶手段120に格納するようにしてもよい。
本実施形態では、医療用ボクセルデータとして医用画像データ交換に関する国際標準規格であるDICOM形式のボクセルデータを用いる。また、ポリゴンモデルであるサーフェースデータとしてSTL(Standard Triangulated Language)データを用いる。STLデータとは、元来3Dグラフィックス分野におけるモデリングデータ交換に関する業界標準で、最近では3Dプリンタでも標準的に使用されるようになったもので、三次元形状を三角形のポリゴンの集合体で表現したデータである。そして、コンピュータが上記「3D-Slicer」を実行することにより、図3(a)に示すようなDICOM形式ボクセルデータから、図3(b)に示すような領域別のボクセルデータを抽出し、サーフェースモデル変換を行って図3(c)に示すようなポリゴンモデル(STLデータ)が得られる。領域別のボクセルデータの抽出、サーフェースモデル変換には、特許文献3等に記載されたMarching Cube法が用いられている。
図4〜図8に、「3D-Slicer」による処理画面の一例を示す。図4は、「3D-Slicer」の処理対象となるDICOM形式ボクセルデータを、複数のスライス画像として示した図である。図4の例では、人体頭部のサジタル像を256枚のスライス画像で示している。各スライス画像は、512×512画素で構成されている。
図5は、DICOM形式ボクセルデータを、4つの形態で表示した例である。図5において、上部に表示されているのは、ボリュームレンダリング像である。下部に表示されているのは、左側から順にアキシャル像、サジタル像、コロナル像である。
図6は、図5に示したDICOM形式ボクセルデータを「3D-Slicer」により変換して得られたポリゴンモデルのSTLデータを示す図である。図6において、上部に表示されているのは、STLデータのサーフェースレンダリング像である。図6の例では、眼球・脳領域しきい値:626.75以上(MRI撮影でボクセル値10bits幅の場合)、眼球結合組織Lしきい値:298.36-458.74、眼球結合組織Rしきい値:298.36-431.32を設定することにより、領域(組織)別に分類された領域別STLデータをサーフェースレンダリングしたものを示している。
図7は、「3D-Slicer」により得られた領域別STLデータをシェーディングにより陰影表現した図である。図8は、領域別STLデータを合成したポリゴンモデル(STLデータ)のサーフェースレンダリング像を示す図である。図8に示すFront Viewは、図6の上部に示したものと同一である。前処理の後は、図7に示したようなポリゴンモデルがポリゴンモデル記憶手段120に記憶される。
<2.2.処理概要>
次に、図1、図2に示した立体物造形用データ分離装置の処理動作について説明する。図9は、本発明の一実施形態に係る立体物造形用データ分離装置の処理概要を示すフローチャートである。まず、ポリゴンモデル構造化手段30が、ポリゴンモデル記憶手段120から、分離前のポリゴンモデルを読み込み、ポリゴンモデルの構造化を行う(ステップS10)。次に、ポリゴン稜線構造化手段40が、ポリゴン稜線の構造化を行う(ステップS20)。次に、隣接ポリゴンテーブル作成手段50が、隣接ポリゴンテーブルの作成を行う(ステップS30)。そして、ポリゴンモデル分離手段80が、隣接ポリゴンテーブルが作成されたポリゴンモデルを、複数のグループに分離する(ステップS40)。
まず、処理対象とするポリゴンモデルについて説明する。ポリゴンモデルは、空間における三次元の値をもち、数万個単位のポリゴンからなることもあるが、本実施形態では、説明の便宜上、二次元空間に投影したポリゴン群を用いる。図10は、処理対象とするポリゴン群の一例を示す図である。図10の例では、18個の三角形のポリゴンからなるポリゴン群を示している。図10において、大文字のアルファベットA〜Nは特定のポリゴンに属する形式でなく、複数のポリゴンで共有される共有頂点を識別するために示している。大文字のアルファベットA〜Nは、ポリゴン群全体において共有頂点を識別するために、便宜上付されたものであり、後述する頂点座標配列データや、頂点構成テーブル、先頭頂点テーブル、頂点座標テーブル、稜線構成テーブル、先頭稜線テーブル、稜線テーブル、稜線ID別ポリゴンテーブル、隣接ポリゴンテーブルには記録されていない(一部記載されているものは、理解を容易にするために便宜上用いられている。)。
図11は、図10に示したポリゴン群を実現するための頂点座標配列データを示す図である。頂点座標配列データは、ポリゴンモデルを規定するデータであり、ポリゴンの集合体であるポリゴンモデルを配列構造で定義している。すなわち、図11は、STLデータより法線ベクトルの情報を削除した構造を示している。図11に示すように、頂点座標配列データは、ポリゴンを識別するポリゴン識別情報であるポリゴンIDP1〜P18に対応付けて、ポリゴンを構成する第1頂点、第2頂点、第3頂点の3つの頂点順に各座標値が記録されている。
また、図10、図11には、各ポリゴンおよび各ポリゴンを構成する3つの頂点を各ポリゴンIDP1〜P18と頂点順に対応付けて表現されたポリゴン別頂点ID“V1a”〜“V18c”が記載されている。ポリゴン別頂点ID“V1a”〜“V18c”は、説明の便宜上設けたものであり、頂点座標配列データ、先頭頂点テーブル、頂点構成テーブル、頂点座標テーブル、稜線構成テーブル、先頭稜線テーブル、稜線テーブル、稜線ID別ポリゴンテーブル、隣接ポリゴンテーブルには記録されていない。
ポリゴン別頂点IDは、その頂点が属するポリゴンのポリゴンIDと当該ポリゴンにおける頂点順が特定される形式で頂点を表現したものである。具体的には、図10に示すように、頂点を示すVの後に、対応するポリゴンIDに含まれる数字、そして第1頂点、第2頂点、第3頂点の頂点順を示すa、b、cのいずれかの小文字のアルファベットで表現する。例えば、図11の1行目に示すように、ポリゴンID“P1”のポリゴン(ポリゴンP1)の第1頂点は、“V1a”と表現される。頂点順“V1a”に数字“1”が入っているため、ポリゴンP1の頂点であることが明確になっている。このポリゴン別頂点IDは、実際にはシリアル番号で表現され、そのシリアル番号に従って各頂点の座標値が頂点座標配列データに記録されているが、図10との対応関係、頂点がどのポリゴンに所属するかを明らかにするため、便宜上ポリゴン別頂点IDに記号を付加して図面に掲載したものである。また、図11の頂点座標配列データにおいて、各頂点の座標は、図10で示した共有頂点A〜Nのいずれかに対応するため、各頂点の座標値が対応する共有頂点A〜Nを識別するアルファベットの小文字を添えて表現している。例えば、図11の1行目に示すように、ポリゴンP1の第1頂点V1aの座標値は、図10において“D”と表示されているので、“(Xd,Yd,Zd)”と表現される。各ポリゴンごとに、構成される3つの頂点に対応付けて3つの頂点の座標値が記録されている。
上記のような規則に従って作成されるため、頂点座標配列データにおいては、同一座標の頂点が複数箇所に重複して記録されることになる。例えば、図10に示した頂点Dは、6つのポリゴンP1,P2,P4,P5,P6,P7に共有されるため、座標値“(Xd,Yd,Zd)”は、頂点V1a,V2a,V4b,V5c,V6c,V7cとして6箇所に記録される。
<2.3.ポリゴンモデルの構造化>
ステップS10のポリゴンモデルの構造化について説明する。ポリゴンモデルの構造化とは、ポリゴンモデルを実現するデータである頂点座標配列データを、頂点構成テーブルおよび頂点座標テーブルで構成される構造に変換することにより、ポリゴンモデルにおける頂点関係(トポロジー・位相情報)が座標値(数値データ)から分離され、あるポリゴンの頂点の修正により影響を受ける周辺のポリゴンの頂点の探索が容易になり、編集し易い構造に組み替えることを意味する。
図12は、ステップS10のポリゴンモデルの構造化の詳細を示すフローチャートである。ステップS10のポリゴンモデルの構造化は、ポリゴンモデル構造化手段30により行われる。まず、頂点構成テーブル、頂点座標テーブル、頂点IDの初期化を行う(S101)。頂点構成テーブルは、各ポリゴンに含まれる各頂点を、同一座標の共有頂点を同一値とする頂点IDで表現し、ポリゴンを構成する各頂点を共有頂点の頂点IDで表現して当該ポリゴンのポリゴンIDと頂点順とで対応付けて記録したテーブルである。頂点IDは、共有頂点を識別するための頂点識別情報であり、共有頂点を一意に特定することができれば、どのようなものを用いてもよいが、演算処理の効率化のため、本実施形態では、0から始まるシリアルな整数値を用いている。頂点座標テーブルは、頂点構成テーブルに記録された頂点IDと座標値を対応付けて記録したテーブルである。頂点構成テーブル、頂点座標テーブルの初期化は、各項目が記録されていない状態にすることを意味する。また、頂点IDの初期化として現在の頂点ID=0に設定する。さらに、ハッシュ値とリンク先頂点IDを対応付けた先頭頂点テーブルも初期化する。先頭頂点テーブルの初期化は、リンク先頂点IDを全て“−1”に設定することにより行われる。頂点座標テーブルと先頭頂点テーブルの2つのテーブルによりハッシュ値別頂点座標テーブルを実現する。
次に、頂点座標配列データより頂点座標値を抽出するにあたり、ポリゴンIDを“P1”に、頂点順を“0”に初期化する(S101)。そして、頂点座標配列データより現在のポリゴンIDと頂点順に対応する1つの頂点座標値を抽出する(S102)。例えば、図11に示した頂点座標配列データからは、ポリゴンID“P1”と第1頂点の頂点座標値(Xd,Yd,Zd)が抽出される。
続いて、抽出された頂点座標値(Xd,Yd,Zd)よりハッシュ値を算出する(S103)。具体的には、まず、ポリゴンモデル内の全てのポリゴンの3次元座標値x,y,zの最大値Xmax,Ymax,Zmax、最小値Xmin,Ymin,Zminを求める。これは、図11に示したような頂点配列データの座標ごとの最大値、最小値を求めることになる。そして、座標値x,y,zの値を均等なS段階に分類し、整数値hx,hy,hz(0≦hx,hy,hz≦S−1)に変換する。整数Sとしては、例えばS=32を設定することができる。具体的には、以下の〔数式1〕に従った処理を実行することにより、hx,hy,hzを算出する。ただし、〔数式1〕に従った処理の後、小数点以下を切り捨てた値を、整数値hx,hy,hzとして得るものとする。
〔数式1〕
hx=(x−Xmin)・S/(Xmax−Xmin)
hy=(y−Ymin)・S/(Ymax−Ymin)
hz=(z−Zmin)・S/(Zmax−Zmin)
そして、以下の〔数式2〕に従った処理を実行することにより、ハッシュ値hを算出する。
〔数式2〕
h=hx+hy・S+hz・S2(0≦h≦S3−1)
次に、算出されたハッシュ値を用いて先頭頂点テーブルを参照する(S104)。そして、そのハッシュ値に対応するリンク先頂点IDが先頭頂点テーブルに登録されているか否かを判定する(S105)。ハッシュ値に対応するリンク先頂点ID(図中“リンク頂点ID”と表示)が“−1”、すなわち初期状態である場合は、そのハッシュ値に対応するリンク先頂点IDが未登録、すなわち既登録でないことを意味する。
この場合、先頭頂点テーブルに頂点IDの記録を行う(S106)。具体的には、先頭頂点テーブルのハッシュ値に対応するリンク先頂点IDに、現在の頂点ID(初期状態では“0”)を書き込む。続いて、頂点座標テーブルの現在の頂点IDの位置にステップS102で抽出した座標値を書き込む(S107)。この時、頂点座標テーブルにもリンク先頂点IDを書き込む欄があるが、初期状態の“−1”のままにする。また、頂点構成テーブルにステップS102で抽出したポリゴンIDと頂点順の位置に対応付けて、現在の頂点IDを書き込む。ここでは、新規な頂点IDとして記録されることになる。そして、現在の頂点IDをインクリメントする。
一方、ステップS105において、ハッシュ値に対応するリンク先頂点IDが“−1”でない場合は、そのハッシュ値に対応するリンク先頂点IDが既登録であることを意味する。この場合、ステップS102で抽出した座標値と、頂点座標テーブルにおける既登録のリンク先頂点IDに対応する座標値が一致するか否かを判定する(S108)。判定の結果、両座標値が一致する場合は、頂点構成テーブルのポリゴンID、頂点順の位置に、既登録のリンク先頂点IDを記録する(S109)。ステップS108における判定の結果、両座標値が異なる場合は、頂点座標テーブルのリンク先頂点IDを参照し、リンク先頂点IDが0以上であるか否かを確認する(S110)。
確認の結果、リンク先頂点IDが0以上である場合は、その値を頂点IDとし、ステップS108に戻って、その頂点IDに対応する頂点座標テーブルにおける既登録の座標値とステップS102で抽出した座標値を照合する。ステップS110における確認の結果、リンク先頂点IDが負値(例えば“−1”)である場合は、頂点座標テーブルのその頂点IDに対応するリンク先頂点IDに現在の頂点IDを記録し、ステップS107に戻って、頂点座標テーブルの現在の頂点IDの位置にステップS102で抽出した座標値を記録する。この時、頂点座標テーブルの現在の頂点IDにおけるリンク先頂点IDについては、初期状態の“−1”のままにする。また、頂点構成テーブルにステップS102で抽出したポリゴンIDと頂点順の位置に現在の頂点IDを記録する。そして、頂点IDをインクリメントする。
ステップS107またはS109の処理を終えたら、全ポリゴンに対して処理を終えたか否かを判定する(S111)。具体的には、まず、頂点順をインクリメントし、頂点順が“2”を超えたら、ポリゴンIDをインクリメントして頂点順を“0”にする。例えば、現在のポリゴンIDが“P1”の場合、ポリゴンIDをインクリメントすると、ポリゴンIDは“P2”になる。ポリゴンIDがポリゴン総数を超えていなければ、ステップS102に戻って処理を繰り返す。ポリゴンIDがポリゴン総数を超えていれば、全ポリゴンに対して処理を終えたと判定して処理を終了する。
ポリゴンモデル構造化手段30は、ハッシュ値算出手段、座標値照合手段、頂点構成テーブル処理手段、頂点座標テーブル処理手段を備えており、図12に示したポリゴンモデルの構造化処理は、これらの手段が連携することにより実現される。
図12に示したステップS10のポリゴンモデルの構造化処理の具体例について説明する。図10に示したポリゴン群が、その頂点の座標値により図13に示すようなハッシュ値をとる場合を例にとって説明する。図13の例では、説明の都合上2次元で表現し、上記〔数式2〕においてS=2とすると、h=hx+hy・2となり、頂点A,B,D,Eのハッシュ値がh=0、頂点C,Fのハッシュ値がh=1、頂点G,H,J,L,Mのハッシュ値がh=2、頂点I,K,Nのハッシュ値がh=3であることを示している。実際には上記〔数式2〕において、S=32に設定し、h=hx+hy・32+hz・1024となり、ハッシュ値hは、0〜32767の値をとるが、以下では、説明を簡略化するため、ハッシュ値は前述の0〜3の値をとるものとして説明していく。
図14は、S101における初期化時の各テーブルの状態を示す図である。図14(a)は頂点構成テーブル、図14(b)は先頭頂点テーブル、図14(c)は頂点座標テーブルを示している。先頭頂点テーブルには、ハッシュ値に頂点IDが対応付けられてリンク先頂点IDとして記録されている。ここでは、図13に示したようにハッシュ値が0〜3の値をとるため、先頭頂点テーブルには、全てのハッシュ値0〜3に対応付けてリンク先頂点IDとして“−1”が記録されている。頂点座標テーブルには、頂点IDに対応付けられて頂点座標が記録されるとともに、リンク先頂点IDが記録されている。
図14(a)に示すように、頂点構成テーブルは、ポリゴンIDと頂点順に対応付けて3つの頂点IDが記録されるようになっているが、頂点順は、左から0,1,2となっており、図11に示した第1頂点、第2頂点、第3頂点に対応している。ステップS101における初期化の際、頂点順=0に初期化される。ステップS102において、頂点座標配列データより、ポリゴンP1の第1頂点の座標値(Xd,Yd,Zd)を抽出して、ステップS103において、ハッシュ値“0”が算出されたものとする。ステップS104において、ハッシュ値“0”で先頭頂点テーブルを参照すると、ステップS105において、リンク先の頂点IDが登録されていないため、先頭頂点テーブルのハッシュ値“0”に対応付けて、ステップS106において、現在の頂点ID“0”をリンク先として記録する。
そして、ステップS107において、頂点座標テーブルにおける現在の頂点ID“0”の位置に、ステップS102において抽出した座標値(Xd,Yd,Zd)を記録し、リンク先頂点IDとして“−1”を記録する。さらに、ステップS107において、現在のポリゴンID“P1”の現在の頂点順“0”の位置に、現在の頂点ID“0”を記録する。この結果、各テーブルは、図15に示すような状態となる。そして、頂点IDをインクリメントして現在の頂点IDを“0”→“1”とする。また、頂点順をインクリメントして現在の頂点順を“0”→“1” とする。現在のポリゴンIDは“P1”であり、“P13”を超えていないため、ステップS111において、全ポリゴンに対して処理終了していないと判断され、ステップS102に戻る。
ステップS102において、頂点座標配列データより、現在のポリゴンID“P1”、現在の頂点順“1”に基づき、ポリゴンP1の第2頂点の座標値(Xb,Yb,Zb)を抽出する。そして、ステップS103において、座標値(Xb,Yb,Zb)に対してハッシュ値“0”が算出されたものとする。ステップS104において、ハッシュ値“0”で先頭頂点テーブルを参照すると、ステップS105において、リンク先の頂点IDとして“0”が既登録であるため、ステップS108において、既登録の頂点ID“0”に対応する頂点座標テーブルの座標値(Xd,Yd,Zd)と、ステップS102で抽出した座標値(Xb,Yb,Zb)を照合する。照合の結果、不一致であるので、ステップS110において、頂点座標テーブルのリンク先の頂点IDが0以上であるか負の値であるかを確認する。
図15に示すように、リンク先の頂点IDが“−1”であるので、ステップS107において、頂点座標テーブルの現在の頂点ID“1”の位置に、ステップS102において抽出した座標値(Xb,Yb,Zb)を記録し、リンク先頂点IDとして“−1”を記録する。さらに、ステップS107において、頂点構成テーブルの、現在のポリゴンID“P1”の現在の頂点順“1”の位置に、現在の頂点ID“1”を記録する。この結果、各テーブルは、図16に示すような状態となる。そして、頂点IDをインクリメントして現在の頂点IDを“1”→“2”とする。また、頂点順をインクリメントして現在の頂点順を“1”→“2” とする。現在のポリゴンIDは“P1”であり、“P13”を超えていないため、ステップS111において、全ポリゴンに対して処理終了していないと判断され、ステップS102に戻る。
ポリゴンID“P1”、頂点ID“2”、頂点順“2”の場合は、ポリゴンID“P1”、頂点ID“1”、頂点順“1”の場合と同様に処理され、各テーブルは、図17に示すような状態となる。そして、頂点IDをインクリメントして現在の頂点IDを“2”→“3”とする。また、頂点順は、1つのポリゴンについて“0”“1”“2”の3つの値のみをとるため、ポリゴンIDをインクリメントして“P1”→“P2”とし、頂点順をリセットして現在の頂点順を“2”→“0” とする。現在のポリゴンIDは“P2”となり、“P18”を超えていないため、ステップS111において、全ポリゴンに対して処理終了していないと判断され、ステップS102に戻る。
ステップS102において、頂点座標配列データより、現在のポリゴンID“P2”、現在の頂点順“0”に基づき、ポリゴンP2の第1頂点の座標値(Xd,Yd,Zd)を抽出する。そして、ステップS103において、座標値(Xd,Yd,Zd)に対してハッシュ値“0”が算出されたものとする。ステップS104において、ハッシュ値“0”で先頭頂点テーブルを参照すると、ステップS105において、リンク先の頂点IDとして“0”が既登録であるため、ステップS108において、既登録の頂点ID“0”に対応する頂点座標テーブルの座標値(Xd,Yd,Zd)と、ステップS102で抽出した座標値(Xd,Yd,Zd)を照合する。照合の結果、一致するので、ステップS109において、頂点座標テーブルの座標値が一致した頂点ID“0”を、頂点構成テーブルの、現在のポリゴンID“P2”の現在の頂点順“0”の位置に記録する。この結果、各テーブルは、図18に示すような状態となる。
上記のようにして、ポリゴンP18まで処理を行ってステップS111の判定により処理を終了する。このとき、各テーブルは、図19に示すような状態となる。すなわち、ハッシュ値が同一の他の座標値を頂点IDより最近傍に記録した単一の頂点IDがリンク先として対応付けられているものとなる。上記説明のように、ポリゴンモデルの構造化処理においては、ステップS108において座標値の照合を行い、不一致であれば頂点座標テーブルに登録するが、一致している場合は、次々に照合を繰り返していく。この処理は、頂点座標テーブルが大きくなり、既登録の座標値が多くなる程、負荷が高くなることになる。本実施形態では、ハッシュ値を用いてハッシュ値別頂点座標テーブルを参照することにより、頂点座標テーブルの全ての座標値の照合を行うことなく、ハッシュ値が異なる座標値とは一致しないことが自明なため照合対象から除外することができ、同一ハッシュ値の頂点座標テーブルのみを参照すればよいことになる。頂点座標テーブルの中で同一ハッシュ値をもつ座標値は、本実施形態では高々1/4程度であるが、前述の通り実際には上記〔数式2〕において、S=32に設定することが多く、そうすると頂点座標テーブルの中で同一ハッシュ値をもつ座標値は1/32767程度に削減され、全件と照合する場合に比べ照合時間も1/32767程度に短縮されることになる。このため、ポリゴンモデルの構造化処理を桁違いに高速に行うことが可能となる。
図19の例で、ハッシュ値が“0”の場合、図19(c)の頂点座標テーブルでは、リンク先頂点IDに従って、頂点ID“0”“1”“2”“6”のものだけ照合すれば、頂点座標の登録が可能となる。図19(b)に示した先頭頂点テーブルを削除し、図19(c)に示した頂点座標テーブルよりリンク先頂点IDの欄を削除することにより、図20に示したような頂点構成テーブルと頂点座標テーブルを得ることができ、ポリゴンモデルの構造化は完了する。
<2.4.ポリゴン稜線の構造化>
ステップS20のポリゴン稜線の構造化について説明する。ポリゴン稜線の構造化とは、与えられたポリゴン内の頂点順において隣接する2つの頂点の頂点IDペアに対して稜線IDを付与し、ポリゴンを構成する各稜線を稜線IDで表現してポリゴンIDと稜線順とで対応付けて記録した稜線構成テーブルと、稜線構成テーブルに付与された稜線IDに対する頂点IDペアを対応付けて記録した稜線テーブルに分離する処理である。ここで、稜線順は頂点順に対応し、例えば、頂点順で“0”と“1”の隣接する2つの頂点は稜線順“0”に対応し、頂点順で“1”と“2”の隣接する2つの頂点は稜線順“1”に対応し、頂点順で“2”と“0”の隣接する2つの頂点は稜線順“2”に対応させる。この時、稜線テーブルの複数の稜線IDに同一の頂点IDペアが重複して記録されないようにすることがポイントになる。同一の頂点IDペアを共有する隣接するポリゴンの稜線は、頂点IDペアの順番が逆になることが原則になるため、頂点IDペアは番号が小さい(若い)順に設定するようにする。そして、各頂点IDペアに稜線IDを付与する際、稜線テーブルに既に登録されているか否かを探索し、既登録であれば該当する稜線IDを付与し、未登録であれば新規の稜線IDを付与し、稜線テーブルに追加登録するという処理を繰り返す。
図21は、ステップS20のポリゴン稜線の構造化の詳細を示すフローチャートである。ステップS20のポリゴン稜線の構造化は、ポリゴン稜線構造化手段40により行われる。まず、稜線構成テーブル、頂点ID別稜線テーブル、稜線IDの初期化を行う(S201)。稜線構成テーブルは、各ポリゴンに含まれる各稜線を稜線IDで表現してポリゴンと稜線順とで対応付けて記録したテーブルである。稜線IDは、稜線を識別するための稜線識別情報であり、稜線を一意に特定することができれば、どのようなものを用いてもよいが、演算処理の効率化のため、本実施形態では、0から始まるシリアルな整数値を用いている。稜線テーブルは、稜線構成テーブルに付与された稜線IDと頂点IDペアを対応付けて記録したテーブルである。稜線構成テーブル、稜線テーブルの初期化は、各項目が記録されていない状態にすることを意味する。また、稜線IDの初期化として現在の稜線ID=0に設定する。さらに、頂点IDペアの小さい方の頂点IDとリンク先稜線IDを対応付けた先頭稜線テーブルも初期化する。先頭稜線テーブルの初期化は、リンク先稜線IDを全て“−1”に設定することにより行われる。稜線テーブルと先頭稜線テーブルの2つのテーブルにより頂点ID別稜線テーブルを実現する。
次に、頂点構成テーブルより頂点IDペアを抽出するにあたり、ポリゴンIDを“P1”に、頂点順を“0”に初期化する(S201)。そして、頂点構成テーブルより現在のポリゴンIDと頂点順に対応する頂点IDと、次の頂点順に対応する隣接する頂点IDからなる2つの頂点IDペアを抽出する(S202)。次の頂点順は現在の頂点順に1を加えたものであるが、頂点順が“2”の場合、次の頂点順は“0”とする。例えば、図20に示した頂点構成テーブルからは、ポリゴンID“P1”と頂点ID“0”と“1”のペアが抽出される。
次に、抽出された頂点IDペアのうち小さい方の頂点IDを用いて先頭稜線テーブルを参照する(S204)。そして、その頂点IDに対応するリンク先稜線IDが先頭稜線テーブルに登録されているか否かを確認する(S205)。頂点IDに対応するリンク先稜線ID(図中“リンク稜線ID”と表示)が“−1”、すなわち初期状態である場合は、その頂点IDに対応するリンク先稜線IDが未登録、すなわち既登録でないことを意味する。
この場合、先頭稜線テーブルに稜線IDの記録を行う(S206)。具体的には、先頭稜線テーブルの頂点IDに対応するリンク先稜線IDに、現在の稜線ID(初期状態では“0”)を書き込む。続いて、稜線テーブルの現在の稜線IDの位置にステップS202で抽出した頂点IDペアを書き込む(S207)。この時、稜線テーブルにもリンク先稜線IDを書き込む欄があるが、初期状態の“−1”のままにする。また、稜線構成テーブルにおける、ステップS202で抽出したポリゴンIDと頂点順と同値の稜線順の位置に、現在の稜線IDを書き込む。ここでは、新規な稜線IDとして記録されることになる。そして、現在の稜線IDをインクリメントする。
一方、ステップS205において、頂点IDに対応するリンク先稜線IDが“−1”でない場合は、その頂点IDに対応するリンク先稜線IDが既登録であることを意味する。この場合、ステップS202で抽出した頂点IDペアと、頂点座標テーブルにおける既登録のリンク先稜線IDに対応する頂点IDペアが一致するか否かを判定する(S208)。判定の結果、両頂点IDペアが一致する場合は、稜線構成テーブルのポリゴンID、頂点順と同値の稜線順の位置に、現在の稜線IDを記録する(S209)。ステップS208における判定の結果、両座標値が異なる場合は、稜線テーブルのリンク先稜線IDを参照し、リンク先稜線IDが0以上であるか否かを確認する(S210)。確認の結果、リンク先稜線IDが0以上である場合は、その値を稜線IDとし、ステップS208に戻って、その稜線IDに対応する頂点IDペアとステップS202で抽出した頂点IDペアを照合する。ステップS210における確認の結果、リンク先稜線IDが負値(例えば“−1”)である場合は、稜線テーブルのその稜線IDに対応するリンク先稜線IDに現在の稜線IDを記録し、ステップS207に戻って、稜線テーブルの現在の稜線IDの位置にステップS202で抽出した頂点IDペアを記録する。この時、稜線テーブルの現在の稜線IDにおけるリンク先稜線IDについては、初期状態の“−1”のままにする。また、稜線構成テーブルにおける、ステップS202で抽出したポリゴンIDと頂点順と同値の稜線順の位置にと現在の稜線IDを記録する。そして、稜線IDをインクリメントする。
ステップS207またはS209の処理を終えたら、全ポリゴンに対して処理を終えたか否かを判定する(S211)。具体的には、まず、頂点順をインクリメントし、頂点順が“2”を超えたら、ポリゴンIDをインクリメントして頂点順を“0”にする。ポリゴンIDがポリゴン総数を超えていなければ、ステップS202に戻って処理を繰り返す。ポリゴンIDがポリゴン総数を超えていれば、全ポリゴンに対して処理を終えたと判定して処理を終了する。
ポリゴン稜線構造化手段40は、頂点ID照合手段、稜線構成テーブル更新手段、稜線テーブル更新手段を備えており、図21に示したポリゴン稜線の構造化処理は、これらの手段が連携することにより実現される。
図22は、ポリゴンP1の稜線構成が記録された時点の各テーブルの状態を示す図である。図22(a)は頂点構成テーブル、図22(b)は稜線構成テーブル、図22(c)は先頭稜線テーブル、図22(d)は稜線テーブルを示している。先頭稜線テーブルには、頂点IDペアの小さい方の頂点IDに稜線IDが対応付けられてリンク先稜線IDとして記録されている。ここでは、頂点IDが0〜13の値をとるが、最終の頂点ID13を小さい方の頂点IDとする頂点IDペアは存在しないため、先頭稜線テーブルには、最終の頂点ID13を除く全ての頂点ID0〜12に対応付けてリンク先稜線IDが記録される。初期状態では、全て“−1”が記録される。稜線テーブルには、稜線IDに対応付けられて頂点IDペア(図中“頂点ペア”と表示)が記録されるとともに、リンク先稜線IDが記録されている。
図22(b)に示すように、稜線構成テーブルは、ポリゴンIDと稜線順に対応付けて3つの稜線IDが記録されるようになっているが、稜線順は頂点順と同値で、左から0,1,2となっている。ステップS201における初期化の際、頂点順=稜線順=0に初期化される。
図23は、ポリゴンP2の稜線構成が記録された時点の各テーブルの状態を示す図である。図24は、ポリゴンP3の稜線構成が記録された時点の各テーブルの状態を示す図である。図25は、ポリゴンP18の稜線構成が記録された時点の各テーブルの状態を示す図である。図21に示したフローチャートに従って処理を実行していくことにより、図25に示したような状態まで処理が行われることになる。
図25の例で、頂点IDペアの小さい方の頂点IDが“0”の場合、図25(d)の稜線テーブルでは、リンク先稜線IDに従って、稜線ID“0”“2”“3”“8”“10”“12”のものだけ照合すれば、頂点IDペアの登録が可能となる。図25(c)に示した先頭稜線テーブルを削除し、図25(d)に示した稜線テーブルよりリンク先稜線IDの欄を削除することにより、図26に示したような稜線構成テーブルと稜線テーブルを得ることができ、ポリゴン稜線の構造化は完了する。
<2.5.隣接ポリゴンテーブルの作成>
ステップS30の隣接ポリゴンテーブルの作成について説明する。隣接ポリゴンテーブルの作成は、ポリゴンの各稜線(隣接する頂点ペア)と共有する稜線をもつ隣接するポリゴンを探索し、頂点座標配列データをポリゴンIDと稜線順に対応付けて隣接ポリゴンのポリゴンIDで記述した隣接ポリゴンテーブルを作成する処理である。この探索処理はポリゴン数の2乗に比例して処理時間がかかるという問題があった。ステップS20において、稜線構成テーブルを作成しておくことにより、高速に隣接ポリゴンテーブルを作成することができる。
図27は、ステップS30の隣接ポリゴンテーブルの作成の詳細を示すフローチャートである。ステップS30の隣接ポリゴンテーブルの作成は、隣接ポリゴンテーブル作成手段50により行われる。まず、隣接ポリゴンテーブル、稜線ID別ポリゴンテーブル、ポリゴンID、稜線順の初期化を行う(S301)。隣接ポリゴンテーブルは、各ポリゴンと隣接するポリゴンのポリゴンIDを対応付けて記録したテーブルである。稜線ID別ポリゴンテーブルは、稜線IDと稜線を含むポリゴンと当該ポリゴンにおける当該稜線の稜線順を識別するポリゴン別稜線IDを対応付けて記録したテーブルである。隣接ポリゴンテーブルの初期化は、各項目が記録されていない状態にすることを意味する。また、ポリゴンIDと稜線順の初期化として現在のポリゴンIDを“P1”に稜線順を“0”に設定する。稜線ID別ポリゴンテーブルの初期化は、ポリゴン別稜線IDを全て“−1”に設定することにより行われる。
次に、稜線構成テーブルよりポリゴンIDと、そのポリゴンIDに対応する現在の稜線順の稜線IDを抽出する(S302)。例えば、図28に示した稜線構成テーブルからは、ポリゴンID“P1”と稜線ID“0”が抽出される。
次に、抽出された稜線IDを用いて稜線ID別ポリゴンテーブルを参照する(S304)。そして、その稜線IDに対応するポリゴン別稜線IDが稜線ID別ポリゴンテーブルに登録されているか否かを確認する(S305)。稜線IDに対応するポリゴン別稜線IDが“−1”、すなわち初期状態である場合は、その稜線IDに対応するポリゴン別稜線IDが未登録、すなわち既登録でないことを意味する。
この場合、稜線ID別ポリゴンテーブルに現在のポリゴン別稜線IDの記録を行う(S306)。具体的には、稜線ID別ポリゴンテーブルの稜線IDに対応して、現在のポリゴンID(初期状態では“P1”)と稜線順(初期状態では“0”)により特定されるポリゴン別稜線IDを書き込む。
一方、ステップS305において、稜線IDに対応するポリゴン別稜線IDが“−1”でない場合は、その稜線IDに対応するポリゴン別稜線IDが既登録であることを意味し、既登録のポリゴン別稜線IDに対応する稜線と、現在のポリゴンIDと稜線順に対応する稜線とが、その稜線IDで共有することを意味する。この場合、その稜線IDに対応するポリゴン別稜線IDを取得し、隣接ポリゴンテーブルにおける、そのポリゴン別稜線IDにより特定されるポリゴンIDと稜線順の位置に、現在のポリゴンIDを記録する(S307)。ステップS307においては、さらに、隣接ポリゴンテーブルにおける、現在のポリゴンIDと現在の稜線順の位置に、ポリゴン別稜線IDにより特定されるポリゴンIDを記録する。
ステップS306またはS307の処理を終えたら、全ポリゴンに対して処理を終えたか否かを判定する(S308)。具体的には、まず、稜線順をインクリメントし、稜線順が“2”を超えたら、ポリゴンIDをインクリメントして稜線順を“0”にする。ポリゴンIDがポリゴン総数を超えていなければ、ステップS302に戻って処理を繰り返す。ポリゴンIDがポリゴン総数を超えていれば、全ポリゴンに対して処理を終えたと判定して処理を終了する。
隣接ポリゴンテーブル作成手段50は、ポリゴンテーブル登録手段と、隣接ポリゴンテーブル登録手段を備えており、図27に示した隣接ポリゴンテーブルの作成処理は、これらの手段が連携することにより実現される。
図28は、ポリゴンP2のポリゴン別稜線IDが記録された時点の各テーブルの状態を示す図である。図28(a)は稜線構成テーブル、図28(b)は稜線ID別ポリゴンテーブル、図28(c)は隣接ポリゴンテーブルを示している。図28(a)の稜線構成テーブルは、図26(a)の稜線構成テーブルと同一である。稜線ID別ポリゴンテーブルには、稜線IDに対応付けて、ポリゴン別稜線IDが記録されている。ここでは、稜線IDが0〜30の値をとるため、稜線ID別ポリゴンテーブルには、全ての稜線ID0〜30に対応付けてポリゴン別稜線IDが記録される。稜線ID別ポリゴンテーブルにおいては、初期状態では、ポリゴン別稜線IDとして全て“−1”が記録される。図28(b)の空欄においては、実際には、初期値であるポリゴン別稜線IDとして全て“−1”が記録されている。隣接ポリゴンテーブルには、ポリゴンIDに対応付けられて隣接ポリゴンIDが記録される。
図28(c)に示すように、隣接ポリゴンテーブルは、ポリゴンIDに対応付けて3つの隣接ポリゴンのポリゴンIDが記録されるようになっているが、稜線順は、左から0,1,2となっている。ステップS301における初期化の際、稜線順=0に初期化される。隣接ポリゴンテーブルにおいては、必ず、対になるようにポリゴンIDの記録が行われる。すなわち、図28(c)に示すように、ポリゴンP1に対応付けて隣接ポリゴンとしてポリゴンP2が記録された場合、ポリゴンP2に対応付けて隣接ポリゴンとしてポリゴンP1も記録されることになる。
図29は、ポリゴンP4のポリゴン別稜線IDが記録された時点の各テーブルの状態を示す図である。図30は、ポリゴンP18のポリゴン別稜線IDが記録された時点の各テーブルの状態を示す図である。図27に示したフローチャートに従って処理を実行していくことにより、図30に示したような状態まで処理が行われることになる。これにより、図30(c)に示したような隣接ポリゴンテーブルが完成する。
図31は、ステップS10で完成した頂点構成テーブル、ステップS20で完成した稜線構成テーブル、ステップS30で完成した隣接ポリゴンテーブルを示す図である。
<2.6.ポリゴンモデルの分離>
ステップS40のポリゴンモデルの分離について説明する。ポリゴンモデルの分離においては、ステップS30で作成された隣接ポリゴンテーブルを用いる。隣接ポリゴンテーブルを用いることにより、高速にポリゴンモデルの分離を行うことができる。
図32は、ステップS40のポリゴンモデルの分離の詳細を示すフローチャートである。ステップS40のポリゴンモデルの分離は、ポリゴンモデル分離手段80により行われる。まず、グループIDの仮設定を行う(S401)。具体的には、グループを識別するグループ識別情報であるグループIDを新規に定義し、グループIDが未設定のポリゴンを1つ抽出し、そのポリゴンのポリゴンIDに新規なグループIDを仮設定する。ここで、「グループIDが未設定」とは、本設定も仮設定も行われていない状態を意味する。
次に、グループIDの本設定を行う(S402)。具体的には、まず、グループIDが仮設定されているポリゴンを全て抽出し、抽出された各ポリゴンのポリゴンIDに対して、仮設定されているグループIDを本設定する。そして、隣接ポリゴンテーブルを参照し、本設定がなされた各ポリゴンに隣接するグループIDが未設定のポリゴンを全て抽出し、本設定されたグループIDと同一のグループIDを、抽出された全てのポリゴンのポリゴンIDに仮設定する。
次に、グループIDが仮設定されているポリゴンが存在するか否かを判定する(S403)。判定の結果、グループIDが仮設定されているポリゴンが存在する場合は、ステップS402に戻って、グループIDが仮設定されているポリゴンのポリゴンIDに対して、仮設定されているグループIDを本設定し、隣接ポリゴンテーブルを参照し、隣接するグループIDが未設定のポリゴンのポリゴンIDに同一のグループIDを仮設定する処理を繰り返す。
ステップS403における判定の結果、グループIDが仮設定されているポリゴンが存在しない場合は、全ポリゴンについてグループIDの本設定を終了したか否かを判定する(S404)。判定の結果、全てのポリゴンにグループIDが本設定されていない、即ちグループIDが未設定のポリゴンが存在する場合は、ステップS401に戻って、グループIDを新規に定義し、グループIDが未設定のポリゴンIDを1つ抽出し、そのポリゴンIDに新規なグループIDを仮設定する。
ステップS404における判定の結果、全てのポリゴンにグループIDが本設定されている場合は、ポリゴンIDとグループIDの関係を用いて、ポリゴンモデルを分離する(S405)。具体的には、図11に示した頂点座標配列データのポリゴンIDと座標値を、同一グループIDごとに、異なるファイルに分離する。また、バイナリSTL形式のファイルを使用する場合、ポリゴンごとに色情報を指示できる識別フラグを設定できるため、ファイル分離せず同一ファイルのまま、ポリゴンごとの識別フラグにグループIDを設定する方法もとれる。分離された複数のSTL形式ファイルまたはポリゴンごとにグループIDが設定された単一のSTL形式ファイルを3Dプリンタに出力すると、グループIDごとに異なる材料(サポート材を含む)あるいは異なる色の材料(透明材を含む)を指定でき、多色または中身が透けて見える造形物を作成することができる。このように、ポリゴンモデルの分離とは、頂点座標配列データのポリゴンIDと座標値を、同一グループIDごとに、異なるファイルに分離するだけでなく、1つのファイル内で、明確に区別することも含む概念である。
<5.変形例等>
以上、本発明の好適な実施形態について説明したが、本発明は上記実施形態に限定されず、種々の変形が可能である。例えば、上記実施形態では、処理対象のポリゴンを三角形としたが、四角形以上の多角形であってもよい。