[実施の形態1]
図1に、本実施の形態に係る表示処理装置の機能ブロック図を示す。本実施の形態に係る表示処理装置は、CADシステムにより生成された3次元モデルデータを格納している3次元モデル格納部101と、3次元空間内の視点データや照明データ等を格納している表示条件格納部103と、三角形生成部105と、処理途中のデータ等を格納するデータ格納部107と、ループ多角形生成部109と、視線一価領域生成部111と、マスク生成部113と、マスクデータ格納部115と、画像データ生成部117と、描画処理部119とを有する。
三角形生成部105は、3次元モデル格納部101に格納されている基底曲面のデータ及び表示条件格納部103に格納されているデータから、基底曲面を分割して三角形データを生成し、データ格納部107に格納する。また、ループ多角形生成部109は、3次元モデル格納部101に格納されているトリム面のデータ及び表示条件格納部103に格納されているデータから、表示するモデルの詳細度に応じてトリム面の境界を近似したループ多角形のデータを生成し、データ格納部107に格納する。そして、視線一価領域生成部111は、データ格納部107に格納された三角形データ及び表示条件格納部103に格納されているデータを用いて、投影面への写像が全単射であるという条件を満たす視線一価領域のデータを生成し、データ格納部107に格納する。さらに、マスク生成部113は、データ格納部107に格納された視線一価領域の境界データ及びループ多角形のデータを用いてマスクデータを生成し、マスクデータ格納部115に格納する。また、画像データ生成部117は、データ格納部107に格納された三角形データ及び表示条件格納部103に格納されている視点や照明のデータを用いて画像データを生成し、データ格納部107に格納する。そして、描画処理部119は、データ格納部107に格納された画像データ及びマスクデータ格納部115に格納されたマスクデータを用いて描画処理を行う。
ここで、視線一価領域について説明する。まず、視線一価(sight-line single-valuedness)とは、画素と表示対象とが1:1に対応することである。すなわち、視線一価であるとは、表示対象から投影面への写像が全単射(bijective , or one-to-one onto)であることを意味する。図2の例では、基底曲面1101を視点に対して投影面1103上に投影する場合、点P及び点Qが点(画素)Xに対応する。従って、この視点から見た基底曲面1101は視線一価とは言えない。この場合、画素Xのマスク情報で点P及び点Qの表示状態を制御すると、表示において両者に矛盾を生ずる。よって、以下で述べるように基底曲面を分割すると共にマスクを用いた表示制御を行うことにより、トリム面1102上にある点Pを表示し、トリム面1102上にない点Qは表示抑制する。一方、表示対象全体が視線一価であれば、このような問題は生じない。ここでは、視線一価である領域を視線一価領域と呼ぶこととする。
次に、図3乃至図26Bを用いて、図1に示した表示処理装置の処理内容について説明する。なお、3次元モデル格納部101にはトリム面の集まりとして表される3次元モデルデータが、表示条件格納部103には視点データや照明データ等が予め格納されているものとする。
図3は、本実施の形態における処理の流れ(前半)を示したものである。まず、三角形生成部105では、3次元モデル格納部101から3次元モデルとして表された物体の一部に係る基底曲面のデータを取得し、三角形分割の処理が行われる(図3:ステップS1)。本実施の形態では、図4に示した基底曲面及びトリム面を例にして説明する。本ステップでは、例えば図5に示すように分割される。生成される三角形は、u,vパラメタ空間又は3次元空間における点で表現される。なお、図5では均等なパラメタを用いて三角形に分割した例を示しているが、均等な三角形でなくてもよいし、できるだけ正三角形に近いような三角形に分割しても問題ない。生成された三角形データは、データ格納部107に格納される。
より詳細には、まず、表示する3次元モデルの詳細度に基づいて基底曲面の分割数を決定する。詳細度は、例えば表示条件格納部103に格納されている視点データ及び近似許容差に基づいて動的に決定する。詳細度の決定は当業者によく知られた技術であり、例えばShawn P Austin et al., Comparison of Discretization Algorithms for NURBS Surfaces with Application to Numerically Controlled machining, CAD vol. 29 no.1 pp. 71-83や特許4437504号公報に記載されている。
分割数が決定されると、分割点のu,vパラメタが算出できる。そして、算出されたu,vパラメタから三角形の頂点の座標が算出できる。当該座標計算も当業者にはよく知られた幾何学計算であり、例えばGerald Farin; Curves and Surfaces for Computer Aided Geometric Design, 2nd Edition, Academic Press Inc.. CA, USA, 1990に記載されている。
以上の処理によって算出された頂点をu,v方向に接続すると、基底曲面を格子状に分割する四辺形が得られる。そして、当該四辺形の対角を同じ向きに結ぶと、図5に示した格子対角三角形(lattice diagonal triangles)が生成される。格子対角三角形は、u,vパラメタに対応付けられたテーブル状の点の集まりとして表現できる。すなわち、3次元空間又はパラメタ空間中の点を2次元配列で表現できる。格子対角三角形は頂点の特定が容易であり、また、行あるいは列の三角形ストリップを用いた分割三角形の走査が可能であるため、高速処理に有利である。以下、基底曲面を格子対角三角形に分割したものとして説明を行う。なお、三角形ストリップとは高々二つの辺が共有される三角形の連結体を意味するものとする。
次に、ループ多角形生成部109は、3次元モデル格納部101から基底曲面上のトリム面を形成する外ループ及び内ループのデータを取得し、当該外ループ及び内ループを表示するモデルの詳細度に応じて近似してループ多角形(Loop Polygon)を生成する(図3:ステップS3)。ここでは、図6に示すように外ループ多角形1201並びに内ループ多角形1202及び1203が生成される。なお、トリム面の形状によっては内ループが存在しない場合もある。ループ多角形は、多くの場合、3次元空間中の点列として表現されるが、曲線又は曲面のパラメタの列で表現することも可能である。生成されたループ多角形のデータは、データ格納部107に格納される。
本ステップでも、まず外ループ及び内ループを形成する幾何曲線の分割数を決定する。ステップS1と同様に、表示状態における視点と近似許容差に基づいて動的に決定するものであり、ステップS1において決定された詳細度を基準に分割数を決めるようにしてもよい。
分割数が計算されると、分割点の曲線パラメタ又は座標値が算出できる。これもステップS1と同様に、当業者にはよく知られた幾何学計算技術によって実現できる。ここでは、図6における各辺の接続点に相当する分割点も算出される。すなわち、ループ多角形は基底曲面の分割三角形とは独立に、表示するモデルの詳細度に応じてループを近似して生成される(図6白丸)。なお、従来技術では図4の黒丸で示されているようにループ上に分割三角形との交点が付加されるが、本技術では図4の黒丸は付加されない。
なお、一般的に、表示対象の3次元モデルは複数のトリム面によって形成される。すなわち、隣接するトリム面は外ループに係る一部の辺を共有する。共有される辺について既に分割点が計算済みであるならば、同一の分割点を採用するようにしてもよい。
その後、視線一価領域生成部111は、視線一価領域生成処理を実施する(図3:ステップS5)。この視線一価領域生成処理については、図7乃至図9を用いて説明する。なお、本実施の形態で処理対象とする図4に示した基底曲面は、おもて面辺連結体及び裏面辺連結体がそれぞれ視線一価となる。
図7は、本実施の形態における視線一価領域生成処理を示す処理フローである。まず、視線一価領域生成部111は、データ格納部107に格納されており且つステップS1(図3)で生成した三角形データ、及び表示条件格納部103に格納されている視点データを取得し、三角形データ毎に表裏判定を行う(図7:ステップS11)。判定結果を示すデータについては、例えばデータ格納部107に一時的に保持しておく。ここでは、図8に示すように、視点から三角形へのベクトルVと、向き付けられた三角形の法線ベクトルNとの内積である表裏判定内積(side discriminative inner product)を算出し、当該内積が負の値であればおもて面であると判定する。
なお、本ステップは、処理対象をおもて面に限定するために実施するものではない。特別な処理対象の場合、例えばWO00/002165に記載された、閉じた曲面に限定される場合は裏面を処理対象から除外することが行われる。しかしながら、CADという技術分野を主な対象とする場合、一般的に裏面も表示することが要求される。
そして、視線一価領域生成部111は、データ格納部107に格納された表裏判定の結果を示すデータを用いて、辺を共有するおもて面同士又は裏面同士を連結し、おもて面辺連結体及び裏面辺連結体を生成する(図7:ステップS13)。また、視線一価領域生成部111は、例えばおもて面辺連結体及び裏面辺連結体の境界点列のデータをデータ格納部107に格納する。ここでは、図9に示すように、基底曲面を分割することにより得られる三角形を用いて、おもて面が視点を向いている領域(白色の領域)と裏面が視点を向いている領域(ハッチングが施された領域)とが生成される。
規則性を持たない一般的な分割三角形の場合には、1つの三角形からアドバンシングフロント法によっておもて面辺連結体及び裏面辺連結体を生成することができる。一方、基底曲面を格子対角三角形に分割した場合は、格子の列方向又は行方向の三角形ストリップを利用した走査によって高速に処理することができる。
その後、視線一価領域生成部111は、データ格納部107に格納されたおもて面辺連結体及び裏面辺連結体の各々を視線一価領域として特定する(ステップS15)。図4に示した基底曲面の場合は、図9に示したおもて面辺連結体及び裏面辺連結体がそれぞれ視線一価領域と特定される。また、データ格納部107に格納されたおもて面辺連結体及び裏面辺連結体を表す境界点列に関連付けて、視線一価領域であることを示すデータを登録する。そして、視線一価領域生成処理を終了し、図3の処理に戻る。
図3(処理フロー前半図)の処理に戻り、マスク生成部113は、データ格納部107に格納されている未処理の視線一価領域を1つ取得する(ステップS7)。なお、基底曲面全体が視線一価領域の場合は、基底曲面全体が取得される。また、マスク生成部113は、データ格納部107からループ多角形のデータも取得しておく。そして、マスク生成部113は、マスクデータ生成処理を実施する(ステップS9)。このマスクデータ生成処理については、図10乃至図20を用いて説明する。
図10のマスクデータ生成処理において、まず、マスク生成部113は、取得した視線一価領域及びループ多角形の座標をスクリーン座標に変換し、変換後の座標をデータ格納部107に格納する(図10:ステップS31)。本ステップでは、図9のおもて面辺連結体が処理対象の視線一価領域である場合、図11のようにスクリーン座標に変換される。また、図9の裏面辺連結体が処理対象の視線一価領域である場合、図12のようにスクリーン座標に変換される。
次に、マスク生成部113は、データ格納部107に格納されている視線一価領域及びループ多角形のデータを用いて、内ループ及び外ループとおもて面辺連結体又は裏面辺連結体との間の集合積であるループ集合積を生成し、データ格納部107に格納する(図10:ステップS33)。ここでは、視線一価領域並びにこれと交差する外ループ多角形及び内ループ多角形を入力として、外ループ集合積及び内ループ集合積を得る。ループ集合積は、例えば、視線一価領域の境界点列とループ多角形の境界点列との多角形集合演算(Polygon Clipping)により生成することができる。多角形集合演算の実現方法は周知の技術であり、例えばBala R. Vatti, A Generic Solution to Polygon Clipping, Communication of the ACM, July 1992 (vol. 35), pp.56-63に、走査線算法を用いて、和差積の種類に応じて交差による切断片を選択する例が記載されている。なお、ステップS33等で行う集合演算は、パラメタ空間、実体空間、カメラ座標系及びスクリーン座標系のいずれでも行うことが可能である。本実施の形態では、スクリーン座標系を採用するものとする。
本ステップでは、処理対象の視線一価領域に対して、図13に示すような外ループ集合積及び図14に示すような内ループ集合積が得られる。図13では、破線で外ループ集合積の外形が示されている。そして、視線一価領域1301(ハッチングあり)が処理対象の場合、外ループ集合積1302(ハッチングあり)が生成され、視線一価領域1303(ハッチングなし)が処理対象の場合、外ループ集合積1304(ハッチングなし)が生成される。また、図14では、太い実線で内ループ集合積の外形が示されている。そして、視線一価領域1401(ハッチングあり)が処理対象の場合、内ループ集合積1402(ハッチングあり)が生成され、視線一価領域1403(ハッチングなし)が処理対象の場合、内ループ集合積1404(ハッチングなし)及び1405(ハッチングなし)が生成される。
そして、図1のマスク生成部113は、マスクデータ格納部115のマスクデータを、全ての画素についてONに初期化する(図10:ステップS35)。なお、マスクデータは画素単位でON又はOFFに設定され、ONに設定された画素は描画処理が抑制され、OFFに設定された画素は描画処理が行われるものとする。
また、マスク生成部113は、データ格納部107に格納された外ループ集合積の境界データを用いて、外ループ集合積の内部に相当するマスクデータをOFFに設定する(図10:ステップS37)。なお、ループ多角形の内部の画素を特定する方法として、ループ多角形の三角形分割による方法(投影多角形三角形分割法)や、ループ多角形の走査線による塗り潰しによる方法(画素走査線法)がよく知られているが、これらの詳細は後述する。本ステップでは、図13の視線一価領域1301が処理対象の場合、図15の外ループ集合積1501の内部に相当する領域のマスクデータがOFFに設定される。また、図13の視線一価領域1303が処理対象の場合、図15の外ループ集合積1502の内部に相当する領域のマスクデータがOFFに設定される。スクリーン座標上で表すと、図15の外ループ集合積1501には、図16に示すようにOFFが設定され、図15の外ループ集合積1502には、図17に示すようにOFFが設定される。
図13乃至図17に示されているように、ステップS37の外ループ集合積の境界には、ループとおもて面辺連結体又は裏面辺連結体との間の交点以外付加されていない。これに対して従来法では、図4に示されているように、テッセレーションをそのまま用いる方法にせよ、特許文献2に記載されたマスクを用いる方法にせよ、ループと分割三角形との間の交点が多数付加される。本実施の形態では、交点を付加するための交点計算時間や、表示又はマスクデータ生成のための三角形分割等にかかる時間が大幅に削減される。ここに本実施の形態の一つの効果が現れる。
さらにその後、図1のマスク生成部113は、データ格納部107に格納された内ループ集合積のデータを用いて、内ループ集合積の内部に相当するマスクデータをONに設定する(図10:ステップS39)。なお、上でも述べたとおり、トリム面の形状によっては内ループが存在しない場合もある。内ループが存在しない場合、本ステップの処理は省略する。また、内ループ集合積の内部の画素を特定する方法としては、ステップS37と同様に投影多角形三角形分割法や画素走査線法を用いることができる。本ステップでは、図14の視線一価領域1401が処理対象の場合、図18の内ループ集合積1601の内部に相当する領域のマスクデータがONに設定される。また、図14の視線一価領域1403が処理対象の場合、図18の内ループ集合積1602及び1603の内部に相当する領域のマスクデータがONに設定される。スクリーン座標上で表すと、図18の内ループ集合積1601には図19に示すようにONが設定され、図18の内ループ集合積1602及び1603には図20に示すようにONが設定される。そして、マスク生成部113は、未処理の内ループ集合積が存在するか判断し(図10:ステップS41)、存在する場合にはステップS39の処理に戻る。ここでは、内ループの数だけステップS39が繰り返される。一方、未処理の内ループ集合積が存在しない場合、マスクデータ生成処理を終了して図3の処理に戻り、端子Aを介して図21の処理に移行する。
なお、マスクデータを生成する処理は、ループ集合積の排他和によっても実現することができる。排他和を用いる例には、例えば特開平4−289984号公報がある。排他和を用いる場合は、マスクデータがONの画素を表示しOFFの画素を表示抑制するものとして、外ループ多角形及び内ループ多角形の内部をそれぞれONに設定したデータを用いることで、本実施の形態に適用することができる。以上で図3(処理フロー前半図)の処理を終わり、図21に進む。
図21に本実施の形態の処理フロー(後半)を示す。画像データ生成部117は、データ格納部107から、基底曲面を分割することにより生成された三角形データのうち視線一価領域に含まれる未処理の三角形データを1つ取得する(図21:ステップS21)。そして、画像データ生成部117は、当該三角形の画像データを生成し、データ格納部107に格納する(ステップS23)。ここでは、基底曲面を分割することにより生成され、データ格納部107に格納されている三角形データ、並びに表示条件格納部103に格納されている視点データ及び照明データを用いて、画像データを生成する。詳細には、処理対象の三角形を座標変換し、スクリーン座標で表す。また、スクリーン座標系における各画素に対応する三角形上の点について視点からの距離を算出し、奥行き情報(Z値)として保持しておき、Zバッファの値と比較することで隠面消去に利用する。そして、画素の色情報を、例えば図22に示すフォン反射モデル(Phong reflection model)により算出する。なお、出力光強度は、次の式で計算される。ただし、ここでは環境光は省略されている。
C=KdLdcosθ+KsLs(cosα)k
なお、C=出力光強度、Ld=拡散反射(diffuse reflection)光強度、Kd=拡散反射率(正、1未満)、Ks=鏡面反射率(正、1未満)、θ=法線方向と光源方向のなす角、α=鏡面反射光と視点方向のなす角、k=光沢度(滑らかで鏡面反射に近いほど大きい)とする。
以上の処理により、画素の位置、Z値及び色情報が算出される。その後、描画処理部119は、データ格納部107に格納された画像データとマスクデータ格納部115に格納されたマスクデータとを用いてフレームバッファへの描画処理を行う(図21:ステップS25)。ここでは、マスクデータがOFFの画素に対して、当該画素について保持されているZバッファの値とZ値とを比較し、Z値の方が視点側に近い場合、当該画素の色情報でフレームバッファを更新する。また、当該Z値でZバッファを更新する。一方、マスクデータがONの画素については描画を行わない。
その後、画像データ生成部117は、視線一価領域内の三角形について未処理のものが存在するか判断し(図21:ステップS27)、未処理の三角形があれば、ステップS21の処理に戻る。一方、未処理の三角形が存在しない場合、マスク生成部113は、未処理の視線一価領域が存在するか判断し(ステップS29)、未処理の視線一価領域があれば、端子Bを介してステップS7の処理に戻る。一方、未処理の視線一価領域が存在しない場合、処理を終了する。
以上の処理により、1つのトリム面が描画される。表示対象の3次元モデル全体を描画するためには、3次元モデルを形成する複数のトリム面に対してこのような処理を行う。また、例えば視点の位置や角度の変更、表示対象の拡大縮小等に伴い、3次元モデル全体に対してステップS5(図3)以降の処理を再度実施する。なお、ステップS1又はステップS3で用いる詳細度が変化する場合は、ステップS1又はステップS3の処理も再度実施する。また、基底曲面を分割することにより生成された三角形やトリム面の境界を近似することにより生成されたループ多角形について詳細度に応じた点列のデータを保持しておき、再計算を省略できるようにしてもよい。
ここで、ステップS37及びS39(図10)で行うマスクデータの生成について、より詳細に述べる。
(A)投影多角形三角形分割法
本方法では、投影されたループ集合積の境界が形成する多角形を三角形分割し、各三角形の内部に相当する画素のマスクデータを、例えば外ループの場合はOFFに内ループの場合はONに設定する。投影面におけるループ集合積の境界を図23に示すが、白丸はループの分割点若しくはループとおもて面辺連結体又は裏面辺連結体との間の交点である。すなわち、従来法とは異なりループと分割三角形との間の交点を求めないため、従来法に比べて高速な処理が可能になる。図23に示すループ集合積が、例えば図24のように分割される。多角形の三角形分割は、特にループ集合積が凸多角形であることが分かっている場合(例えばループが円であることをCADデータから知ることができた場合)、図25に示すように、任意の頂点と他の頂点とを結ぶ扇形三角形に分割できるため高速に実現可能である。また、一般的な多角形の三角形分割の方法として、単調なy角形を用いるn角形に関する計算量オーダO(nlogn)の平面走査線算法(plane scan line algorithm)と、一つの頂点に隣接する二つの頂点を結んだ線分が他の辺と交差しない三角形チップを順次探索する計算量オーダO(n2)の耳切法(ear clipping)とがよく知られている。なお、n角形は(n−2)個の三角形に分割される。例えば、前者に関しては、ドバークほか著 浅野哲夫訳コンピュータ・ジオメトリ 近代科学社に、また後者に関してはDavid Eberly, Triangulation by Ear Clipping, Geometric Tools, LLC, Last Modified: March 1, 2008 (http://www.geometrictools.com/Documentation/TriangulationByEarClipping.pdfから2010年11月取得可能)に詳細な記載がある。
代表的な上記の2つの三角形分割法では、平面走査線算法の方が高速である。平面走査線算法は、自己交差を有しない単純な多角形を単調なy角形に変換し、単調なy角形を三角形分割する。また、上記の平面走査線アルゴリズムは、内ループを有する場合にもそのまま適用することができる。すなわち、複数の閉じた点列から構成される多角形に対して同一の平面走査線算法を適用することができる。なお、内ループ及び外ループの辺の数の合計がn個、内ループの数がm個の場合、(n−2+2m)個の三角形に分割される。
上記の走査線アルゴルズムを用いて、外ループ集合積及び内ループ集合積に関して同時にマスクデータを生成することができ、ステップS37乃至ステップS41の各々を同時に実行するようにしてもよい。その処理速度は、内外別々に実行する場合に比べて大きな違いはない。
(B)画素走査法
本方法では、まず外ループ集合積の場合(ステップS37)は、外ループ集合積の境界に対応する画素のマスクデータを例えばOFFに設定する。図26Aの例では、境界点列上の画素のマスクデータがOFFになる。その後、スクリーン座標系における画素を左から走査する。また、走査すると共に、マスクデータがOFFの点列との(1からの)交点番号を算出し、当該交点番号が奇数である区間のマスクデータをOFFに設定する。なお、例えば図26Aの黒丸のような極大極小点では交点番号を二つ設定する。図26Aに見るように、多角形内部の画素がOFFになる。一方、内ループ集合積の場合(ステップS39)は、(A)投影多角形三角形分割法の場合と同様に、マスクデータをONに設定する点が異なるのみである。
画素走査法の場合も、図26Bに示すように外ループ集合積および内ループ集合積と走査線との交点番号を算出し、当該交点番号が奇数である区間のマスクデータをOFFに設定することによって、ステップS37乃至ステップS41の各々を同時に実行するようにしてもよい。
以上のような処理を行うことによって、視線一価領域ごとにマスクデータの生成処理及びトリム面の描画処理を行うことができる。なお、視線一価領域同士の重なりは、例えばZバッファを用いた隠面消去により処理される。本実施の形態で例示した単純な物体であれば、上でも述べたとおり、おもて面が視点側を向いた領域と裏面が視点側を向いた領域とをそれぞれ視線一価領域であると判断する。そして、各視線一価領域に対し、トリム面上(外ループの内側且つ内ループの外側)か否かに基づいてマスクデータを生成する。マスクデータは、トリム面の近似点列(外ループ多角形及び内ループ多角形)と視線一価領域(おもて面辺連結体又は裏面辺連結体の境界点列)との集合演算により生成される。基底曲面を分割することにより得られた三角形毎にループ多角形との交点を求める場合と比較すると、本実施の形態ではループ多角形と三角形の各々との交差計算を行わないため、交差する三角形の数が多くなるほど処理負荷の軽減効果がある。
[実施の形態2]
実施の形態1の表示対象は、おもて面辺連結体及び裏面辺連結体がそれぞれ視線一価であったが、おもて面辺連結体又は裏面辺連結体が視線一価にならない場合もあり得る。図27に示す「襞」が現れる例では、おもて面が視点側を向いた連続する面の一部に、図示された視点からは重なって見えない部分が存在する。なお、図27において、黒丸は視点を表し、白丸は視線と基底曲面との交点を表している。また、ハッチングが施された領域は、裏面が視点側を向いており、裏面辺連結体となる。例えば、図示された視線を辿ると、まず手前のおもて面との交点が存在し、次に裏面との交点が存在し、最後に奥のおもて面との交点が存在する。すなわち、この基底曲面から生成されるおもて面辺連結体の投影面への写像は、全単射でない。
同様に、図28に示す中央部に上方へ向かう突起がある例の場合も、図示された視点から見た場合におもて面同士の重なる部分がある。図28では、一点鎖線でパラメタ一定線を示しており、図28の基底曲面は中央が上に凸になった形状であることがわかる。なお、図28においても、黒丸は視点を表し、白丸は視線と基底曲面の交点を表している。また、ハッチングが施された領域は裏面が視点側を向いており裏面辺連結体となる。図示された2つの視線はおもて面と裏面との境界及びおもて面を通るものであり、この基底曲面から生成されるおもて面辺連結体の投影面への写像も全単射でない。
本実施の形態では、視線一価でないおもて面辺連結体又は裏面辺連結体を視線一価領域に分割した上で、マスク生成処理及び描画処理を行う。
図29に、本実施の形態に係る表示処理装置の機能ブロック図を示す。本実施の形態に係る表示処理装置は、CADシステムにより生成された3次元モデルデータを格納している3次元モデル格納部101と、3次元空間内の視点データや照明データ等を格納している表示条件格納部103と、三角形生成部105と、処理途中のデータ等を格納するデータ格納部107と、ループ多角形生成部109と、簡易判定前処理部121と、視線一価領域生成部123と、マスク生成部113と、マスクデータ格納部115と、画像データ生成部117と、描画処理部119とを有する。また、簡易判定前処理部121を有しない場合もある。なお、実施の形態1と同様の処理を行う構成要素には、同じ符号を付してある。
三角形生成部105は、3次元モデル格納部101に格納されている基底曲面のデータ及び表示条件格納部103に格納されているデータから、基底曲面を分割して三角形データを生成し、データ格納部107に格納する。また、ループ多角形生成部109は、3次元モデル格納部101に格納されているトリム面のデータ及び表示条件格納部103に格納されているデータから、トリム面を近似したループ多角形のデータを生成し、データ格納部107に格納する。そして、簡易判定前処理部121は、3次元モデル格納部101に格納されている基底曲面のデータを用いて、当該基底曲面全体が視線一価となる視点であることが保証される座標の範囲を計算し、データ格納部107に格納しておく。また、視線一価領域生成部123は、データ格納部107に格納された三角形データ及び表示条件格納部103に格納されているデータを用いて、投影面への写像が全単射であるという条件を満たす視線一価領域のデータを生成し、データ格納部107に格納する。視線一価領域生成部123は、簡易判定前処理部121が計算したデータを用いて、基底曲面全体が視線一価となるか判断するようにしてもよい。さらに、マスク生成部113は、データ格納部107に格納された視線一価領域のデータ及びループ多角形のデータを用いてマスクデータを生成し、マスクデータ格納部115に格納する。また、画像データ生成部117は、データ格納部107に格納された三角形データ及び表示条件格納部103に格納されている視点や照明のデータを用いて画像データを生成し、データ格納部107に格納する。そして、描画処理部119は、データ格納部107に格納された画像データ及びマスクデータ格納部115に格納されたマスクデータを用いて描画処理を行う。
次に、図30乃至図74を用いて、図29に示した表示処理装置の処理内容について説明する。本実施の形態でも、3次元モデル格納部101にはトリム面の集まりとして表される3次元モデルデータが、表示条件格納部103には視点データや照明データ等が予め格納されているものとする。また、本実施の形態では、図30に示すような基底曲面を処理対象の例として説明する。なお、図示された黒丸は視点を表し、白丸は視線と基底曲面との交点を表している。視点から見た図30の基底曲面は、全体がおもて面であるが、一部は交差して重なっている。
図31は、本実施の形態における処理フロー(前半)である。まず、三角形生成部105は、3次元モデル格納部101から3次元モデルとして表された物体の一部に係る基底曲面のデータを取得し、三角形分割を行う(図31:ステップS51)。また、生成された三角形データは、データ格納部107に格納される。本ステップの処理は、実施の形態1のステップS1(図3)の処理と同様である。ここでは、図30に示した基底曲面が三角形分割される。
次に、ループ多角形生成部109は、3次元モデル格納部101から基底曲面上のトリム面を形成する外ループ及び内ループのデータを取得し、当該外ループ及び内ループを近似してループ多角形を生成する(図31:ステップS53)。生成されたループ多角形のデータは、データ格納部107に格納される。本ステップの処理は、ステップS3と同様である。本実施の形態では、図30に示した基底曲面全体がトリム面であるものとして説明する。
その後、視線一価領域生成部123は、視線一価領域生成処理を実施する(ステップS55)。この視線一価領域生成処理については、図32乃至図65Bを用いて説明する。
まず、視線一価領域生成部123は、視線一価簡易判定処理(オプション)を実施する(図32:ステップS61)。本ステップでは、基底曲面全体が視線一価であるか簡易判定する。当該視線一価簡易判定処理の内容については、後で説明する。そして、視線一価領域生成部123は、基底曲面全体が視線一価領域であるか判断する(図32:ステップS63)。例えば、ステップS61において簡易判定フラグを設定しておき、本ステップでは当該簡易判定フラグに基づいて処理を分岐させる。
基底曲面全体が視線一価領域であると判断された場合、視線一価領域生成部123は、基底曲面全体が視線一価領域であることを示すデータを設定する(図32:ステップS65)。ここでは、ステップS51(図31)で生成された三角形からおもて面辺連結体又は裏面辺連結体を生成し、当該おもて面辺連結体又は裏面辺連結体の境界点列を表すデータをデータ格納部107に格納すると共に、視線一価領域であることを示すデータを登録する。その後、端子Fを介して図33の処理へ移行し、視線一価領域生成処理を終了して図31の処理に戻る。
一方、基底曲面全体が視線一価領域でない場合、端子Eを介して図33の視線一価領域生成処理(後半)へ移行する。なお、図32において破線で示したステップS61乃至ステップS65の処理は必須でない。これらの処理を行わずに、端子Eを介して図33の視線一価領域生成処理(後半)に移行してもよい。
図33の視線一価領域生成処理(後半)に移行して、視線一価領域生成部123は、データ格納部107に格納されているステップS51(図31)で生成した三角形データ、及び表示条件格納部103に格納されている視点データを取得し、三角形データ毎に表裏判定を行う(図33:ステップS71)。本ステップの処理は、ステップS11(図7)と同様である。ここでは、図30に示した基底曲面全体がおもて面であると判定されたものとする。
そして、視線一価領域生成部123は、データ格納部107に格納された表裏判定の結果を示すデータを用いて、辺を共有するおもて面同士又は裏面同士を連結し、おもて面辺連結体及び裏面辺連結体を生成する(図33:ステップS73)。また、視線一価領域生成部123は、例えばおもて面辺連結体及び裏面辺連結体の境界点列のデータをデータ格納部107に格納する。本ステップの処理は、ステップS13(図7)と同様である。ここでは、図30に示した基底曲面全体から1つのおもて面辺連結体が生成されたものとする。
なお、図34に示すような起伏のある形状では、1つの基底曲面から複数のおもて面辺連結体又は複数の裏面辺連結体が生成されることもある。図34では、ハッチングが施された中央の領域は黒丸で示した視点に対して裏面を向いており、裏面辺連結体となる。そして、その両側の白色の2つの領域は視点に対しておもて面を向いており、おもて面辺連結体となる。
ここで、おもて面辺連結体及び裏面辺連結体の境界点列表現について具体例を挙げておく。図28に示した中央部に上方へ向かう突起を有する基底曲面では、おもて面(おもて面が視点側を向いた領域)の内側に裏面(裏面が視点側を向いた領域)が存在する。このように、基底曲面に凹凸がある場合、おもて面に囲われた裏面や裏面に囲われたおもて面が現れることがある。このおもて面と裏面との境界を表裏境界と呼ぶこととし、図28のように閉じた表裏境界を閉表裏境界と呼ぶこととする。また、例えば図28の外周のように、基底曲面の境界に相当する、おもて面辺連結体又は裏面辺連結体の境界を曲面境界と呼ぶこととする。一方、図27に示した基底曲面の表裏境界のように、曲面境界上の2点を結ぶ表裏境界を、開表裏境界と呼ぶこととする。
おもて面辺連結体及び裏面辺連結体の境界は、曲面境界、閉表裏境界及び開表裏境界により表すことができる。また、曲面境界、閉表裏境界及び開表裏境界は、基底曲面を分割することにより得られた三角形の頂点の集まり(点列,polyline)として表現することができる。
従って、おもて面辺連結体及び裏面辺連結体は、例えば図35のように、文脈自由文法の構文を表現するバッカス・ナウア(Backus-Naur)記法を用いて表現することができる。ここで、境界点列は、例えばu,vパラメタ平面上で反時計回りになるような順序で表すものとする。ここで、図35のφは空であることを表す記号である。なお、図28のように、おもて面辺連結体又は裏面辺連結体が他の裏面辺連結体又はおもて面辺連結体を包含する場合、前者は後者を再帰的に用いて表現することができる。このような包含を表す関係情報の生成は、外側の境界点列から内側の各境界点列への並列型のポインティングでも実現できるし、外側の境界点列から内側の境界点列及び内側の境界点列間を関連付ける直列型のポインティングでも実現可能である。保持されるデータは、ソリッドモデリングにおける例えばウイングドエッジ構造等と同型であり、当業者には公知の技術である。なお、図35に示したデータ構造は、重合(後述)を考慮しない状態に対応しており、実施の形態1においても採用することができる。また、後に重合を考慮した段階で、図35に示したデータ構造は図44に示すデータ構造に拡張される。
図27及び図28に示した基底曲面から生成されるおもて面辺連結体をパラメタ平面上に模式的に表すと、図36及び図37のようになる。図36のおもて面辺連結体は、細線で表された曲面境界1702と曲面境界1702上の2点を結ぶ太線で表された開表裏境界1701とで形成され、境界点列として表される。なお、図示した黒丸は開表裏境界点であり、白丸は曲面境界点である。図37のおもて面辺連結体は、細線で表された曲面境界1704と曲面境界1704の内部に存在する太線で表された閉表裏境界1703とで形成され、境界点列として表される。なお、図示した黒丸は閉表裏境界点であり、白丸は曲面境界点である。また、閉表裏境界1703は、おもて面辺連結体に囲われた裏面辺連結体の境界点列として表される。ステップS73(図33)では、おもて面辺連結体又は裏面辺連結体を表すデータとして、このような境界点列データを格納するものとする。
辺連結体などの表現方法の説明から処理の説明に戻り、視線一価領域生成部123は、データ格納部107から未処理のおもて面辺連結体又は裏面辺連結体を1つ取得する(図33:ステップS75)。ここでは、図30に示した基底曲面全体から生成された1つのおもて面辺連結体が取得されたものとする。そして、視線一価領域生成部123は、射影重合多角形生成処理を実施する(ステップS77)。この射影重合多角形生成処理については、図45乃至図56を用いて説明する。
射影重合多角形生成処理では、おもて面辺連結体又は裏面辺連結体の一部に視線一価でない部分がある場合、おもて面辺連結体又は裏面辺連結体を複数の視線一価領域に分割する。具体的には、曲面境界又は表裏境界に沿って走査しつつ、当該曲面境界又は表裏境界をおもて面辺連結体又は裏面辺連結体上に射影した線分の集まりである重合線(superposition polyline)を特定し、当該重合線でおもて面辺連結体又は裏面辺連結体を分割する。
例えば、図30の基底曲面から生成されたおもて面辺連結体の場合は、図38に示すように重合線1801乃至1804が特定される。そして、ハッチングが施された手前の面と奥の面とが異なる視線一価領域に属するように、おもて面辺連結体が分割される。なお、このように視点から見たときに重なる手前の面と奥の面とを重合面(superposition faces)と呼ぶこととする。また、図38のおもて面辺連結体は、例えば投影面上では図39のように表すことができ、パラメタ平面上では図40のように表すことができる。図39において、点v1乃至v4、辺e1乃至e4及び面f1は手前に、点v1 *乃至v4 *、辺e1 *乃至e4 *及び面f1 *は奥に存在するものとし、重なった点、辺及び面は、パラメタ平面上では図40に示すように対応する。
なお、図27の基底曲面の場合は、図41に示すように重合線1901及び1902が特定される。図41では、裏面辺連結体に対してハッチングが施されている。そして、黒丸を視点として、おもて面辺連結体上に表裏境界線を射影すると、重合線1901及び1902が特定される。
また、図28の基底曲面の場合は、図42に示すように重合線2001が特定される。図42でも、裏面辺連結体に対してハッチングが施されている。そして、黒丸を視点として、おもて面辺連結体上に表裏境界線を射影すると、重合線2001が特定される。
さらに、図43に基底曲面の中央が凹になり且つ凹部の先が黒丸で示した視点から見えるような形状の例を示す。図43でも裏面辺連結体に対してハッチングが施されており、基底曲面内部に表裏境界線を有する。また、おもて面辺連結体上に表裏境界線を射影すると、曲面境界と接する重合線2101及び閉表裏境界に接する重合線2102が特定される。
図35に示した境界点列データのデータ構造に対して重合線及び重合面を表すデータを追加したデータ構造の一例を、拡張バッカス・ナウア記法を用いて図44に示す。この例では、おもて面辺連結体又は裏面辺連結体を視線一価となる面分に分割し、視点を基準とした前後関係を表す情報等も保持させるようになっている。
図45に示す射影重合多角形生成処理に入り、視線一価領域生成部123は、処理対象のおもて面辺連結体又は裏面辺連結体を例えば投影面に射影し、射影境界点列のデータをデータ格納部107に格納する(図45:ステップS91)。ここでは、おもて面辺連結体又は裏面辺連結体の境界点列に対して射影行列(射影変換行列)を作用させ、投影面上の境界点列を算出する。上でも述べたとおり、図39に示すような投影面上の境界点列が算出される。なお、投影面の代わりに、視点を含まない平面であれば異なる平面を用いることができる。
そして、視線一価領域生成部123は、重合点特定処理を実施する(図45:ステップS93)。この重合点特定処理については図46乃至図56を用いて説明する。
視線一価領域生成部123は、重合点を計算する。この計算は、セグメントの組の総当たり計算でも行うことができるが、例えば次のような工程を踏むと効率がよい。すなわち、ステップS91(図45)で求めた射影境界点列を例えば反時計回りに任意の点から走査し、x座標の値が単調増加若しくは単調減少する区間、又はy座標の値が単調増加若しくは単調減少する区間に分割し、分割後の境界点列を表す情報をデータ格納部107に格納する(図46:ステップS101)。例えば、図39に示したおもて面辺連結体をy座標の値が単調増加する区間又は単調減少する区間で分割すると、図47のようになる。図47では、上下方向をy軸方向として、y座標の値が単調増加する区間(すなわち減少しない区間)と、y座標の値が単調減少する区間(すなわち増加しない区間)とに分割されている。なお、黒丸で示したva乃至vdは区間の端点であり、単調区間数は4である。
そして、以下のように重合点の有無の簡易判定を行うと処理効率がよい。すなわち、視線一価領域生成部123は、ステップS101で分割したx軸方向又はy軸方向の単調区間数が2以下であるか判断する(ステップ103)。単調区間数が2以下の場合、視線一価領域生成部123は、重合点特定処理を終了し、図45の射影重合多角形生成処理に戻る。
ここで、図48は、y座標の値についての単調区間が2であり、且つ射影境界点列が交差する形状を示している。なお、黒丸は単調区間の境界を示している。図48のように、もしも区間数が2であって投影面上で射影境界点列が交差するとすれば、そもそもその表示対象はおもて面辺連結体又は裏面辺連結体でない。すなわち、おもて面辺連結体又は裏面辺連結体の場合、単調区間数が2以下であれば、境界点列は投影面上で交差せず全体が視線一価であると判断できる。
一方、x軸方向又はy軸方向の単調区間数が2より大きい場合、視線一価領域生成部123は、単調区間の未処理の組合せをデータ格納部107から取得する(ステップS105)。本ステップでは未処理の単調区間の組合せを1組取得し、後のステップにおいて処理対象の単調区間同士が投影面上で交差するか判断する。
次に、視線一価領域生成部123は、処理対象の組合せに係る単調区間が投影面上で交差するか判断する(図46:ステップS107)。ここでは、各単調区間中の隣り合う射影境界点間の線分であるセグメント同士を順次突き合わせ処理する。なお、セグメントの端点で隣り合うセグメント同士は接続されるが、本ステップでは当該端点について交差しているとは判断しない。また、同一単調区間中のセグメント同士が交差することはない。
図49の例では、例えば単調区間vavbと単調区間vcvdとの組合せについて処理を行う場合、va及びvcを起点としてセグメント同士の突合せ処理を行う。例えば、y座標の値でソートされたセグメントについてマッチング処理を行えば、例えばセグメントの全ての組合せについて交差判定を行うよりも処理効率がよい。具体的には、まずセグメントvava1とセグメントvcvc1との組合せについて交差判定し、交差しないと判断される。次に、セグメントva1va2とセグメントvcvc1との組合せについて交差判定し、交差しないと判断される。そして、セグメントva1va2及びセグメントvc1vc2、セグメントva2va3及びセグメントvc1vc2・・・と順次交差判定し、セグメントva3va4及びセグメントvc1vc2が交差すると判断される。その後、セグメントva7vb及びセグメントvc2vdの組合せまで交差判定を行い、単調区間の本組合せについてステップS107の処理が完了する。
単調区間が交差しない場合、処理はステップS117(図46)に移行する。一方、単調区間が交差する場合、視線一価領域生成部123は、投影面上の交点座標を算出する(図46:ステップS109)。ここでは、図50に白丸で示す交点が特定されたものとする。このような投影面上の交点を、以下では自己交差点(self-intersection point)と呼ぶことにする。
そして、視線一価領域生成部123は、重合点を算出する。例えば、当該自己交差点座標を、セグメントのパラメタ座標に変換し、空間座標に変換することによって算出する(ステップS111)。ここでは、図50に白丸で示した自己交差点の座標から、図51に白丸で示すようなパラメタ平面上の2つの座標v1及びv1 *が特定される。なお、このような自己交差点に対応する境界点列上の2点を重合点と呼ぶこととする。
具体的には、複比保存則を用いて投影面上の座標をセグメントのパラメタ座標に変換する。すなわち、図52に示すように、セグメントの両端点を0及び1とするパラメタtが定める直線上の4点の複比と、投影面に射影された4点の複比とが不変であるという性質を利用して、パラメタ座標tへの変換を行う。なお、複比の算出には4点を用いるため、通常一点不足するのでセグメントの端点や交点に加えて、例えばセグメントの中点などの補助の射影点も用いる。以上のような処理により、基底曲面を分割することにより得られた三角形上に、投影面上の点を射影することができる。このような基底曲面(基底曲面を分割することにより得られた三角形)への射影を、以下では曲面射影と呼ぶこととする。
その後、視線一価領域生成部123は、視点から交点座標に対応する2点への3次元空間内の距離を算出する(図46:ステップS113)。ここでは、ステップS111で求めた重合点の座標を用いて、視点からv1及びv1 *への3次元空間での距離を算出する。そして、視線一価領域生成部123は、投影面上の交点に対応する2点を境界点列上に追加する。ここで、視点から見た重なりの前後を示す識別子を付与し(ステップS115)、後の重合面分取得順序設定に利用できるようにしてもよい。重合点及び識別子のデータは、例えば図44に示した構造の境界点列データに追加され、データ格納部107に格納される。対応する重合点は、視点からの距離を基に境界点列データのリスト構造を辿ることで特定できる。図51の例では、対応する2つの重合点のうち視点から遠い方の点に「*」が付されており、図44に示したデータ構造では、「視点側頂点」又は「反視点側頂点」といった順序情報として登録される。また、重合点等により分割された境界点列の一部又は重合線の点列の一部を、部分境界点列と呼ぶこととする。
そして、ステップS107(図46)においてセグメントが交差しないと判断された場合、又はステップS115の後、視線一価領域生成部123は、セグメントの未処理の組合せが存在するか判断する(ステップS117)。未処理の組合せが存在しない場合、重合点特定処理(図46)を終了して図45の射影重合多角形生成処理に戻る。一方、未処理の組合せが存在する場合、ステップS105の処理に戻る。ステップS105乃至ステップS117の処理を繰り返すことにより、図53に示す投影面上の交点が特定され、図54に示す重合点v1乃至v4及びv1 *乃至v4 *が追加される。
ここで、重合点特定処理と図44に示した境界点列データのデータ構造との関係について述べておく。重合点特定処理を実施する前の境界点列データは、図44に示したデータ項目のうち、ソリッドモデリングにおける頂点に対応する重合点等を表す情報、エッジに対応する部分境界点列を表す情報、フェースに対応する面分を表す情報等を有していない。これに対して、境界点列データにおいて重合点が付加されると、部分境界点列及び面分が追加される。図55を用いてパラメタ平面上に示すと、重合点v1が付加されると、破線で範囲を示した部分境界点列b1及び実線で囲われた面分f1が追加される。また、部分境界点列b1には接続される面分f1が1つ対応するため、位相情報として部分境界点列と面分との接続情報が保持される。そして、図56に示すように、対応する重合点v1 *が境界点列にさらに付加されると、部分境界点列b1及びb2の2つに分割される。このとき、境界点列データにおいて、部分境界点列b1と面分f1との接続情報は変更されず、分割された部分境界点列b2と面分f1との接続情報が追加される。このような重合点追加の位相処理は、ソリッドモデリングにおけるエッジ分割処理に相当し、当業者には公知の技術である。
図45の射影重合多角形生成処理に戻り、視線一価領域生成部123は、データ格納部107に格納されたおもて面辺連結体又は裏面辺連結体の境界点列データを基に、処理対象の辺連結体に重合点が存在するか判断する(図45:ステップS95)。なお、重合点が存在しなければ、処理対象のおもて面辺連結体又は裏面辺連結体は視線一価である。重合点が存在しない場合、射影重合多角形生成処理を終了し、図33の視線一価領域生成処理(後半)に戻る。
一方、重合点が存在する場合、視線一価領域生成部123は、データ格納部107に格納されたおもて面辺連結体又は裏面辺連結体のデータから、表裏境界上の特異点を探索する(図45:ステップS97)。ここで、表裏境界線と重合線とが接する点を特異点(singularity point)と呼ぶこととする。すなわち、特異点とは、視点から重なって見える表裏境界線及び重合線のうち、手前に存在する線分と奥に存在する線分とが1点に縮退した点である。図57に、図27の基底曲面のうちおもて面辺連結体を投影面上に表した模式図を示す。なお、ハッチングが施された領域は重合面を示している。図57の例では、v13が特異点であり、v11及びv11 *が重合点である。また、図57は図58のようにパラメタ平面上に表すことができ、境界点列v11v12v13v11 *と、重合線v11 *v12 *v13v11とが、v131点で接している。
次に、特異点を特定するための処理について説明する。まず、特異点では、表裏境界上の1頂点から当該1頂点に隣接する2つの頂点へ至るベクトルと視線ベクトルとが形成する2つの平面の各々が、当該表裏境界上の1頂点を含み隣接する2頂点を含まない三角形と交差する。ステップS97では、表裏境界上の点列を走査し、このような条件を満たす点を探索する。
ここで、特異点に関する条件について図59A乃至図59Cを用いて説明する。図59A乃至図59Cにおいて、P1、P2、P3、P11、P12及びP13は、基底曲面を分割することにより生成された三角形の頂点を表している。また、P1、P2及びP3は表裏境界上の点であり、P11、P12及びP13は辺連結体内部の点である。また、ハッチングが施された三角形X1及びX2は、表裏境界上の1点P2を含み、P2に隣接する2点P1及びP3を含まない三角形である。なお、点Qは視点を表している。
ステップS97(図45)では、表裏境界上の点列を走査し特異点を探索する。図59Aでは、太線で示された表裏境界線上の点P1、P2及びP3が上で述べた条件を満たすか判断する。P2が処理対象であるとき、まず、図59Bに示すように、視点Qから点P2へのベクトルとP2から隣接する点P1へのベクトルとが形成する第1の平面が、三角形X1又はX2と交差するか判断する。ここでは、交線1801で交差するものとする。また、図59Cに示すように、視点Qから点P2へのベクトルと、P2から隣接する点P3へのベクトルとが形成する第2の平面が、三角形X1又はX2と交差するか判断する。ここでは、交線1802で交差するものとする。このように、2つの平面がそれぞれ条件を満たす場合、点P2は特異点であると判断される。なお、図59A乃至図59Cは、例えば図57及び図58における点v13周辺を拡大したものに相当し、図59A乃至図59Cの点P2は図57及び図58の点v13に相当する。
なお、おもて面辺連結体の内側に裏面辺連結体が存在する図28に示したような場合も、図59A乃至図59Cを用いて説明した条件に基づいて特異点を探索することができる。また、中心部に上方へ凸な形状を有する場合の図60に示すように、特定された特異点は、表裏境界線と重合線(太い実線)との接点である。また、データ格納部107に格納された境界点列データに対し、特異点であることを示す識別子を付与する。そして、特異点により、部分境界点列はさらに2つの部分境界点列に分割されるものとする。なお、この特異点追加の位相処理はソリッドモデリングにおけるエッジ分割処理に相当し、当業者には公知の技術である。
その後、視線一価領域生成部123は、重合面分特定処理を実施する(図45:ステップS99)。この重合面分特定処理で図61の処理フローに進む。その処理については、図61乃至図67を用いて説明する。
重合面分特定処理では、重合点又は特異点から境界点列を走査して、おもて面辺連結体又は裏面辺連結体の内部に射影される重合線を特定し、当該重合線により辺連結体を分割する。そして、分割された面分のうち投影面上で重なる重合面分に対し対応関係を登録する。
図61に重合面分特定処理の処理フローを示す。まず、視線一価領域生成部123は、データ格納部107に格納された境界点列データから重合点又は特異点を端点とする未処理のセグメントを1つ取得する(図61:ステップS121)。図62に示す例では、重合点v
1を端点とするセグメントv
1xが取得されたものとする。そして、視線一価領域生成部123は、取得したセグメントが例えば投影面上においておもて面辺連結体又は裏面辺連結体の内部に射影されるか判断する(ステップS123)。ここでは、セグメントの一端である重合点又は特異点とは反対側の端点が、投影面においておもて面辺連結体又は裏面辺連結体の内部に射影されるか判定する。具体的には、図63に示すように、投影面に射影された表裏境界点v
1及びv
2と、曲面境界点w
1及びw
2と、自己交差点xと、おもて面辺連結体の法線ベクトルnとを用いて、以下に示す式(1)の値が正であれば、v
2がおもて面辺連結体の内部に存在すると判断する。
辺連結体内部へ射影されない場合、処理はステップS135(図61)へ移行する。一方、辺連結体内部へ射影される場合、視線一価領域生成部123は、処理対象のセグメントの曲面射影を行う(ステップS124)。図62を用いてパラメタ平面上に表すと、ステップS124において、セグメントv1xは重合線v1 *x*として辺連結体内部へ射影される。そして、視線一価領域生成部123は、射影された重合線が他の重合線と交差するか判断する(ステップS125)。図62の例では、他の重合線とは交差しないと判断される。交差しない場合、ステップS129の処理に移行する。一方、交差する場合、視線一価領域生成部123は、データ格納部107に格納された境界点列データにおいて重合線の点列の交点に重合点を追加し、当該重合点で重合線を分割する(ステップS127)。
ここで、例えば図64に示すように、重合線同士が交差する場合がある。図64の例では、既に重合線・・・p25p26p27p28・・・が射影されており、新たに重合線v21p21p22p23p24が射影されたものとする。その後、重合線p23p24が射影され、ステップS125において交差判定が行われると、既に存在する重合線と交差したと判断される。そして、ステップS127(図61)において、データ格納部107の境界点列データにおいて重合線の部分境界点列に交点q21が追加されると共に、部分境界点列はさらに・・・p25p26q21、q21p27p28・・・及びv21p21p22p23q21に分割される。また、その後に射影されるq21p24p25v22も部分境界点列としてデータ格納部107の境界点列データに登録される。なお、f1乃至f4は、部分境界点列によって分割された面分を表しており、このような面分のデータも後の処理で登録される。
ステップS125(図61)で他の重合線と交差しないと判断された場合、又はステップS127の後、視線一価領域生成部123は、処理対象のセグメントが他の重合点又は特異点に到達したか判断する(ステップS129)。ここでは、ステップS121で取得されたセグメントの重合点又は特異点を起点として、ここまでの処理で基底曲面へ射影されたセグメントの他端が重合点又は特異点であるか判断する。具体的には、データ格納部107に格納されている境界点列データを参照し、セグメントの他端を表す点に重合点及び特異点を表す識別子が登録されているか判断する。
重合点又は特異点に到達していない場合、視線一価領域生成部123は、ステップS121(図61)で取得されたセグメントの重合点又は特異点を起点として、ここまでの処理で射影されたセグメントの他端に隣接するセグメントの曲面射影を行う(ステップS131)。その後、処理はステップS124へ戻る。図62の例では、ステップS129において、初めに取得されたセグメントv1xの端点xは重合点又は特異点でないと判断され、ステップS131において隣接するセグメントxv2が取得された後、ステップS124において重合線x*v2 *が射影される。
一方、重合点又は特異点に到達した場合、視線一価領域生成部123は、重合線及び重合面分を表すデータを、おもて面辺連結体又は裏面辺連結体を形成する面分としてデータ格納部107に登録する(図61:ステップS133)。図62の例では、セグメントxv2が射影された後、ステップS129において重合点v2に到達したと判断され、ステップS133において重合線を表す部分境界点列及び部分境界点列により表される面分のデータが登録される。
なお、生成された重合線は辺連結体を形成する面分を分割し、2つの面分への接続情報を有する。また、部分境界点列は向きが同調するように保持され、面分を形成する。重合線を追加する位相処理は、ソリッドモデリングにおけるフェース分割処理に相当し、当業者には公知の技術である。
その後、視線一価領域生成部123は、重合点又は特異点を端点とする未処理のセグメントが存在するか判断する(図61:ステップS135)。存在する場合、ステップS121の処理に戻る。一方、未処理のセグメントが存在しない場合、視線一価領域生成部123は、データ格納部107に格納された境界点列データを基に対応する重合面分を特定し、境界点列データに面分間の対応を表すデータを登録する(ステップS137)。上でも述べたように、重合点には、対応する重合点及び視点から見たときの前後関係を表す順序情報が登録されている。具体的には、図44に示したように、v1には反視点側頂点としてv1 *が登録されており、v1 *には視点側頂点としてv1が登録されている。同様に、v2及びv2 *、v3及びv3 *、v4及びv4 *、x及びx*等の対応関係も登録されている。重合点の対応関係がわかれば、対応する重合点を含む部分境界点列同士が対応すると判断でき、対応する部分境界点列によって囲われた面分同士も対応すると判断できる。ステップS137では、部分境界点列間及び面分間の対応関係が特定され、部分境界点列の順序情報及び面分の順序情報としてデータ格納部107に登録される。
図62の例に対しステップS121乃至ステップS135(図61)の処理を繰り返すことで、最終的には図65Aに示すような重合線が追加され、処理対象のおもて面辺連結体は面分f1乃至f5に分割される。また、ステップS137では、部分境界点列b1及び重合線v1 *v2 *、部分境界点列b4及び重合線v2v3、部分境界点列b5及び重合線v3 *v4 *、並びに部分境界点列b8及び重合線v4v1を形成する点の順序情報から、図65Aにおいて一点鎖線の矢印で示した点列の対応関係がわかるため、これらの点列で囲われた面分f2及び面分f5が対応する重合面分であると特定される。以上の処理により、面分の位相情報及び重合面分の対応関係が登録される。なお、重合線で分割された面分はそれぞれが視線一価である。図65Aのおもて面辺連結体を投影面上に表した例を図65Bに示す。
ここで、重合線と重合線とが交差する場合について補足する。例えば、図66に示すおもて面辺連結体には、対応する3つの重合面分が存在している。このような辺連結体であっても、上で述べた重合点特定処理及び重合面分特定処理により面分を分割することができる。また、このような面分についても、視点側及び反視点側の面分が登録され、リスト構造を辿ることで重合面分を特定できる。
なお、重合面分の数は、射影境界点列で表された面分上の点に対する射影境界点列の回転数(rotation number)を用いて計算することができる。回転数とは、閉曲線C(t)をパラメタに沿って1周するとき、ある点pの周囲を正方向に回転する数をいうものとする。ここで、回転数は対応する面分の数を表している。すなわち、図66において回転数が1の面分は、他に重合面分が存在しないことを意味し、回転数が2の面分は、他に1つの重合面分が存在することを意味している。図67では、反時計回りを正方向とすると、点p1、p2及びp3の周りの回転数はそれぞれ+1、−1及び0である。なお、投影面上の自己交差点の周囲に存在し且つ回転数の符号が異なる射影境界点列は、おもて面辺連結体又は裏面辺連結体の境界ではないと判断することができる。
ステップS137(図61)の後、重合面分特定処理を終了して図45の射影重合多角形生成処理に戻り、さらに射影重合多角形生成処理を終了して図33の視線一価領域生成処理(後半)に戻る。そして、視線一価領域生成部123は、視線一価領域確定処理を実施する(図33:ステップS79)。ここで図68Aに進むが、この視線一価領域確定処理については、図68A乃至図70を用いて説明する。
視線一価領域確定処理は、実際に表示する視線一価領域を確定する処理である。最も単純な視線一価領域確定法は、特定した面分を視線一価領域とする方法である。単純な視線一価領域確定処理の手順を図68Bに示す。
図68Bの視線一価領域確定処理では、視線一価領域生成部123は、データ格納部107から未処理の面分を1つ抽出し、当該面分に対して視線一価領域であることを表すデータを登録する(図68B:ステップS191)。そして、視線一価領域生成部123は、データ格納部107に未処理の面分が存在するか判断し(ステップS193)、存在する場合、ステップS191の処理に戻る。一方、存在しない場合、視線一価領域確定処理を終了して図33の視線一価領域生成処理(後半)に戻る。このように、各面分を視線一価領域として確定させても問題ない。
しかしながら、例えば図65Bを観察すると面分f1、f2、f3を1つの視線一価領域としても問題ないことが分かる。位相演算は高速処理が可能であるから、分割された面分を結合して処理の効率化を図ってもよい。視線一価領域生成処理では、重合面分特定処理において分割された面分を基に、接続しても全体が視線一価となる隣接した面分同士を接続する。すなわち、1つの視線一価領域がより広くなるように、分割された面分を接続し直す。以下この処理を行う方法を説明する。
まず、視線一価領域生成部123は、データ格納部107に格納された境界点列データを取得し、おもて面辺連結体又は裏面辺連結体が重合面分を含んでいるか判断する(図68A:ステップS141)。具体的には、境界点列データにおいて、対応する視点側面分又は反視点側面分の登録があるか否かにより判断できる。例えば図65Aのおもて面辺連続体は、対応する面分f2及び面分f5を含むものと判断される。重合面分が存在しない場合、視線一価領域生成部123は、例えばおもて面辺連結体又は裏面辺連結体が視線一価領域であることを表すデータをデータ格納部107に格納する(ステップS157)。例えば、境界点列データにおいて辺連結体のデータに対して視線一価であることが確定したことを示すフラグを立ててもよいし、後の処理において辺連結体のデータが面分に分割されていない場合は全体が視線一価であるものと扱うようにしてここでは特別なデータを登録しなくてもよい。その後、視線一価領域確定処理を終了し、図33の視線一価領域生成処理(後半)に戻る。
一方、ステップS141(図68A)において重合面分が存在すると判断された場合、視線一価領域生成部123は、各面分を初期的に仮の視線一価領域としてデータ格納部107に登録する(ステップS143)。例えば、境界点列データの辺連結体に含まれる面分のデータに対して視線一価であることを示すフラグを立ててもよいし、後の処理において各面分が視線一価であるものと扱うようにしてここでは特別なデータを登録しなくてもよい。図65Aに示した例では、例えば、面分f1乃至f5に対してそれぞれ視線一価領域であることを表すデータが登録される。そして、視線一価領域生成部123は、データ格納部107の境界点列データから未処理の重合面分を1つ取得する(ステップS145)。ここでは、例えば、対応する面分が順序情報に登録されている重合面分であって、当該重合面分及び対応する面分(対応する面分が複数存在する場合は、対応する面分のうち少なくとも1つ)がいずれも未処理であるという条件を満たす重合面分を1つ取得する。なお、取得された重合面分に対応する面分を、便宜上カウンタパートと呼ぶこととする。ここでは、図65Aのおもて面辺連結体から、面分f5が取得され、取得された面分の順序情報から面分f2がカウンタパートとして特定されるものとする。
その後、視線一価領域生成部123は、処理対象の面分Xに隣接する未処理の面分を1つ取得する(図68A:ステップS147)。具体的には、処理対象の面分Xと辺(部分境界点列)を共有する未処理の面分が取得される。ここでは、図65Aの面分f4が取得されたものとする。そして、視線一価領域生成部123は、当該面分Xに隣接する面分と面分Xのカウンタパートとが隣接するか判断する(ステップS149)。ここでは、隣接する面分とカウンタパートとが辺を共有するか判断する。隣接する面分とカウンタパートとが隣接する場合、処理はステップS153に移行する。なお、図65Aの例では、面分f5に隣接する面分f4と面分f5のカウンタパートf2とは辺を共有しておらず、隣接しないと判断される。隣接する面分とカウンタパートとが隣接しない場合、視線一価領域生成部123は、隣接する面分を処理対象の面分に結合する(ステップS151)。ここでは、図69に示すように、面分f4及び面分f5を1つの面分に結合する。なお、この後の処理では、結合された面分f4及び面分f5を処理対象の面分であるものとして扱う。
ステップS149(図68A)において隣接する面分とカウンタパートとが隣接しないと判断された場合、又はステップS151の後、視線一価領域生成部123は、データ格納部107の境界点列データにおいて、処理対象の面分に隣接する未処理の面分が存在するか判断する(ステップS153)。未処理の面分が存在する場合、処理はステップS147に戻る。図69の例では、面分f1が未処理の隣接する面分である。面分f1は、ステップS147において取得され、その後のステップS149では面分f5のカウンタパートf2に隣接すると判断され、再びステップS153に移行する。
一方、ステップS153(図68A)において隣接する未処理の面分が存在しないと判断された場合、視線一価領域生成部123は、データ格納部107の境界点列データにおいて、未処理の重合面分が存在するか判断する(ステップS155)。なお、処理対象であった面分は処理済みとし、当該面分を1つの視線一価領域として確定させる。ステップS155では、ステップS145と同様に、未処理の重合面分であって、カウンタパートのうち少なくとも1つが未処理であるという条件を満たすものが存在するか判断する。未処理の重合面分が存在する場合、処理はステップS145に戻る。
一方、未処理の重合面分が存在しない場合、視線一価領域生成部123は、未処理の面分のうち隣接する面分を結合する(ステップS156)。例えば、図70に示すように、残った仮の視線一価領域である面分f1、f2及びf3を1つの視線一価領域として結合する。その後、視線一価領域確定処理を終了して図33の処理に戻る。
視線一価領域確定処理では、対応する複数の重合面分が1つの視線一価領域に含まれないように結合されればよい。よって、ステップS149において隣接する面分自体がカウンタパートでなければ、ステップS151において処理対象の面分に結合するようにしてもよい。また、重合面分特定処理において分割された面分はそれぞれが視線一価であるため、視線一価領域確定処理を実施せずに各面分を視線一価領域として扱うようにしてもよい。なお、ステップS145において重合面分を取得する順番は任意であるが、例えば視点に近い順に取得してもよい。また、これらの内部的な処理は、ソリッドモデリングにおいて頻繁に行われるものであり、当業者には公知である。
図33の視線一価領域生成処理(後半)に戻り、視線一価領域生成部123は、データ格納部107において未処理のおもて面辺連結体又は裏面辺連結体が存在するか判断する(ステップS81)。未処理のおもて面辺連結体又は裏面辺連結体が存在する場合、処理はステップS75に戻る。一方、未処理のおもて面辺連結体又は裏面辺連結体が存在しない場合、視線一価領域生成処理を終了して図31の処理に戻る。
図31の処理に戻り、マスク生成部113は、データ格納部107に格納されている未処理の視線一価領域を1つ取得する(ステップS57)。本ステップの処理は、ステップS7と同様である。なお、基底曲面全体が視線一価領域の場合は、基底曲面全体が取得される。また、マスク生成部113は、データ格納部107からループ多角形のデータも取得しておく。ここでは、視線一価領域として図70の面分f4及びf5が取得されたものとする。また、上でも述べたとおり、図30に示した基底曲面は全体がトリム面であるため、基底曲面の外形を近似した外ループ多角形のデータが取得される。なお、本実施の形態の説明に用いた例では内ループ多角形は存在しない。そして、マスク生成部113は、マスクデータ生成処理を実施する(ステップS59)。このマスクデータ生成処理については、図71及び図72を用いて説明する。
図71にマスクデータ生成処理の処理フローを示す。まず、マスク生成部113は、取得した視線一価領域及びループ多角形の座標をスクリーン座標に変換し、変換後の座標をデータ格納部107に格納する(図71:ステップS161)。本ステップの処理は、ステップS31(図10)と同様である。本実施の形態でもスクリーン座標系を用いるものとして説明する。本ステップでは、図70の面分f4及びf5が処理対象の視線一価領域である場合、図72のようにスクリーン座標上に変換される。図72では、破線で面分f1乃至f3も示している。
次に、マスク生成部113は、データ格納部107に格納されている視線一価領域及びループ多角形のデータを用いて、ループ集合積を生成し、データ格納部107に格納する(ステップS163)。本ステップの処理は、ステップS33(図10)と同様である。本ステップでは、処理対象の視線一価領域に対して、図72に示したものと同様の形状の外ループ集合積が得られる。
なお、視線一価領域及びループ多角形の境界点列データを利用し、先に説明した和差積の種類に応じて交差による切断片を選択する多角形集合演算(Polygon Clipping)より高速な集合演算が可能となる。例えば、ループ多角形と視線一価領域の境界とが交差しない場合であって、ループ多角形が視線一価領域に内包されているときは、ループ多角形がループ集合積であり、内包されていないときは、ループ集合積は存在しない。そして、ループ多角形と視線一価領域の境界とが交差する場合、ループ多角形は曲面境界では視線一価領域境界と交差することはなく、表裏境界線上又は重合線上で交差する。このようなときも、視線一価領域の境界点列の向きと、ループ多角形の境界点列の向きとを矛盾なく選択する(同調させる)ことによって、上記の多角形集合演算(Polygon Clipping)より高速にループ集合積を計算することができる。
そして、マスク生成部113は、マスクデータ格納部115のマスクデータを初期化する(図71:ステップS165)。本ステップの処理は、ステップS35と同様であり、マスクデータ全体をONに初期化しておく。また、マスク生成部113は、データ格納部107に格納された外ループ集合積のデータを用いて、外ループ集合積の内部に相当するマスクデータをOFFに設定する(ステップS167)。ただし、ステップS65(図32)で基底曲面全体を視線一価領域に設定し、且つトリム面と基底曲面の境界が一致しており、例えば簡易判定処理で視線一価であるとの結果を得た場合には、画面全体のマスクデータをOFFに設定してもよく、マスクを用いずに画面全体を表示するようにしてもよい。本ステップの処理は、ステップS37(図10)と同様であり、図72の外ループ集合積の内部に相当する領域のマスクデータがOFFに設定される。
その後、マスク生成部113は、データ格納部107に格納された内ループ集合積のデータを用いて、内ループ集合積の内部に相当するマスクデータをONに設定する(図71:ステップS169)。本ステップの処理は、ステップS39(図10)と同様である。本実施例では内ループが存在しないため、本ステップでONに設定される領域は存在しない。そして、マスク生成部113は、未処理の内ループ集合積が存在するか判断し(ステップS171)、存在する場合にはステップS169の処理に戻る。内ループが存在する場合は、内ループの数だけステップS169が繰り返される。一方、未処理の内ループ集合積が存在しない場合、マスクデータ生成処理を終了して図31の処理に戻り、端子Cを介して図73の処理に移行する。
その後、画像データ生成部117は、データ格納部107から、基底曲面を分割することにより生成された三角形データのうち視線一価領域に含まれる未処理のデータを1つ取得する(図73:ステップS181)。本ステップの処理は、ステップS21(図21)と同様である。そして、画像データ生成部117は、当該三角形の画像データを生成し、データ格納部107に格納する(ステップS183)。ここでは、基底曲面を分割することにより生成され、データ格納部107に格納されている三角形データ、並びに表示条件格納部103に格納されている視点データ及び照明データを用いて、画像データを生成する。本ステップの処理は、ステップS23(図21)と同様である。
その後、描画処理部119は、データ格納部107に格納された画像データとマスクデータ格納部115に格納されたマスクデータとを用いてフレームバッファへの描画処理を行う(図73:ステップS185)。ここでは、マスクデータがOFFの画素に対して、当該画素について保持されているZバッファの値とZ値とを比較し、Z値の方が視点側に近い場合、当該画素の色情報でフレームバッファを更新する。また、当該Z値でZバッファを更新する。一方、マスクデータがONの画素については描画を行わない。本ステップの処理は、ステップS25(図21)と同様である。
その後、画像データ生成部117は、視線一価領域内の三角形について未処理のものが存在するか判断し(図73:ステップS187)、未処理の三角形があれば、ステップS181の処理に戻る。一方、未処理の三角形が存在しない場合、マスク生成部113は、未処理の視線一価領域が存在するか判断し(ステップS189)、未処理の視線一価領域があれば、端子Dを介してステップS57(図31)の処理に戻る。一方、未処理の視線一価領域が存在しない場合、処理を終了する。
以上の処理により、1つのトリム面が描画される。本実施の形態では、図72の視線一価領域に対して描画処理を行った後、端子Dを介してステップS57の処理に戻る。そして、図70の面分f1、f2及びf3を結合した視線一価領域について、図74に示すように描画処理を行う。なお、例えばZバッファを用いた隠面消去により、最終的には面分f5が表示され、面分f2は表示されない。
また、本実施の形態では、対応する重合面が異なる視線一価領域に属するように面分を分割するため、それぞれを適切に描画できる。本実施の形態では基底曲面全体がトリム面であるものとしたが、例えばトリム面のうち面分f5に相当する部分に外ループ又は内ループが存在する場合であっても、面分f5と面分f2とが異なる視線一価領域に属しそれぞれに対してマスクが生成されるため、外ループの外側又は内ループの内側には奥の面分f2が描画されるようになる。
また、視線一価領域確定処理においてより大きな視線一価領域を生成するため、従来のように基底曲面を分割することにより得られた三角形毎にループ多角形との交点を求める場合よりも交差計算の量が少なくなり、処理負荷が軽減される。
[視線一価簡易判定処理]
実施の形態2において説明を先送りした視線一価簡易判定処理(図32:ステップS61)について、図75乃至図87を用いてここで説明する。視線一価簡易判定処理では、基底曲面全体が視線一価が保証される領域を基底曲面毎に予め計算しておく。そして、当該領域に視点の位置が属するか否かにより、基底曲面全体が視線一価であるか否かを判断する。なお、上記の基底曲面全体が視線一価であることが保証される視点の座標の集まりである立体を、以下では視線一価確定ボリューム(sight-line single-valuedness definite volume)と呼ぶこととする。
例えば工業的に利用されるトリム面を表すための基底曲面には、視線一価確定ボリュームが存在することが多く、一般的に視点が視線一価確定ボリュームに含まれることも多い。従って、視線一価簡易判定処理は表示速度を向上させるために有効である。なお、例えば図75に示す基底曲面のように、視線一価確定ボリュームが存在しない基底曲面もある。
視線一価簡易判定処理の処理内容について、図76を用いて説明する。まず、視線一価領域生成部123は、処理対象の基底曲面について今回が初回の処理であるか判断する(図76:ステップS201)。ここでは、例えば、処理対象の基底曲面に対応付けられた視線一価確定ボリュームがデータ格納部107に格納されているか判断する。初回の処理でない場合、処理はステップS205へ移行する。一方、初回の処理である場合、簡易判定前処理部121は、確定ボリューム生成処理を実施する(ステップS203)。確定ボリューム生成処理については、図77乃至図86を用いて説明する。なお、本実施の形態では初回判定方式を採用しているが、たとえばCADシステムなどの別工程で確定ボリューム生成処理を行ってもよい。
図77に確定ボリューム生成処理の処理フローを示す。まず、簡易判定前処理部121は、データ格納部107に格納されている処理対象の基底曲面のデータを三角形分割し、格子点のデータをデータ格納部107に一時的に保持させておく(図77:ステップS211)。ここでは、例えば所定の詳細度に基づいて格子対角三角形に分割する。なお、三角形分割はステップS1(図3)及びステップS51(図31)と同様の処理である。また、本実施例では三角形分割方式を採用しているが、曲面式から直接計算する方式を採用してもよい。
次に、簡易判定前処理部121は、データ格納部107に保持されている格子点のデータを用いて、基底曲面が平面であるか判断する(図77:ステップS213)。ここでは、例えば格子の四隅のうちの3点から決まる平面上に他の1点が存在するかを判断する。なお、四隅の点以外を用いてもよく、5点以上を用いて判断するようにしてもよい。基底曲面が平面であると判断された場合、簡易判定前処理部121は、当該基底曲面が含まれる平面のデータを特定し、フラグ「平面」と平面を定義するデータとを、処理対象の基底曲面に関連付けてデータ格納部107に格納する(ステップS215)。平面を定義するデータとしては、例えば3つの格子点の座標を格納する。
基底曲面が平面の場合は当該基底曲面を含む平面上以外が視線一価確定ボリュームとなる。例えば、図78において平面とその法線が表されているものとすると、平面の矢印側の空間からはおもて面が見え、反対側の空間からは裏面が見える。また、データ格納部107に格納されるデータの例を図79に示す。基底曲面が平面である場合には、例えば1行目のデータのようにフラグ「平面」と平面の幾何データとが登録される。ここでオプションとして、トリム面と基底曲面の境界が合致するかどうか検査して、結果を付帯情報として記録してもよい。その後、確定ボリューム生成処理を終了し、図76の処理に戻る。
一方、基底曲面は平面でない場合、簡易判定前処理部121は、データ格納部107に格納されている処理対象の基底曲面が円弧掃引体であるか判断する(図77:ステップS217)。ここでは、一方のパラメタ値を固定しつつ他方のパラメタ値を変化させて得られるパラメタ一定線について、いずれかのパラメタ一定線が直線であり、且つ他方のパラメタ一定線の曲率中心が一直線上であれば、基底曲面は円弧掃引体と判断する。例えば、図80において実線で表された基底曲面では、一方のパラメタ一定線が直線となり、且つ他方のパラメタ一定線の曲率中心が一直線(太い破線)となり、基底曲面は円弧掃引体であると判断される。図80は円柱状の基底曲面を示しているが、同様の条件により円錐状の基底曲面についても円弧掃引体であると判断できる。
基底曲面が円弧掃引体であると判断された場合、簡易判定前処理部121は、フラグ「円弧掃引体」と、視線一価確定ボリュームを特定するための付帯情報とを、処理対象の基底曲面に関連付けてデータ格納部107に格納する(図77:ステップS219)。ここで、図81に、視線一価確定ボリュームを円錐の軸に対し垂直な平面で切断した断面図を示す。図81のうち、ハッチングが施された領域が視線一価確定ボリュームである。すなわち、実線で示された円錐とその定義境界線と接し且つ破線で示された接平面とで区切られた領域のうち円錐の軸が含まれる領域と、2つの接平面により区切られた領域のうち接平面交線を挟んで円錐の存在する領域と反対側の領域とが、視線一価確定ボリュームとなる。
視線一価確定ボリュームを特定するための付帯情報としては、例えば、図79の2行目に示すように、円弧掃引体を表す幾何データ、円弧掃引体の定義境界線と接する2つの接平面の幾何データ及び当該接平面交線の幾何データが登録される。ここでオプションとして、トリム面と基底曲面の境界が合致するかどうか検査して、結果を付帯情報として記録してもよい。その後、確定ボリューム生成処理を終了し、図76の処理に戻る。
一方、基底曲面が円弧掃引体でない場合、簡易判定前処理部121は、データ格納部107に格納されている処理対象の基底曲面が球面であるか判断する(図77:ステップS221)。ここでは、uパラメタ一定線及びvパラメタ一定線の曲率中心を求め、曲率中心が一点に定まれば、基底曲面は球面であると判断する。例えば、図82において実線で表された基底曲面では、u及びvパラメタ一定線の曲率中心が1点に定まっており、基底曲面は球面であると判断される。
基底曲面が球面であると判断された場合、簡易判定前処理部121は、フラグ「球面」と、視線一価確定ボリュームを特定するための付帯情報とを、処理対象の基底曲面に関連付けてデータ格納部107に格納する(ステップS223)。図83の例では、球面状の基底曲面の境界が太線で示され、当該基底曲面の視線一価確定ボリュームがハッチングが施された領域として示されている。図83のように、視線一価確定ボリュームは円錐及び球面により表され、基底曲面のパラメタ中央値の座標と、基底曲面の曲率中心とを結ぶ直線が軸となる。また、当該軸と基底曲面の境界上における接平面との交点のうち、曲率中心から最も遠い点が円錐の頂点となる。そして、円錐の側面と球面とで区切られた領域のうち曲率中心の含まれる領域と、円錐の頂点を挟んで逆側の円錐内部の領域とが、視線一価確定ボリュームとなる。
視線一価確定ボリュームを特定するための付帯情報としては、例えば、図79の3行目に示すように、球面を表す幾何データ、円錐の軸、頂点及び半頂角といった円錐の幾何データが登録される。ここでオプションとして、トリム面と基底曲面の境界が合致するかどうか検査して、結果を付帯情報として記録してもよい。その後、確定ボリューム生成処理を終了し、図76の処理に戻る。
一方、基底曲面が球面でない場合、簡易判定前処理部121は、自由曲面の確定ボリューム生成処理を実施する(図77:ステップS225)。この自由曲面の確定ボリューム生成処理については、図84乃至図86を用いて説明する。
図84に自由曲面の視線一価確定ボリューム生成処理の処理フローを示す。まず、簡易判定前処理部121は、データ格納部107に格納されている基底曲面のデータを基に参照軸を特定し、参照軸を表す幾何データをデータ格納部107に一時的に保持させておく(図84:ステップS231)。ここでは、図85に示すような基底曲面のパラメタ中央値の座標を通る接平面の単位法線ベクトルVを求め、Vが通る直線を参照軸とする。次に、簡易判定前処理部121は、参照軸上の円錐頂点を特定し、例えば座標のデータをデータ格納部107に一時的に保持させておく(ステップS233)。ここでは、基底曲面を分割した各格子点における接平面と参照軸との交点を求め、最も基底曲面から遠い点を円錐頂点とする。
その後、簡易判定前処理部121は、円錐の半頂角を算出する(ステップS235)。ここでは、図86に示すように、参照軸と基底曲面の接平面とのなす角αを求め、最小値αminを半頂角とする。なお、基底曲面の接平面の単位法線ベクトルをNとおくと、cosα=V・Nである。そして、簡易判定前処理部121は、cosαminが負の値であるか判断する(ステップS237)。図75に示したような基底曲面の場合、参照軸と基底曲面の接平面とは図86において基底曲面よりも下の部分で交わるため、αは鈍角になる。結果として、最小値cosαminは負になる。そして、cosαminが負の場合には、視線一価確定ボリュームは存在しないと判断する。cosαminが負の値である場合、簡易判定前処理部121は、フラグ「不在」をデータ格納部107に格納し(ステップS239)、確定ボリューム生成処理を終了して図76の処理に戻る。例えば、図79の5行目に示すように、フラグ「不在」が登録される。
一方、cosαminが負の値ではない場合、簡易判定前処理部121は、フラグ「自由曲面」と、視線一価確定ボリュームを特定するための付帯情報とを、処理対象の基底曲面に関連付けてデータ格納部107に格納する(ステップ241)。図86においてハッチングが施された領域が視線一価確定ボリュームである。すなわち、参照軸上の円錐頂点Qを中心として両側に、半頂角がαminの側面を有する円錐が定義され、当該円錐を自由曲面で分割した領域のうち円錐頂点とは反対側の領域と、円錐頂点を挟んで反対側の円錐内部の領域とが、視線一価確定ボリュームとなる。なお、自由曲面の視線一価確定ボリュームについては、円錐でなく一般の錘体として求めることも可能である。しかし、一般の錐体を用いた場合は判定処理が複雑になるため、判定処理が容易であるという点で円錐を用いた視線一価確定ボリューム生成処理は有利である。
視線一価確定ボリュームを特定するための付帯情報としては、例えば、図79の4行目に示すように、自由曲面を表す幾何データ、円錐の軸、頂点及び半頂角といった円錐の幾何データが登録される。ここでオプションとして、トリム面と基底曲面の境界とが合致するかどうか検査して、結果を付帯情報として記録してもよい。その後、確定ボリューム生成処理を終了し、図76の処理に戻る。
なお、基底曲面が、例えば機械系CADにおいて多く用いられる円弧掃引体又は球の場合、おもて面辺連結体又は裏面辺連結体が視線一価となる。すなわち、視点から見た円弧掃引体側面又は球面の稜線がおもて面と裏面との境界となり、おもて面辺連結体又は裏面辺連結体がそれぞれ視線一価となる。よって、おもて面と裏面との境界を算出するための情報を予めデータ格納部107に保持させておき、視線一価領域を生成する際に用いることにより、基底曲面全体が視線一価と判断されない場合でも処理効率を上げることができる。
例えば円錐は、一般的に円周方向及び母線方向のパラメタによって表現される。また、円錐の母線上の法線ベクトルは一定であり、視点から見た円錐の稜線である母線がおもて面と裏面との境界となる。よって、円錐の軸及び円周方向のパラメタを保持しておき、視点との関係に基づいて視線一価領域を計算することができる。なお、円柱や球面の場合も同様である。確定ボリューム生成処理においてこのような情報を用意するようにしてもよい。
図76の視線一価簡易判定処理に戻り、ステップS203の後、又はステップS201において初回の処理ではないと判断された場合、視線一価領域生成部123は、簡易判定処理を実施する(ステップS205)。この簡易判定処理については、図87を用いて説明する。
まず、視線一価領域生成部123は、処理対象の基底曲面に関連付けられた簡易判定フラグをOFFに初期化し、データ格納部107に保持させる(図87:ステップS251)。そして、視線一価領域生成部123は、データ格納部107から処理対象の基底曲面に関連付けられたフラグを取得する(ステップ253)。ここでは、図79に示したデータから、処理対象の基底曲面の項目「フラグ」に格納されたデータを取得する。
次に、視線一価領域生成部123は、フラグが「不在」であるか判断する(図87:ステップS255)。フラグが「不在」の場合は視点の位置に関係なく基底曲面は視線一価でないため、簡易判定フラグをOFFに設定したまま簡易判定処理を終了して図76の視線一価簡易判定処理に戻り、その後図32の視線一価領域生成処理に戻る。
一方、フラグが「不在」でない場合、視線一価領域生成部123は、表示条件格納部103から視点データを、データ格納部107から付帯データを取得する(ステップS257)。なお、本ステップの処理は、例えばステップS253(図87)と同時に行うようにしてもよい。そして、視線一価領域生成部123は、フラグが「平面」であるか判断する(ステップS259)。フラグが「平面」の場合、平面上以外の空間が視線一価確定ボリュームである。従って、視線一価領域生成部123は、取得した視点データが表す視点の座標が付帯データとして登録されている平面上に存在するか判断し、平面上に存在しなければデータ格納部107の簡易判定フラグをONに設定する(ステップS261)。その後、簡易判定処理を終了して図76の処理に戻り、さらに図32の視線一価領域生成処理に戻る。
一方、フラグが「平面」でない場合、視線一価領域生成部123は、フラグが「円弧掃引体」であるか判断する(図87:ステップS263)。フラグが「円弧掃引体」の場合、図81においてハッチングが施された領域が視線一価確定ボリュームである。従って、基底曲面の定義境界線で接する接平面及び当該基底曲面によって区切られた領域のうち円錐の軸を含む領域、又は接平面により区切られた領域のうち接平面交線を挟んで基底曲面が存在する領域とは逆側の領域に視点データが表す視点の座標が含まれるか判断し、含まれる場合はデータ格納部107の簡易判定フラグをONに設定する(ステップS265)。その後、簡易判定処理を終了して図76の処理に戻り、さらに図32の視線一価領域生成処理に戻る。
一方、フラグが「円弧掃引体」でない場合、視線一価領域生成部123は、フラグが「球面」であるか判断する(図87:ステップS267)。フラグが「球面」の場合、図83においてハッチングが施された領域が視線一価確定ボリュームである。従って、円錐の側面と球面とで区切られた領域のうち曲率中心の含まれる領域、又は円錐の頂点を挟んで逆側の円錐内部の領域に視点データが表す視点の座標が含まれるか判断し、含まれる場合はデータ格納部107の簡易判定フラグをONに設定する(ステップS269)。その後、簡易判定処理を終了して図76の処理に戻り、さらに図32の視線一価領域生成処理に戻る。
一方、フラグが「球面」でない場合、フラグは「自由曲面」であると判断できる。フラグが「自由曲面」の場合、図86においてハッチングが施された領域が視線一価確定ボリュームである。従って、円錐を自由曲面で分割した領域のうち円錐頂点とは逆側の領域、又は円錐頂点を挟んで逆側の円錐内部の領域に視点の座標が含まれるか判断し、含まれる場合はデータ格納部107の簡易判定フラグをONに設定する(ステップS271)。その後、簡易判定処理を終了して図76の処理に戻り、さらに図32の視線一価領域生成処理に戻る。
なお、円弧掃引体又は球面の基底曲面について、確定ボリューム生成処理においておもて面と裏面との境界を算出するための情報を用意している場合、視点が視線一価確定ボリュームに存在しないときであっても容易に視線一価領域に分割することができる。すなわち、予めデータ格納部107に保持されたパラメタ等を用いて、視点から見た円弧掃引体側面又は球面の稜線でおもて面辺連結体と裏面辺連結体とを生成することができる。例えば簡易判定処理において当該ケースを示すフラグを立てておき、後の処理において容易に視線一価領域を生成できるようにしてもよい。
以上のような処理を行うことにより、基底曲面全体が視線一価であるか容易に判断することができ、基底曲面全体が視線一価であれば描画処理においてループ多角形の形状に基づいてマスクを生成することができる。従って、従来のように基底曲面を分割することにより得られた三角形毎にループ多角形との交点を求める場合よりも交差計算の量は少なくなり、処理負荷が軽減される。また、上でも述べたとおり、視線一価確定ボリュームを有する基底曲面が用いられることは多く、視点が視線一価確定ボリュームに含まれることも多いため、当該処理は表示速度を向上させるために有効である。
以上本技術の実施の形態を説明したが、本技術はこれに限定されるものではない。例えば、機能ブロック図は一例であって、必ずしも実際のプログラムモジュール構成と一致しない場合もある。また、処理フローについても、処理結果が変わらない限り、ステップの順番を入れ替えたり、並列実施するようにしてもよい。さらに、図79に示したテーブルも一例であり、登録されるデータが異なる場合もある。
なお、上で述べた表示処理装置は、コンピュータ装置であって、図88に示すように、メモリ2501とCPU2503とハードディスク・ドライブ(HDD)2505と表示装置2509に接続される表示制御部2507とリムーバブル・ディスク2511用のドライブ装置2513と入力装置2515とネットワークに接続するための通信制御部2517とがバス2519で接続されている。オペレーティング・システム(OS:Operating System)及び本実施例における処理を実施するためのアプリケーション・プログラムは、HDD2505に格納されており、CPU2503により実行される際にはHDD2505からメモリ2501に読み出される。CPU2503は、アプリケーション・プログラムの処理内容に応じて表示制御部2507、通信制御部2517、ドライブ装置2513を制御して、所定の動作を行わせる。また、処理途中のデータについては、主としてメモリ2501に格納されるが、HDD2505に格納されるようにしてもよい。本技術の実施例では、上で述べた処理を実施するためのアプリケーション・プログラムはコンピュータ読み取り可能なリムーバブル・ディスク2511に格納されて頒布され、ドライブ装置2513からHDD2505にインストールされる。インターネットなどのネットワーク及び通信制御部2517を経由して、HDD2505にインストールされる場合もある。このようなコンピュータ装置は、上で述べたCPU2503、メモリ2501などのハードウエアとOS及びアプリケーション・プログラムなどのプログラムとが有機的に協働することにより、上で述べたような各種機能を実現する。
本実施の形態におけるフレームバッファは、メモリ2501又は表示制御部2507が有するメモリ等により実現される。そして、フレームバッファに格納された画像データは、表示制御部2507によって読み出され、表示装置2509に表示される。
以上述べた本実施の形態をまとめると、以下のようになる。
本実施の形態に係る表示処理方法は、基底曲面に基づいて生成されるトリム面を含む物体の形状を表示する表示処理方法であって、(A)基底曲面を三角形分割して、生成された三角形のデータをデータ格納部に格納するステップと、(B)トリム面の外形を定義するための外ループと物体の形状に応じて外ループ内に設けられる内ループとを含むループについて、ループ多角形を生成し、生成されたループ多角形のデータをデータ格納部に格納するステップと、(C)視点と基底曲面との位置関係に基づき、投影面への写像が全単射であるという条件を満たし且つ三角形を複数含む、基底曲面上の領域である視線一価領域を特定し、当該視線一価領域のデータをデータ格納部に格納する視線一価領域特定ステップと、(D)視線一価領域毎に、表示すべきか否かを制御する画素毎のデータであるマスクデータを、当該視線一価領域とデータ格納部に格納されているループ多角形とから生成し、マスクデータ格納部に格納するマスクデータ生成ステップと、(E)データ格納部に格納されている三角形の各々について、投影面上の画像データを生成し、データ格納部に格納する画像データ生成ステップと、(F)マスクデータ格納部に格納されているマスクデータとデータ格納部に格納されている画像データとから描画処理を実施するステップとを含む。
上で述べたような視線一価領域を特定して、当該視線一価領域を単位にマスクデータを生成することで、基底曲面を三角形分割して生成される三角形毎に処理するよりも効率良く且つ高速に描画を行うことができるようになる。
なお、上で述べた視線一価領域特定ステップが、(C1)基底曲面内の各三角形について、視点に対しておもて面か裏面かを判定し、データ格納部に格納するステップと、(C2)おもて面と判定され且つ連結している複数の三角形を含むおもて面辺連結体と、裏面と判定され且つ連結している複数の三角形を含む裏面辺連結体とを特定するステップとをさらに含むようにしてもよい。
単純な形状の場合には、このような処理によって特定されたおもて面辺連結体及び裏面辺連結体を視線一価領域として処理することも可能である。これによって上記ループとの交差判定を効率的に実施できるようになる。
また、上で述べた視線一価領域特定ステップが、(C3)おもて面辺連結体及び裏面辺連結体のいずれかである辺連結体の境界と視点とを通る直線により、辺連結体を分割して面分を生成するステップをさらに含むようにしてもよい。より複雑な形状の場合には、このような処理を実施することで確実に視線一価領域を特定することができるようになる。なお、このような面分をそのまま視線一価領域として処理するようにしてもよい。
さらに、視線一価領域特定ステップが、(C4)生成された面分を、視点から見て重ならず且つ隣接する面分の集まりに分けて連結するステップをさらに含むようにしてもよい。このようにすれば、より広い視線一価領域を生成することができるため、上記面分単位で処理するよりも効率が良くなる。
また、上で述べた視線一価領域特定ステップが、(C11)おもて面辺連結体及び裏面辺連結体のいずれかである辺連結体の境界をある平面に投影して、当該ある平面上の境界を単調区間に分割するステップと、(C12)単調区間が2以下であるか判断するステップとを含むようにしてもよい。このような処理によっておもて面辺連結体又は裏面辺連結体を分割するか否かを高速に判断することができるようになる。
さらに、上で述べた視線一価領域特定ステップが、(C13)単調区間が3以上である場合には、単調区間同士の交点に対応する、辺連結体の境界上の点である第1の点(例えば実施の形態における重合点)を特定するステップと、(C14)第1の点を含む、辺連結体の境界上のセグメントを視点を通る直線で辺連結体上に投影する(例えば実施の形態における曲面射影)ことで、辺連結体を分割して面分を生成する面分生成ステップとをさらに含むようにしてもよい。このような処理を例えばパラメタ空間において実施してもよい。また、これによって得られる面分をそのまま視線一価領域として処理するようにしても良い。
さらに、上で述べた視線一価領域特定ステップが、(C15)辺連結体が表裏境界を有する場合には、当該表裏境界と、第1の点を含む、辺連結体の境界上のセグメントを、視点を通る直線で辺連結体上に投影することで得られる線分とが接する第2の点(例えば実施の形態における特異点)を特定するステップをさらに含むようにしてもよい。その際、面分生成ステップにおいて、第2の点も第1の点のように辺連結体の分割に用いるものとする。第2の点が存在する場合には、第2の点も面分生成ステップで用いることで、適切に視線一価領域となる面分を生成できるようになる。
さらに、上で述べた視線一価領域特定ステップが、(C16)生成された面分から、第1の点を含む境界上の点に基づき、視点から見て重なる面分の組を特定するステップと、(C17)面分の組に含まれる各面分が異なるグループに属するように、生成された面分を隣接関係に基づき分類し結合するステップとをさらに含むようにしてもよい。このようにすれば、より広い視線一価領域を得ることができるようになり、処理効率が向上する。
なお、上で述べたマスクデータ生成ステップが、(D1)データ格納部に格納されているループ多角形のうち外ループについてのループ多角形である外ループ多角形と視線一価領域との集合積である外ループ集合積を生成し、データ格納部に格納するステップと、(D2)データ格納部に格納されているループ多角形のうち内ループについてのループ多角形である内ループ多角形と視線一価領域との集合積である内ループ集合積を生成し、データ格納部に格納するステップと、(D3)データ格納部に格納されている外ループ集合積内部の各点に相当する、投影面上の画素のマスクデータを、当該画素を表示すべきことを表すように設定するステップと、(D4)データ格納部に格納されている内ループ集合積内部の各点に相当する、投影面上の画素のマスクデータを、当該画素を表示すべきでないことを表すように設定するステップとを含むようにしてもよい。このようにすれば、適切なマスクデータが生成される。なお、外ループ集合積及び内ループ集合積を生成する処理は、各三角形について実施するよりも効率化されている。
また、本表示処理方法は、(G)基底曲面全体が視線一価領域であることが保証される、空間内のボリュームを決定し、当該ボリュームのデータをデータ格納部に格納するステップを更に含むようにしてもよい。そして、上で述べた視線一価領域特定ステップが、(C21)視点がボリューム内に含まれるか判断するステップと、(C22)視点がボリューム内に含まれると判断された場合には、基底曲面に含まれる全ての三角形を連結した領域を視線一価領域として特定するステップとを含むようにしてもよい。このようにすれば、処理が簡略化され、視点が移動する際にも高速に視線一価領域を特定できる可能性が出てくる。
また、本表示処理方法は、(H)マスクデータ生成ステップの前に、外ループと基底曲面の外周とが一致するか判断するステップと、(I)外ループと基底曲面の外周とが一致し、且つ基底曲面全体が視線一価領域である場合、データ格納部に格納されている三角形の各々について、投影面上の画像データを生成し、当該画像データにより描画処理を実施するステップとを含むようにしてもよい。これによって外ループと基底曲面の外周が一致するという特別な場合は、外ループ集合積計算ステップが省略されるので、処理の高速化が実現される。なお、全ての画素について表示すべきことを表すようにマスクを設定してもよいし、マスクを用いずに画像データを描画するようにしてもよい。
なお、上記方法による処理をコンピュータに行わせるためのプログラムを作成することができ、当該プログラムは、例えばフレキシブルディスク、CD−ROM、光磁気ディスク、半導体メモリ、ハードディスク等のコンピュータ読み取り可能な記憶媒体又は記憶装置に格納される。尚、中間的な処理結果はメインメモリ等の記憶装置に一時保管される。