ここに説明する1つまたは複数の実施形態は、入力データに表された表面を近似する、ポリゴンメッシュを生成することに関する。記述された特徴は、メッシュを構成するポリゴンの頂点を決定するために1つまたは複数の求根法、および/または反復を使用することを含む。
いくつかの例示的適用例では、表面、またはこのような表面を有する特徴(たとえば、オブジェクト、地形(terrain)の特徴など)を表す入力データが、受信される。入力データは、たとえば、地形編集プログラム、構造的立体幾何学(constructive solid geometry)アプリケーション、3次元(3D)モデリングプログラム、磁気共鳴映像法(MRI)、X線もしくは他の体積測定スキャナ、画像キャプチャ装置、仮想現実(VR)もしくは拡張現実(AR)プログラムもしくは装置、または他の供給源から、提供されたり、送信されたりしてもよい。いくつかの場合には、表面またはオブジェクトを近似するポリゴンのメッシュが、生成されることになる。メッシュは、表面およびオブジェクトの他の表現に比べて、迅速に表示するために処理、送信、および/または描画し、低減された記憶空間に記憶することができるように、複雑性が十分に低減されて、定義され得る。たとえば、このようなメッシュは、地形、医用画像、またはクレイ状にモデル化されたオブジェクトの効率的描画などの用途に、一般的に用いられている。
入力データは、たとえば、数学関数、スカラー値を含む離散ボクセルのグリッド、点集合、または、3D配置を値に写像するのに適した他の表現として、様々な形式およびフォーマットで符号化され得る。いくつかの例では、入力データは、スカラー値を、全(x,y,z)配置と関連づける3D場f(x,y,z)を、定義し得る。用途によっては、この場のスカラー値は、ある所望の表面からの距離を表現して、「符号付き距離場」を作成し得る。他の用途では、スカラー値は、密度または占有率を表し、「占有率場(occupancy field)」を作成するか、または、任意の連続非距離値を、表現し得る。占有率は、ここでは、1ボクセル内の専有体積(たとえば、中実体(solid material)によって占められている)の比とみなされており、空間内の任意の配置で評価され得るわけではないので、3次元内の連続場ではない。占有率値は、離散ボクセル内で既知である。これは、ボクセル内の占有率値は、各ボクセルにわたる無限小占有率の積分であるためである。メッシュ生成法は、距離関数であるかのように、占有率場に対して適用可能であるが、このことは、その結果の品質を制限することにもなり得る。
等値面(たとえば、レベル集合)(ここでは「表面」と称する)は、場が一定の値を有する表面である。通例、等値面閾値fが用いられ、ここで、f=0(距離および任意のデータについて)、およびf=0.5(占有率データについて)は、識別のために、最も興味深い等値面である。表面は連続で、立体形状が潜在的に滑らかな形状である。表面は、体積の内側と外側とを区別する。
いくつかの場合には、入力データは、ボクセル内で符号化され、補間法や生成されたボクセルが、場を定義し得る。いくつかの例では、場は、三線補間(tri-linear interpolation)、最近隣(nearest neighbor)(たとえば、点抽出法(point sampling))、またはより高次の方法により、補間可能である。三線補間は、線に沿って、立方(3次)変化を生成し、これは、場が非線形に変化することを意味する。入力データの任意の形式は、前処理ステップとして、ボクセルへと立体ラスタ化されてもよい。
説明された技術は、入力データ内で定義された表面を近似するポリゴンメッシュ(たとえば、三角メッシュ、または様々な型のポリゴンによるメッシュ)を、決定して生成する。いくつかの場合には、入力データ内で定義された2次元(2D)場のために、ラインメッシュ(line mesh)が、決定されて生成され得る。ここに説明する技術は、様々な形式で表された入力データを、効率的な物理シミュレーション、描画、および記憶、ならびに、さらなる編集を可能とするメッシュへと、変換することができる。
ここに説明する1つまたは複数の技術は、入力データが離散占有率値を含む場合であっても、従来の技術よりも高い品質を実現することができる。また、記述された技術は、占有率場から推論されたものとして、実距離場(true distance field)に対しても、適用可能である。
たとえば、既知のメッシュ生成技術であるマーチングキューブ法(関連する方法である、マーチングテトラヘドロン法(marching tetrahedra)ならびに、それと2Dにおいて等価のマーチングスクウェア法(marching squares)およびマーチングトライアングル法(marching triangles)を含む)は、ボクセルグリッドを当て嵌めて、メッシュの各頂点を、体積の内側または外側として分類する(たとえば、ボクセルケージ(voxel cage)の頂点(vertex)/隅(corner)ごとに1ビットとなり得る)。三角形のテンプレートが生成され、表面が通るエッジを識別するが、これらのエッジに沿った配置ではない。マーチングキューブアルゴリズムは、線形補間を用いて、ボクセルの隅における符号付き距離関数の値に基づき、実際の表面がボクセルと交差する配置を推定する。いくつかの場合には、たとえば、場fが線形勾配であれば、値fに比例した位置(x,y,z)のエッジに沿った線形補間が、実際の表面の補間配置を、正確に識別する。ただし、ここで、f値が、エッジに沿って非線形に変化し、これが、生成されたメッシュの頂点を、実際の表面から外れた位置に配置し、表面の不正確なメッシュ表現を生成する。
マーチングキューブ法の拡張は、2次補間を用いて、コンピュータ断層撮影およびX線スキャンにて、表面を検出する際、人間の骨および組織の非線形密度関数により良好に合致するようにしている。しかし、マーチングキューブ法には、実計量距離関数(true, metric distance functions)に適用される場合にのみ、良好な近似が得られるという、他の制限がある。入力fが、非計量(たとえば、表面への距離について単調ではあるが、正比例はしていない)または距離に代えて占有率/密度情報を含む場合、マーチングキューブ法は、生成された三角形について、一貫しない傾きを作成するとともに、表面から離れた頂点位置を決定してしまう。
「サーフェスネッツ(surface nets)」として知られる関連技術は、非距離関数について、より安定に作用するように設計されている。境界上にあるボクセルの中心にメッシュの頂点を置き、隣接する頂点を接続して、頂点が、本来のボクセルのケージから離れないように制約しつつ、円滑化のために全平面を緩和する。
サーフェスネッツ法のいくつかの拡張は、少なくとも1つのボクセルが閾値未満であり、少なくとも1つのボクセルが閾値表面を超えている、8つのボクセル間の各隅に、1つの頂点を配置する。そして、頂点は、ボクセルの中心間におけるそれらの値に基づいた補間により算出された位置へと移動される。ある手法では、マーチングキューブ法と同じ線形補間を用いて、各ボクセル対間を補間している。このボクセル対では、一方のボクセルが閾値を超え、他方のボクセルが閾値未満であり、位置の平均をとっている。しかし、サーフェスネッツ法は、各セル外の関数の値からのデータを用いているので、局所的ではなく、並列化不能である。これは、別々のボクセルセルを扱う個々のプロセッサスレッド間の通信が必要な、データ依存性を利用しているので、デジタルプロセッサ上でメモリ効率が良いわけではない。
ここに説明する技術および特徴にはいくつもの利点がある。本開示は、表面を近似するポリゴンのメッシュを生成するのに利用可能な技術について、詳述する。説明される各技術は、独立であり、個別にも組み合わせても利用可能である。各技術は、マーチングキューブ法などの従来技術が、エッジに沿った場の非線形変化や、場の距離関数による非記述性により、好ましくない結果をもたらす場合に、表面探索および生成の精度を向上させる。3D立方体の場合について、特徴が説明されるが、同じ特徴が、3D四面体、2D正方形、および2D三角形にも、適用可能である。
サーフェスネッツや他の機械学習法とは異なり、上述の技術は、局所的で完全に並列化可能であるとともに、効率性を提供している。このように、各セル近傍の関数の値からのデータのみが、用いられる。これは、デジタルプロセッサ上でメモリ効率が良く、かつ、別々のボクセルセルを扱う個々のプロセッサスレッド間の通信が必要な、データ依存性がないことを、保障している。また、これらの技術を用いた結果は、決定論的であり、ボクセル間で生成された表面における裂け目や不連続を避けてもいる。たとえば、説明された技術ごとに、メッシュの頂点は、生成された表面の各面に沿った2つの隣接ボクセルについて、独立に演算可能であり、各技術は、独立に同一の頂点値をもたらす。これにより、ボクセル間の不連続性に対処するために、処理要件を増やすことなく、表面をより正確に近似する、メッシュが得られる。
1つまたは複数の説明された実施形態の技術的効果として、装置が、より正確な結果を得るために拡張する演算資源を、より少なくすることがある。たとえば、説明された実施形態の技術的効果として、上述の技術または特徴の1つまたは複数を提供していない従来のシステムと比べて、システム処理資源および電力資源の消費が低減することがある。たとえば、サーフェスネッツなどの従来技術を用いる従来のシステムは、別々のボクセルセルを扱う個々のプロセッサスレッド間の通信が必要な、データ依存性により、より多くのメモリ容量を要し得る。ここに説明する技術は、プロセッサまたはプロセッサスレッドに対して、局所的に実装可能であり、このような通信を必要としない。決定論的結果を提供しない従来システムまたは技術は、独立に処理されるボクセル間に生じる不連続を取り除くか、またはこれに対処するために、追加処理を行うことを必要とし得る。ここに説明する技術は、決定論的結果を提供して、精度をより向上させて、このような追加処理を避けている。いくつかの従来システムは、表面が、ボクセルエッジに沿って非線形に変化することや、表面が、距離関数により記述されていないことにより、不正確な結果を生成する。ここに説明する技術は、非線形に変化し得るか、または、距離関数により記述されない表面(たとえば、占有率値または密度値により記述される)を、より正確に近似するメッシュを、提供可能である。
例示的ボクセルグリッドおよび表面
図1Aは、いくつかの実施形態による、入力データ内に記述された、例示的表面102の説明図100である。表面102は、地形または風景のような特徴、仮想オブジェクトの一部などであり得る。ボクセルグリッド104が、表面102にわたって当て嵌められている。この例では、ボクセルグリッド104は、全て同寸法の複数の立方ボクセル106からなる。図示の簡略化のため、ボクセル106の部分集合が詳細に示されている。ボクセル106は、本例ではボクセルの隅である、頂点108を含む。表面102は、ボクセルグリッド104のボクセル106を通る交差経路を有し、たとえば、表面102は、グリッドのボクセル106のうちのいくつかにおける面およびエッジと交差している。ここで、ボクセルの「面」は、ボクセルの2次元の側面とみなされており、ボクセルの「エッジ」は、面の1次元の辺とみなされている。「線分」は、ボクセルのエッジであり得るか、または、ボクセル上またはボクセル内の他の種類の直線部分であり得る。(たとえば、サーフェスネッツ法で用いられるような、2つの中央頂点、または、隣接したボクセルの他の頂点を接続した直線など、ボクセルの頂点により規定された直線)。
図1Bは、いくつかの実施形態による、図1Aに示された表面102を近似する例示的メッシュ120を示す説明図である。メッシュ120は、本例では、メッシュの頂点124により規定された三角形122である、ポリゴンからなる。三角形122は、表面102の輪郭を近似するようになっている。メッシュ102は、図1Aに示されたボクセルグリッド104のボクセル106内で、メッシュの頂点124の位置を取得することにより、生成される。メッシュの頂点124の位置は、表面102が交差したボクセルの集合内で、決定される。ボクセル106に対するメッシュの頂点124の位置は、ここに説明する1つまたは複数の技術を用いて決定され得る。この技術は、メッシュ102および/または他のメッシュと同様のメッシュ、たとえば、様々な数および/または種類のポリゴン(たとえば、四角、追加の三角形など)からなるメッシュを、生成可能である。
メッシュ生成方法
図2は、いくつかの実施形態による、入力データ内に表された表面を近似するポリゴンメッシュを生成する、例示的方法200のフローチャートである。いくつかの実施形態では、方法200は、たとえば、図12に示されるようなオンラインプラットフォーム1202、または図13に示されるような演算装置1300などの、たとえば、サーバシステム上で、実行可能である。いくつかの実施形態では、方法200のうちのいくつかまたは全てが、図12および/もしくは図13に示されるような、1つもしくは複数のクライアント装置1210および装置1216、ならびに/または、サーバシステムおよび1つもしくは複数のクライアントシステムの両方などのシステム上で、実装可能である。説明された例では、実装システムは、1つまたは複数のプロセッサまたは処理回路と、データベースまたは他のアクセス可能記憶部などの1つまたは複数のプロセッサ記憶装置とを含む。いくつかの実施形態では、1つまたは複数サーバおよび/またはクライアント装置の様々な構成要素は、方法200の様々なブロックまたは他の部分を、実行可能である。
方法200は、ブロック202で開始し得る。ブロック202では、入力データは、方法200を実行する装置またはシステムにより、受信される。いくつかの実施形態では、入力データは、3D場内の1つまたは複数の表面(たとえば、等値面)の表現を含む。表面は連続で、立体として潜在的に滑らかな形状をとり得る。たとえば、表面は、ビデオゲーム、仮想現実環境、または他の仮想環境内にて表現される、立体オブジェクトの表面であり得る。いくつかの例では、表面は、人体内の臓器、特定の環境内のオブジェクト(たとえば、材料または要素、地下、宇宙、水中などの内部)、地理的風景、または他の環境など、スキャンされるかまたは検知された体積または領域内の物理オブジェクトまたは他の特徴の表面の表現であり得る。
いくつかの実施形態では、表面は、体積の内側と外側とを区別する。たとえば、表現されたオブジェクトは、体積を有し得るものであり、体積の内側は、オブジェクトの1つまたは複数の材料を含み、体積の外側は、オブジェクトが配置された環境である。いくつかの例では、表面は、オブジェクトの内部がどこに配置されるか(たとえば、車のオブジェクトの内側の体積を示す壁面)、オブジェクトに対する外部がどこに配置されているか(たとえば、車周辺の空間を示す壁面および他の外表面、配置表面など)を、定義可能である。
いくつかの実施形態または事例では、入力データは、場の各(x,y,z)配置にて、スカラー値を有する3D場を、記述している。いくつかの実施形態または事例では、各スカラー値は、表面からの距離を表現可能であり、これにより、符号付き距離場(たとえば、表面の外部または上側の正または負、および、表面の内側または下側の異符号(負または正))を形成する。いくつかの実施形態または事例では、各スカラー値は、表面により定義された体積により占められたボクセル体積(たとえば、体積の中実体)の比を表現可能であり、これにより、ボクセルの密度または占有率の量を表し、占有率場を形成する。いくつかの実施形態では、この占有率は、空間内の任意の配置で評価可能ではないため、3Dにおける連続場ではない。占有率値は、離散ボクセルの中でのみ既知となり得る。ボクセル内の占有率値は、各ボクセルにわたる無限小占有率の積分であり得る。いくつかの実施形態または事例では、各スカラー値は、連続かつ非距離値、または他の値を、表現可能である。
いくつかの実施形態では、表面は、等値面(たとえば、レベル集合)であり、場が一定の値を有する表面である。いくつかの実施形態では、等値面閾値が用いられ得る。いくつかの例では、閾値0(距離および任意のデータに対して)、および0.5(占有率データについて)が、等値面を識別するために利用可能である。
様々な例では、入力データは、数学関数、スカラー値を含む離散ボクセルのグリッド、点集合、または、他の表現、たとえば、表面上の2Dまたは3D配置を値に写像するのに適した表現として、符号化され得る。いくつかの例では、入力データがボクセル内で符号化された場合、ボクセルを符号化するのに用いられた補間方法が、表面場を規定する。表面場は、たとえば、三線補間、最近隣(たとえば、点抽出法)、またはより高次の方法など、様々な方法のいずれかを用いて、補間され得る。三線補間は、線に沿って、立方(3次)変化を生成して、表面場が非線形に変化する。さらに別の例では、入力データの任意の形式は、方法200に先立つ前処理ステップとして、ボクセルへと立体ラスタ化される。いくつかの実施形態では、入力データが、ボクセルグリッド内で符号化されている場合、方法200(ここで説明される他の方法のいずれか)用に使用されているボクセルグリッドは、入力データのグリッドとは異なるグリッド(たとえば、異なる解像度またはボクセル寸法を有するグリッド)であり得る。いくつかの実施形態では、入力データのボクセルグリッド、またはその双対(dual)(たとえば、値が、ボクセルの中央ではなく隅にあるとみなされている)は、ここに説明する方法のために使用可能である。
様々な例では、入力データは、アプリケーションプログラム、装置、または他の供給源により、提供され得る。たとえば、地形編集プログラム、構造的立体幾何学アプリケーション、3Dモデリングプログラム、MRI、X線または他の体積測定スキャナが、ブロック202にて受信される入力データを、生成可能である。いくつかの実施形態では、このような供給源により出力されたデータが、ブロック202にて受信される前に、事前処理される。たとえば、上述の表現(たとえば、数学関数、ボクセルなど)のうちのあるものとして符号化される。
いくつかの実施形態では、直線(たとえば、等値線または輪郭線)など、2Dで表面に均等なものが、入力データ内に表現可能である。表面の代わりに表現された直線は、方法200を含め、ここに説明されたものと同様の技術を用いて、近似され得る。たとえば、直線は、複数の異なる直線部分(たとえば、ポリライン(polyline))および/または近似された曲率が、提供されることにより、近似可能である。ブロック202には、ブロック204が後続し得る。
ブロック204では、ボクセルグリッドが複数のボクセルを含む入力データ内に表現された表面を含む、ボクセルグリッドが、決定される。いくつかの実施形態では、ボクセルは、形状が立方体であり得る。たとえば、ボクセルグリッドが、入力データに当て嵌められて、各ボクセルの各隅は、入力データ内の表面により規定された体積の内側または外側として分類され得る。いくつかの例では、ボクセルグリッドの各ボクセルの各隅に、1ビットが割り当てられ得る。グリッド内のボクセルの大きさは、所望の解像度、利用可能な記憶域、および/または他の考慮内容に基づいて、決定可能である。
いくつかの実施形態では、ブロック202にて受信された入力データは、ボクセル、および入力データ内に予め符号化されたボクセルグリッドを有し得るものであり、これらの同一のボクセルは、方法200内で用いられ得るもので、ブロック204が、入力データおよび表面上の様々なボクセルを規定するわけではない。いくつかの実施形態では、このような既存のボクセルグリッドと同様のグリッド、たとえば、ボクセル値が、ボクセルの中心ではなくボクセルの隅におけるものとされた、既存のグリッドの双対が、ブロック204にて決定され得る。いくつかの実施形態では、新しいボクセルが方法200にて用いられる、既存の符号化されたボクセルグリッドとは異なり得る、入力データについて、新しいボクセルを規定した新しいボクセルグリッドが、ブロック204にて決定され得る。ブロック204には、ブロック206が後続し得る。
ブロック206では、表面が交差する特定のボクセルが、識別される。たとえば、これは、表面が通る具体的なボクセルのエッジ(たとえば、表面の交差経路)などの線分を、識別することを、含み得る。いくつかの実施形態では、これは、ボクセルグリッドの1つまたは複数のボクセルを、記憶された交差ケースの集合からそれぞれの交差ケースへと、写像することにより、行われる。たとえば、ボクセルグリッドの各ボクセルが、関連づけられた交差ケースに対して割り当てられ得る。いくつかの実施形態では、マーチングテトラヘドロン法またはマーチングキューブ法による交差ケースが、使用可能であるか、あるいは、別の技術にて用いられる交差が、使用可能である(たとえば、いくつかのサーフェスネッツまたは他の技術での線分の交差)。いくつかの実施形態では、一意的な交差ケースの数が、提供可能であり(たとえば、システムの参照テーブル内に記憶されてアクセスされる)、各交差ケースは、ボクセルを通る、表面(または体積)のそれぞれの経路を記述するものであり、たとえば、表面(または体積)にて交差するボクセルのエッジ(または、他のボクセル線分)のそれぞれの集合を示している。交差ケースは、様々な回転、および/または、表面におけるボクセルを通るとり得る進路(pathways)の反射に、基づき得る。たとえば、マーチングキューブ法では、14個の一意な交差ケースの集合が、ボクセルの12のエッジを通る表面における、とり得るエッジの交差の全てを、記述している。いくつかの実施形態では、8ビットの集合が、各ボクセルにおける8個の隅の集合体に対して、関連づけられ得るものであり、ビットマップの様々な集合の各々が、交差ケースの別々の1つに写像される。たとえば、ビットの集合は、交差ケースのテーブルへのインデックスとしてはたらく、ベクトルであり得る。
いくつかの例では、ボクセルが完全に体積の外側になって、ボクセルに交差する表面がない、自明な例(trivial case)について、ボクセルには、ビットの集合の全てにゼロの値でラベル付けされた交差ケースが、割り当てられ得る。他の例では、ボクセルが完全に体積の内側になって、ボクセルに交差する表面がない、他の自明な例について、ボクセルには、ビットの集合の全てに1の値でラベル付けされた交差ケースが、割り当てられ得る。他の交差ケースでは、表面は、ボクセルの1つまたは複数の面を通り、適切な交差ケースが、体積の内側のボクセルの隅および体積の外側の隅に基づき、ボクセルに割り当てられる。他の例では、マーチングテトラヘドロン法が、用いられ得る。この技術は、各ボクセルキューブが6つの四面体へと分割され、ボクセルの12のエッジの代わりに、19のエッジが指定されていること以外は、マーチングキューブ法と同様である。各四面体について、8つの交差ケースが可能である。他の実施形態が、他の方法にて、交差ケースまたはラベル/ビットを、割り当て可能である。他の技術が、表面と交差するボクセル線分を決定するために、代わりにまたは追加的に、用いられ得る。ブロック206には、ブロック208が後続し得る。
ブロック208では、ポリゴンのテンプレートが、識別された特定のボクセルに基づいて、生成される。たとえば、テンプレートは、識別された特定のボクセルの識別された線分(たとえば、エッジ)に基づいて、生成され得る。たとえば、いくつかの実施形態では、ポリゴンは、三角形であり得るものであり、他の実施形態では、ポリゴンは、他の種類のものであり得る(四面体など)。テンプレートは、表面が交差して、エッジに沿った特定の位置ではない、エッジ(または他の線分)を識別する。いくつかの実施形態では、テンプレートのポリゴンの頂点には、特定のボクセルの識別されたエッジに沿った初期位置が、割り当てられ得る。たとえば、初期位置は、隅、または識別されたエッジの中点であり得る。他の初期位置が、他の実施形態で用いられ得る(たとえば、エッジ距離の特定の分数など)。ブロック208には、ブロック210が後続し得る。
ブロック210では、メッシュが表面を近似する、ブロック208のテンプレートに基づいて、メッシュが生成される。たとえば、メッシュは、3D場および表面用のポリゴンメッシュ、または、2D場および線分用のラインメッシュであり得る。メッシュ生成は、1つまたは複数の求根法および/または反復法を用いて、ここに説明する特徴により、メッシュのポリゴンの頂点の位置を決定することを含む。このブロックは、表面が配置された位置を、入力データ内の値に基づいて推定し、この値は、表面を、交差したボクセルの頂点(たとえば、角)にて記述する、符号付き距離関数の値、または、占有率値もしくは密度値であり得る。説明された技術を用いて、メッシュ頂点の位置が、従来の技術よりも正確に決定される。ブロック210のために、頂点の位置を決定する様々な実施形態について、図3から図11を参照して、以下に説明する。
ブロック210に由来するメッシュは、入力データ内に表現された表面の近似として、利用可能である。1つまたは複数の説明された技術を用いて、頂点の位置が決定された後、メッシュが規定されて完成する。いくつかの実施形態では、メッシュは、様々な方法で追加的に処理され得るものであり、たとえば、特徴(たとえば、ポリゴンを埋める色彩またはテクスチャ)が割り当てられ、特定のオブジェクトに適合するように修正され、特定の記憶部内に記憶され、表示装置により表示されるなどである。メッシュ生成は、様々な形式で表現された場の入力データを、たとえば、効率的な物理シミュレーション、描画、記憶、および/またはさらなるデータ編集のために利用可能である、ポリゴンメッシュへと、変換することを提供する。共通の用途には、地形、医用画像、またはクレイ状にモデル化されたオブジェクトの効率的描画などがある。たとえば、メッシュは、地形の特徴(風景、山など)、臓器または他の身体部位、デジタルオブジェクトなどの表面のような、特徴の特徴面の生成に、利用可能である。
メッシュ決定方法の選択
図3は、いくつかの実施形態による、表面を近似するメッシュの頂点の位置を決定する、例示的方法300のフローチャートである。たとえば、方法300は、上述の図2の方法200のブロック210における、頂点位置決定の例示的実施形態であり得る。いくつかの実施形態では、方法300は、たとえば、サーバシステムおよび/またはクライアントシステム上で、方法200について説明したのと同様に、実行可能である。様々な実施形態では、方法300の一部のみが用いられ、たとえば、入力データの特定の形式のみ、および/または、説明したメッシュ生成技術の一部のみが、利用される。たとえば、いくつかの実施形態は、ブロック304のみを利用可能であり、いくつかの実施形態は、ブロック302、ブロック304およびブロック314のみを利用可能であり、いくつかの実施形態は、ブロック302からブロック308のみを利用可能であり、いくつかの実施形態は、ブロック302、ブロック304およびブロック310からブロック314のみを利用可能である。
ここに説明する技術のいくつかは、求根法である。説明された例では、求根法は、方程式の一辺がゼロの等式で、表面または直線を表す規約を、用い得る。たとえば、x2+y2=r2は、円を定義しており、説明された実施形態では、方程式は、x2+y2-r2=0として整えられている。これにより、2つの式の代わりに1つの式となり、表面関数を、関数のゼロの結果が、関数により定義された表面上の点となるように、定義することが可能となる。ここに説明する技術は、ゼロを見出すことができ、たとえば、関数を満足させて結果がゼロとなるxおよびyの値を決定する。ゼロの結果を取得する値の集合は、方程式の根である。
説明された1つまたは複数の求根法は、ゼロの表面関数が配置されるべき近傍を決定する。さらに具体的には、f(x1,y1)<0(たとえば、この点が、体積の外側にある)およびf(x2,y2)>0(たとえば、この点が、体積の内側にある)、かつf()が連続であれば、これらの点の間のどこかでf(x,y)=0となる。表面は、符号が、正の符号へと変更されるところである。ゼロ未満の結果が内側であり、ゼロを超えるものが外側であるか、その逆であるかは、任意の規約であり、どちらの規約も、説明された技術にて利用可能である。いくつかの実施形態では、ボクセルのエッジ(または他のボクセル線分)におけるある頂点(隅)が、体積の内側であり、他の隅が、体積の外側であると、そのエッジに沿った探索により、たとえば、ゼロ点など、表面上の点を発見することが、保障されている。複数のゼロ点があるが、この特定のゼロは、表面およびエッジの交差である。
方法300は、ブロック302で開始し得る。ブロック302では、表面が、既知の表面関数により記述されているかどうか、判別する。方法300は、表面関数により記述された表面の表現を含む入力データを処理する、いくつかの実施形態にて、用いられ得る。いくつかの例では、表面関数は、入力データ値が、表面に対するボクセルの隅(または他のボクセル基準点)の距離を表す、符号付き距離関数であり得る。いくつかの実施形態では、表面を記述する表面関数は、システムが実施する方法300により受信された入力データ内に規定されて含まれるか、そうでなければ、関数は、システムにより既知であってもよい(たとえば、システムにより記憶されたり、入力データと関連づけられたり、ユーザコマンドにより特定されるなど)。いくつかの例では、特定の関数を、メッシュへと変換して、関数を説明することが、有用である。
さらに別の例では、値は、ボクセルの隅にて事前に特定されていてもよく、表面関数は、空間を通って表面がどのように変化するかを示す、事前の線形補間に基づいて、作成されていてもよい。追加の例では、コマンドは、入力データ内の既存のボクセルグリッドを、メッシュ生成用の別のボクセルグリッド(たとえば、別の解像度のグリッド)へと変化させるように指定してもよく、表面関数は、別のグリッドへのこのような変換を可能にするように、指定される。
いくつかの実施形態では、様々な方法のいずれかは、方法300を行うシステムが、入力データを記述する(または関連づけられた)表面関数があるかどうか判定可能とするように使用可能であり、これは、表面関数があることを示す、入力データ内のフィールドまたはフラグを、提供すること、ユーザからのコマンドを受信することなどである。いくつかの実施形態では、表面関数が、他の方法で決定されてもよく、これは、たとえば、入力データの特定の種類、または、特定の供給源からの入力データが、特定の表面関数と関連づけられ得ることである。
入力データ内で表された表面が、既知の表面関数により記述されている場合、1つまたは複数求根法が、使用可能であり、本方法は、以下に示されるブロック306へと続く。入力データ内に記述された表面が、既知の表面関数により記述されていない場合、たとえば、入力データが、占有率値または密度値の形式である場合、本方法は、求根以外の1つまたは複数の技術が使用可能なブロック304へと続き得る。たとえば、以下に説明される図8の方法800は、占有率値または密度値の形式の入力データのために、使用可能である。いくつかの実施形態では、図9の方法900が、使用可能である。いくつかの実施形態では、表面が、既知の表面関数により記述されている場合であっても、他の技術(方法800および/または方法900など)が、1つまたは複数の求根法の代わりに、あるいは追加的に、ブロック304により使用可能である。いくつかの実施形態では、たとえば、線形補間など、他の技術が、メッシュの頂点を取得するために使用可能であり、これは、説明された他の技術に追加して用いられる。メッシュが、メッシュの頂点位置の推定を含む、ブロック304の1つまたは複数の技術を用いて、生成される。
ブロック306は、入力データが、ブロック302にて決定された既知の表面関数により記述されていた場合に、行われる。ブロック306では、表面関数は、(実際的な)解析解(たとえば、解析関数)を有するかどうか判定する。このような関数の例として、表面関数が解析的に表現されて、閉形式解を認める関数体(field function)がある。表面関数が既知で解析的であるため、任意の位置での値について、直接的に解かれ得るものであり、たとえば、表面関数の厳密な根を取得する。解析関数の例には、1次多項式、2次多項式、3次多項式、4次多項式、または他の関数がある。
いくつかの例では、離散ボクセルの三線補間は、3次であり、解析解を有する関数として認められ得る。他の関数は、解析的に解くことができてもよい。たとえば、入力データは、解析的に可解の特定の関数に、基づくものであって(たとえば、翼にわたる空気の流れなどを、記述する方程式など)メッシュとしてのデータの可視化を提供してもよい。いくつかの実施形態では、様々な方法のいずれかが、方法300を実行するシステムが、解析的に可解であるかどうか判定できるように、用いられてもよく、これは、入力データのフィールドまたはフラグ、ユーザからのコマンド、システムがアクセスして、受信された表面関数と比較する、記憶された特徴、解析関数例で訓練されて、表面関数が解析関数かどうかを検出するために使用される機械学習モデルなどである。
表面が、解析解を有する表面関数により記述されていない場合、本方法は、以下に説明するブロック310へと続く。表面が、解析解を有する表面関数で記述されている場合、本方法は、ブロック308へと続き、そこでは、メッシュの頂点の位置が、根のために解析的表面関数を解くことを含む、解析的求根法を用いることにより、決定される。たとえば、表面が交差したとして検出されたボクセルの各エッジ(または他の線分)上で、エッジにわたる交差の厳密な位置(およびメッシュの頂点の位置)が、表面関数を根について解くことにより、決定される。いくつかの実施形態では、入力データ内にて指定されたボクセルの値、または、そうでなければ、入力データから抽出された値は、根を得るために解くのに用いられ得る(たとえば、入力データ内にて表面がどのように表現されているかによる)。メッシュは、根のために解くことに基づいて決定された、メッシュの頂点の位置に基づいて、生成される。メッシュの頂点の位置のために、表面関数を直接的に解くことにより、メッシュの頂点が、表面上での交差ボクセルとの交差位置に、正確に配置可能となる。
ブロック310は、ブロック306にて、表面が、解析解を持つ表面関数により記述されていないと判定された場合に、実行される。ブロック310では、表面関数が、微分可能であるかどうか判定される。たとえば、表面関数から導関数が導出可能であるなどである。いくつかの実施形態では、様々な方法のいずれかが、方法300を実行するシステムが、表面関数が導関数を有するかどうか判定できるように、用いられてもよく、これは、入力データのフィールドまたはフラグ、ユーザからのコマンド、システムがアクセスして、受信された表面関数と比較する、微分可能関数の記憶された特徴、微分可能関数例で訓練されて、表面関数が微分可能関数かどうか検出するために使用される機械学習モデルなどである。
ブロック310にて判定されたように、表面関数が微分可能である場合、本方法は、以下に説明するブロック314へと進む。ブロック310にて判定されたように、表面関数が微分可能である場合、本方法は、ブロック312へと続き、ここでは、メッシュの頂点の位置は、求根法を用いて、表面関数の導関数に基づき、決定される。たとえば、このブロックは、表面関数の数値根(numeric root(s))を取得し、表面により近い頂点の位置を反復し得る。数値求根法は、表面関数の導関数を評価することにより、根を決定し、表面により近いメッシュの頂点の位置を、求根の反復により取得可能である。ブロック308の実施例について、図4を参照して、以下により詳細に説明される。導関数のある数値求根法を用いて、メッシュは、ボクセルとの表面交差の実際の位置に近いという、メッシュ頂点位置の推定を用いて、生成され得る。
ブロック314は、ブロック310にて、表面関数が微分可能でなければ、実行される。いくつかの実施形態または事例では、ブロック314も、表面関数が微分可能である場合であっても、実行され得る。たとえば、関数の導関数を用いない、1つまたは複数の他の求根法を用いて、ブロック312の求根法に加えて、またはその代わりに、メッシュの頂点を取得しようとする場合である。
ブロック314では、メッシュ頂点の位置が、数値求根法を、反復改良にて用いて、決定される。たとえば、このブロックは、いくつもの様々な技術のいずれかを用いて、表面関数の根を取得するのに、使用可能であり、このような技術は、表面関数の導関数を必要としない。複数の技術が、いくつかの実施形態では使用可能である。この説明された技術の反復改良は、求根法を反復なしに用いる場合よりも、頂点のより正確な位置(たとえば、表面により近い)を提供する。ブロック314の実施例について、図6を参照して、以下により詳細に説明される。反復改良のある求根法を用いて、メッシュは、ボクセルとの表面交差の実際の位置に近いという、頂点位置の推定を用いて、生成され得る。
いくつかの実施形態では、メッシュ頂点の位置を決定(たとえば、ブロック304、ブロック308、ブロック312またはブロック314にて)した後、1つまたは複数の追加技術を実行することにより、追加処理が実行されて、頂点の1つまたは複数をより正確に位置決めすることができる(たとえば、実際の表面により近く)。たとえば、図9の方法900は、メッシュを、追加のメッシュ線分へと細分することができ、ここに説明する1つまたは複数の他の技術に加えて(たとえば、その前または後に)実行され得る。
表面関数の導関数を用いたメッシュの決定
図4は、いくつかの実施形態による、表面関数の導関数に基づき、数値求根法を用いて、表面を近似するメッシュの頂点の位置を決定する、例示的方法400のフローチャートである。たとえば、方法400は、図3の方法300のブロック312の例示的実施形態であり得るか、または、独立して、すなわち、方法300とは別に、実行され得る。いくつかの実施形態では、方法400は、たとえば、サーバシステムおよび/またはクライアントシステム上で、方法200および方法300について説明したのと同様に、実行可能である。
なお、「エッジ」または「ボクセルのエッジ」という用語は、方法400の説明に、説明の目的で用いられている。ボクセルのエッジは、ボクセルの線分として、より一般的に記述され得る。たとえば、いくつかの実施形態では、線分が、立方ボクセルの面の実際のエッジであり得る。いくつかの実施形態では、たとえば、いくつかのサーフェスネッツ、または方法400で使用可能な同様な技術など、いくつかのメッシュ生成技術では、線分は、隣接するボクセルの中心を接続する(または、2つの隣接するボクセルの他の点を接続する)線であり得る。これらの後者の実施形態では、このような線分は、ボクセルのエッジの代わりに使用可能である。たとえば、方法400での頂点は、ボクセルの実際のエッジではなく、ボクセルのこのような線分に沿って、決定または選択され得る。
方法400は、ブロック402で開始し得る。ブロック402では、処理されるべきボクセルのグリッドから、ボクセルが選択される。ボクセルは、表面と交差するものと判定されるグリッドのボクセルのうちの1つであり、たとえば、図2のブロック206である。本方法は、ブロック404へと続く。
ブロック404では、選択されたボクセル内の頂点が、選択される。いくつかの実施形態では、選択されたボクセルのエッジの頂点が、選択され、エッジは、表面と交差している。選択された頂点は、現在位置を有する。いくつかの実施形態では、選択された頂点は、ボクセル値が入力データ内に表された、選択されたボクセルの隅であり得る(入力データのボクセル値は、他の実施形態におけるボクセルの他の基準点(部分)を表し得るものであり、これは、たとえば、ボクセルの中心である)。いくつかの実施形態では、選択された頂点は、他の技術を用いて、決定され得るものであり、たとえば、選択されたボクセルの交差したエッジの中点、または別の技術により推定された位置である。方法400の反復で選択された頂点は、選択されたボクセルのボクセル空間の寸法に制約され得る。
いくつかの実施形態では、メッシュの頂点を探索するエッジ(直線)が決定された後、表面関数は、そのエッジ上で、2Dまたは3D関数から、1次関数へと変換される。この変換は、直線の方程式を、表面関数に当て嵌めることを含み得る。たとえば、表面関数が、球であり(たとえば、x2+y2=100)、探索されるエッジがy=3(たとえば、一定のy軸値を有する水平エッジ)であれば、直線を表面関数に当て嵌めることにより、そのエッジ上の方程式として、x2+32=100、つまり、x2+9=100、すなわちx2=91という結果が、もたらされる。この単純な例では、解は、厳密に決定可能であるが、より複雑な表面関数では、結果は、解くことがむずかしいままとなり得る。本方法は、ブロック406へと続く。
ブロック406では、選択された頂点の新しい位置が、表面関数の導関数を用いる求根法を用いて、表面関数の根として決定される(たとえば、上述の変換された関数)。表面関数は、表面においてゼロに等しく、求根が、表面上の点を取得することに対応するように、定義される。方法400では、表面関数は、解析解がなく、微分可能である。
たとえば、求根法は、表面関数の導関数を含む方程式の根を、取得可能である。選択された頂点の新しい位置は、選択された頂点での微分接線が、表面と交差するものであり得る。現在位置での表面関数への接線のゼロ点は、表面関数のゼロ点での近似として、用いられ得る。いくつかの例では、ニュートン・ラプソン求根法が、使用可能である。いくつかの実施形態では、表面関数の階差は、離散サンプルまたは入力データ内の値から、表面関数の導関数を近似するために、使用可能である。いくつかの例では、ニュートン・ラプソン法は、ゼロの導関数について、以下の方程式を用いて解かれる。
ここで、(xn, f(xn))は、n回目の反復で、(2Dにて)選択された頂点であり、xnは、ボクセルのエッジ上の選択された頂点の現在位置となり、f(xn)は、選択された頂点の位置にて評価された表面関数となる。(xn+1, f(xn+1))は、結果として得られる頂点であり、f'(xn)は、選択された頂点の現在位置にて評価された、表面関数の導関数である。この方程式は、選択された頂点での表面関数の導関数により、表面関数を、選択された頂点にて分割し、その結果を、選択された頂点の現在位置から差し引く。その結果は、表面におけるボクセルのエッジとの実際の交差位置により近い、頂点(xn+1, f(xn+1))であり、xn+1は、選択された頂点の新しい位置である。本方法は、ブロック408へと続く。
ブロック408では、表面と、ブロック406にて決定された選択された頂点の新しい位置との誤差が、決定される。たとえば、この誤差は、表面関数を、ブロック406にて決定された新しい位置の値で評価し、関数の結果とゼロとの差を決定することにより、決定可能である。表面関数の評価からのゼロという結果は、選択された頂点の新しい位置が、正確に表面上にあるため、表面とボクセルのエッジとの交差位置を、正確に提供することを、示している。本方法は、ブロック410へと続く。
ブロック410では、ブロック408にて決定された誤差が、1つまたは複数の所定の基準を満たすかどうかが、判定される(かつ/または、所定の基準が、それ以外で満たされるか)。たとえば、誤差の閾値量が、ブロック410での仕様のために予め決定されていたならば、誤差は、閾値未満となるかどうか、確認される(または、他の実施形態では、閾値を超えているか)。他のまたは追加の基準も、様々な実施形態にて、使用可能である。いくつかの実施形態では、実行されたブロック406からブロック410の反復数が、ブロック410での判定のための代替的または追加的な基準となり得る。たとえば、実行された反復数が、反復閾値を超えていれば(たとえば、3回反復)、所定の基準は満たされている。所定の基準が満たされていれば、本方法は、以下に説明するブロック412へと続く。
ブロック410の所定の基準が、満たされていなければ、現在の反復における、選択された頂点の新しい位置は、選択された頂点の現在の位置として設定されて、ブロック406へと続くことにより、求根法の別の回の反復が開始され、選択された頂点の新しい位置が、決定される。このように、選択された頂点が、ボクセルのエッジに沿って、交差の実際の位置により近い、(新しい)現在の位置へと、調整される(たとえば、移動される)。次回の反復では、選択された頂点のより新しい位置が、ブロック406にて、求根法を用いて、上述のような(新しい)現在の位置にて、決定される。このより新しい位置は、以前の位置よりも、表面のボクセルに対する実際の交差配置に近い。より新しい位置は、所定の基準が、ブロック410にて満たされるまで、同様に上述したように、ブロック408での誤差について、評価される。
いくつかの実施形態では、選択された頂点の現在の位置が、実際の交差点により近い追加の量または大きさだけ、調整(たとえば、移動)可能である。たとえば、追加の量は、決定された誤差に基づき得るか、または所定の量であり得る。たとえば、ブロック408にて決定された誤差の大きさは、近似位置が、実際の位置にどれほど近いかを示し得るものであり、頂点は、実際の位置により近い推定位置に対する誤差に基づいて(たとえば、比例して)、追加的に移動し得る。
ブロック412では、ブロック410の所定の基準が満たされており、選択された頂点の決定された位置が、生成されたメッシュに対して、割り当てられる。本方法は、ブロック414へと続く。
ブロック414では、処理すべき選択されたボクセルの別のメッシュ頂点があるかどうか、判定される。たとえば、選択されたボクセルの他のエッジ上の1つまたは複数のメッシュ頂点位置が、方法400を通じて判定されていなくともよい。処理すべき選択されたボクセルの他のメッシュ頂点がある場合、本方法は、ブロック404へと続き、処理すべき他の頂点を選択する。処理すべき選択されたボクセルに、それ以上頂点がない場合、本方法は、ブロック416へと続く。
ブロック416では、処理すべきボクセルグリッドの他のボクセルがあるかどうか、判定される。処理すべき他のボクセルがある場合、本方法は、ブロック402へと続き、処理すべき他のボクセルを選択する。様々な実施形態では、処理したばかりのボクセルに隣接したボクセルが、選択可能であるか、または、そのボクセルとは別のボクセルが、選択可能である。いくつかの実施形態では、たとえば、所定の閾値または他の基準に基づき、表面が交差したボクセルの全てが、方法400によって処理されるわけではない。処理すべきボクセルグリッドのボクセルがそれ以上ない場合、本方法は、ブロック418へと続いてメッシュを完成させる。たとえば、メッシュの追加の処理が、任意に実行可能である。たとえば、1つまたは複数の追加の技術(たとえば、図9の方法900)を用いて、メッシュの頂点を、さらに調整し、メッシュを記憶し、メッシュを表示するなどである。
図4は、メッシュについて、ボクセルごとに決定することを示し、方法400の1つまたは複数のブロックが、実質的に並行して実行可能であることが、理解されるであろう。たとえば、ブロック402は、複数のボクセルを選択して実行し得るものであり、ブロック404からブロック414が、選択された各ボクセルと実質的に並行して、実行され得る。他の例では、ブロック404では、1つ以上の頂点が、選択され得るものであり、選択された各ボクセルについて、ブロック406からブロック412が、実質的に並行して実行され得る。並行的な実行は、メッシュの決定速度を向上させ得る(複数のボクセル/頂点が、同時に計算可能であるため)。さらに、並行的な実行は、プロセッサ資源をよりよく利用し得る。これは、たとえば、プロセッサが、複数の処理コア(たとえば、GPUまたはマルチコアプロセッサ)を含む場合、かつ/または、複数のスレッドを並行して実行することに対応可能である場合である。
微分可能な表面関数を用いた求根を示すグラフ
図5は、いくつかの実施形態による、微分可能な表面関数を用いる求根法を用いて、メッシュの頂点の位置を取得する例を示す、グラフ500の説明図である。いくつかの実施形態では、図5の例は、図4の方法400に基づいている。
グラフ500は、簡略化のため、2Dの例を示す。グラフ500は、ボクセルの2つの元々の頂点(たとえば、隅)間のエッジ上の位置についての表面関数を表す、曲線502を示す。表面関数は、2Dまたは3D関数から、図4のブロック404について上述した(エッジ)直線上の1次関数へと、変換されている。x軸は、ボクセルの2つの元々の頂点V0およびV1(たとえば、ボクセルの隅)間のボクセルのエッジにわたる位置を、表している。y軸は、その位置での表面関数の値を表している。頂点V0およびV1は、入力データ内に含まれた(x-y座標の)y値を、それぞれの位置での表面関数の値を示す、ボクセル値として有する。V0でのy値は正であり、V1でのy値は負であり、これは、頂点V0およびV1のx値の間の点にて、表面がボクセルエッジと交差することを示している。頂点VAは、表面とボクセルのエッジとの間の交差の実際の位置である(ここでVAは未知)。表面とエッジとは、y=0で交差し、ここで、表面関数はゼロである(表面関数の根)。この位置は、表面の上側(y軸上の正の値)でも、表面の下側(y軸上の負の値)でもない。
いくつかの場合には、図3のブロック306およびブロック308を参照して上述したように、表面関数が解析解を持つ場合、頂点VAの位置は、表面関数を評価して、表面関数がゼロに等しくなる結果(根)をもたらす、この位置を取得することにより、直接的に決定可能である。表面関数が解析解を持たない場合、位置VAに近い頂点位置を取得するために、別の求根法が用いられ得る。この例では、表面関数は、微分可能であるので、たとえば、ニュートン・ラプソン求根法など、表面関数の導関数を用いる求根法が、用いられ得る。
接線504が、求根法を用いて、第1回の反復にて決定され、直線504は、表面関数の導関数に基づき、点V0での接線を表している。接線504は、直線504が水平軸に交差する位置VR1にて、根を有する。位置VR1は、交差の実際の位置VAではないので、表面関数が、位置VR1にて評価される場合には、表面関数は、図示のようにx軸の上方にある曲線502の点VN1を提供する。位置VR1は、誤差を有し、いくつかの実施形態では、線分506として示されるVR1とVN1との間で、位置(y軸に沿って)の誤差により表現可能である。
VN1とゼロ(VAのy値)との間の誤差は、基準を満たさないものと判定され(たとえば、誤差が閾値を超えている)、点VN1を、前回の反復での点V0の代わりに、メッシュ頂点の位置として、求根法の別の反復回が実行される。事実上、頂点の位置は、V0からVN1へと調整(移動)されている。点VN1の接線508が、表面関数の導関数に基づいて、決定される。接線508は、直線508が水平軸に交差する位置VR2にて、根を有する。位置VR2は、交差の実際の位置VAとは異なり、表面関数が、位置VR2にて評価される場合には、表面関数は、図示のようにx軸の上方にある曲線502の点VN2を提供する。点VN2は、点VN1よりもVAに近い。位置VR2は、誤差を有し、線分510として示されるVR2とVN2との間で、位置(y軸に沿って)の誤差により表現可能である。
VR2とゼロ(VAのy値)との誤差が、いまだに基準を満たしていなければ、点VN2を、VN1の代わりに始点として、別の回の反復が実行され得るなどして、追加の反復回を必要なだけ行う。決定されたゼロ位置とVAとの誤差が、基準を満たすと、反復は継続せず、ゼロ位置は、メッシュ頂点の位置とみなされる。
求根を反復改良に用いたメッシュ決定
図6は、いくつかの実施形態による、反復改良にて、数値求根法を用いて、表面を近似するメッシュの頂点の位置を決定する、例示的方法600のフローチャートである。たとえば、方法600は、図3の方法300のブロック314の例示的実施形態であり得るか、または、独立して、すなわち、方法300とは別に、実行され得る。方法600について、メッシュが近似される表面関数は、微分不能関数であり得るか、または、微分可能関数であり得る。いくつかの実施形態では、方法600は、たとえば、サーバシステムおよび/またはクライアントシステム上で、方法200および方法300について説明したのと同様に、実行可能である。
なお、「エッジ」または「ボクセルのエッジ」という用語は、方法600の説明に、説明の目的で用いられている。方法400について同様に説明したように、いくつかの実施形態では、線分が、立方ボクセルの面の実際のエッジであり得るもので、いくつかの実施形態では、たとえば、いくつかのサーフェスネッツ、または方法600で使用可能な同様な技術など、いくつかのメッシュ生成技術では、線分は、隣接するボクセルの中心を接続する(または、2つの隣接するボクセルの他の点を接続する)線であり得る。これらの後者の実施形態では、このような線分は、ボクセルのエッジの代わりに使用可能である。たとえば、方法600での頂点は、ボクセルの実際のエッジではなく、ボクセルのこのような線分に沿って、決定または選択され得る。
方法600は、ブロック602で開始し得る。ブロック602では、処理されるべきボクセルのグリッドから、ボクセルが選択される。ボクセルは、表面と交差するものと判定されるグリッドのボクセルのうちの1つであり、たとえば、図2のブロック206である。本方法は、ブロック604へと続く。
ブロック604では、選択されたボクセル内の頂点が、メッシュ用に選択される。いくつかの実施形態では、選択されたボクセルのエッジの頂点が、選択され、エッジは、表面と交差している。選択された頂点は、現在の位置を有する。いくつかの実施形態では、選択された頂点は、入力データから値が既知である、選択されたボクセルの隅であり得る。いくつかの実施形態では、ブロック604にて、2つの頂点が選択され、ここで、選択された頂点は、2つの既知の頂点の一方であり、たとえば、これら2つの頂点は、既知であって根をまとめるボクセル内の2つの頂点であり、これらの頂点に交差する直線は、表面を横切るようになっている。いくつかの実施形態では、選択された頂点は、他の技術を用いて、決定され得るものであり、たとえば、選択されたボクセルの交差したエッジの中点、または別の技術により推定された位置である。方法600の反復で選択された頂点は、選択されたボクセルのボクセル空間の寸法に制約され得る。
いくつかの実施形態では、メッシュの頂点を探索するエッジが決定された後、表面関数は、そのエッジ上で、2Dまたは3D関数から、1次関数へと変換される。たとえば、図4のブロック404を参照して上述したものと同様である。本方法は、ブロック606へと続く。
ブロック606では、選択された頂点(または、選択された頂点のうちの1つ)の新しい位置が、数値求根法を用いて、表面関数の根として決定される(たとえば、上述の変換された関数)。求根法は、表面関数の根を探索可能である。たとえば、表面関数の結果がゼロとなり、表面がボクセルのエッジと交差する位置である。
様々な数値求根法の1つまたは複数が、用いられ得る。いくつかの例では、求根法には、二分法(bisection technique)(たとえば、根を挟む、2つの既知のボクセルエッジ頂点間の直線の中点を探索し、中点にて表面関数を評価)、割線法(secant technique)(たとえば、2つの最新点または2つの端点による線形補間)、ベジエクリッピング法(Bezier clipping technique)(たとえば、関数をベジエ曲線およびクリップエンド(clip ends)へと変換)、偽位置法(false position technique)(たとえば、2つの最新点による、挟み込み(bracketing)を伴う補間)、リッデル法(Ridders' technique)(たとえば、指数関数を、正、負および中点で、関数に当て嵌める)、Van Wijngaarden-Dekker-Brent法(たとえば、逆二次関数を、3つの最新点に当て嵌める)、および/または、他の求根法があり得る。求根法のゼロの結果は、表面関数のゼロの近似として、使用可能である。この結果は、表面におけるボクセルのエッジとの実際の交差点に、より近い頂点である。
二分法での線形補間を用いた一例では、ブロック604にて、既知であって、表面関数の根を挟む2つの頂点が選択される。たとえば、頂点の一方は、正の値を有し、他方の頂点は、負の値を有する。直線が、これらの頂点間に延び、この線の中点が、近似根として決定される。中点は、2つの頂点の位置に比例する、2つの頂点間で補間された頂点を作成する。これは、たとえば、基礎となる表面関数が線形である場合である(たとえば、いくつかの実施形態では、関数は、非線形であり、たとえば、双線形または双三次である)。本方法は、ブロック608へと続く。
ブロック608では、表面と、ブロック606にて決定された選択された頂点の新しい位置との誤差が、決定される。いくつかの例では、この誤差は、表面関数を、ブロック606にて決定された新しい位置の値で評価し、関数の結果とゼロとの差を決定することにより、決定可能である。表面関数の評価からのゼロという結果は、選択された頂点の新しい位置が、正確に表面上にあることを、示している。本方法は、ブロック610へと続く。
ブロック610では、ブロック608にて決定された誤差が、1つまたは複数の所定の基準を満たすかどうかが、判定される(かつ/または、所定の基準が、それ以外で満たされるか)。たとえば、誤差の閾値量が、ブロック610での使用のために予め決定されていたならば、誤差は、閾値未満となるかどうか、判定される(または、他の実施形態では、閾値を超えているか)。他のまたは追加の基準も、様々な実施形態にて、使用可能である。いくつかの実施形態では、実行されたブロック606からブロック610の反復数が、ブロック610での判定のための代替的または追加的な基準となり得る。たとえば、実行された反復数が、反復閾値を超えていれば(たとえば、3回反復)、所定の基準は満たされている。所定の基準が満たされていれば、本方法は、以下に説明するブロック612へと続く。
ブロック610の所定の基準が、満たされていなければ、現在の反復における、選択された頂点の新しい位置は、選択された頂点の現在の位置(または、2つの頂点が選択されたなら、選択された頂点のうちの一方)となり(割り当てられ)、本方法は、ブロック606へと続けることにより、求根法の別の回の反復を開始し、選択された頂点の新しい位置が、決定される。このように、選択された頂点が、ボクセルのエッジに沿って、交差の実際の位置により近い、(新しい)現在の位置へと、調整される(たとえば、移動される)。
たとえば、二分法および2つの選択された頂点を用いた、上述の例のいくつかの実施形態では、新しい位置は、選択された頂点の一方で、置き換え可能である。たとえば、新しい位置での表面関数の評価が、正の結果を有する場合、新しい位置が割り当てられて、2つの選択された頂点のうちの正である第1の頂点を置き換える。新しい位置での表面関数の評価が、負の結果を有する場合、新しい位置が割り当てられて、2つの選択された頂点のうちの負である第2の頂点を置き換える。このように、2つの頂点は、連続して、ゼロ点を挟む。
次回の反復では、選択された頂点のより新しい位置が、ブロック606にて、同様に上述したように(新しい)現在の位置にて、決定される。このより新しい位置は、以前の位置よりも、表面のボクセルに対する実際の交差配置に近い。より新しい位置は、所定の基準が、ブロック610にて満たされるまで、同様に上述したように、ブロック608での誤差について、評価される。このように、本方法は、複数の反復にわたり、誤差の間隔の細分化を、繰り返すことができる。
いくつかの実施形態では、選択された頂点の現在位置が、実際の交差点により近い追加の量または大きさだけ、調整(たとえば、移動)可能である。たとえば、追加の量は、決定された誤差に基づき得るか、または所定の量であり得る。たとえば、ブロック608にて決定された誤差の大きさは、近似位置が、実際の位置にどれほど近いかを示し得るものであり、頂点は、実際の位置により近い推定位置に対する誤差に基づいて(たとえば、比例して)、追加的に移動し得る。いくつかの実施形態では、方法600の逐次加速緩和にて用いるパラメータが、様々な種類の入力データに対して、調整可能である。
ブロック612では、ブロック610の所定の基準が満たされており、選択された頂点の決定された位置が、生成されたメッシュに対して、割り当てられる。本方法は、ブロック614へと続く。
ブロック614では、処理すべき選択されたボクセルの別のメッシュ頂点があるかどうか、判定される。たとえば、選択されたボクセルの他のエッジ上の1つまたは複数のメッシュ頂点位置が、方法600を通じて判定されていなくともよい。処理すべき選択されたボクセルの他のメッシュ頂点がある場合、本方法は、ブロック604へと戻り、処理すべき他の頂点を選択する。処理すべき選択されたボクセルに、それ以上頂点がない場合、本方法は、ブロック616へと続く。
ブロック616では、処理すべきボクセルグリッドの他のボクセルがあるかどうか、判定される。処理すべき他のボクセルがある場合、本方法は、ブロック602へと戻り、処理すべき他のボクセルを選択する。いくつかの実施形態では、処理したばかりのボクセルに隣接したボクセルが、選択可能であるか、または、そのボクセルとは別のボクセルが、選択可能である。いくつかの実施形態では、たとえば、所定の閾値または他の基準に基づき、表面が交差したボクセルの全てが、方法600によって処理されるわけではない。処理すべきボクセルグリッドのボクセルがそれ以上ない場合、本方法は、ブロック618へと続いてメッシュを完成させる。たとえば、メッシュの追加の処理が、任意に実行可能である。たとえば、1つまたは複数の追加の技術(たとえば、図9の方法900)を用いて、メッシュの頂点を、さらに調整し、メッシュを記憶し、メッシュを表示するなどである。
図6は、メッシュについて、ボクセルごとに決定することを示し、方法600の1つまたは複数のブロックが、実質的に並行して実行可能であることが、理解されるであろう。たとえば、ブロック602は、複数のボクセルを選択して実行し得るものであり、ブロック604からブロック614が、選択された各ボクセルと実質的に並行して、実行され得る。他の例では、ブロック604では、1つ以上の頂点が、選択され得るものであり、選択された各ボクセルについて、ブロック606からブロック612が、実質的に並行して実行され得る。並行的な実行は、メッシュの決定速度を向上させ得る(複数のボクセル/頂点が、同時に計算処理され得るため)。さらに、並行的な実行は、プロセッサ資源をよりよく利用し得る。これは、たとえば、プロセッサが、複数の処理コア(たとえば、GPUまたはマルチコアプロセッサ)を含む場合、かつ/または、複数のスレッドを並行して実行することに対応可能である場合である。
方法600の実施形態の一例が、線形補間、および各反復ごとに誤差間隔を二分する二分求根法を用いた、マーチングトライアングル法の擬似コードとして、以下に示されている。他の実施形態は、たとえば、方法600と同様の求根法のサーフェスネッツなど、他のメッシュ生成法を用い得る。
/*結果は、画素座標でのポリゴン用の{x:, y:}頂点の配列、または、ポリゴンがなければゼロ。ポリゴンには、場合によって、3または4の頂点がある。
A、B、Cは、画素座標である。*/
function getIsoPoly(density, A, B, C) {
const vertex = [{point:A}, {point:B}, {point:C}];
let numInside = 0;
for (let V of vertex) {
V.density = density(V.point);
V.inside = (V.density >= THRESHOLD) ?1 :0;
if (V.inside) { ++numInside; }
}
// Switch based on which of the 8 cases we're in, which reduce to
// 2 trivial cases plus 2 cases with 3-way rotational symmetry.
switch (numInside) {
case 0: // All outside (case 000)
return null;
case 1: // One inside -> tri (cases 100, 010, 001)
// Cyclic shift until vertex[0] is the one inside
while (! vertex[0].inside) { vertex.unshift(vertex.pop()); }
// Produce the triangle with tip at 0
return [cloneXY(vertex[0].point),
rootFindVertex(vertex[1], vertex[0], density),
rootFindVertex(vertex[2], vertex[0], density)];
case 2: // Two inside -> quad (cases 101, 110, 011)
// Cyclic shift until vertex[0] is the one outside
while (vertex[0].inside) { vertex.unshift(vertex.pop()); }
// Produce the quad cutting off point 0
return [cloneXY(vertex[1].point),
rootFindVertex(vertex[0], vertex[1], density),
rootFindVertex(vertex[0], vertex[2], density),
cloneXY(vertex[2].point)];
return;
case 3: // All inside (case 111)
return [cloneXY(A), cloneXY(B), cloneXY(C)];
} // switch
}
/*2つの頂点{point: {x:, y:}, value:}が、
これらの間で補間されて各位置に比例した頂点を、THRESHOLD(surface)に対して補間するように、生成する…。これは、基礎となる密度が線形の場合(通例、双線形または双三次であるため、反復が1回の求根)であるものと仮定する。
A.density<THRESHOLDかつB.density>=THRESHOLDを仮定する。
*/
function rootFindVertex(A, B, density) {
console.assert(A.density < THRESHOLD);
console.assert(B.density >= THRESHOLD);
if (ROOT_ITERATIONS === 0) {
// 0 iterations; just move halfway
return {x:(A.point.x + B.point.x) * 0.5,
y:(A.point.y + B.point.y) * 0.5};
} else {
// General case.Binary search
for (let i = 0; i < ROOT_ITERATIONS - 1; ++i) {
// Slide C between A and B
const C = {point: lerpXY(A.point, B.point,
(THRESHOLD - A.density) / (B.density - A.density))};
// Prepare for the next iteration
C.density = density(C.point);
if (C.density >= THRESHOLD) {
// Isosurface is between A and Cs
B = C;
} else {
// Isosurface is between C and B
A = C;
} // binary search
} // for i
// Final iteration
return lerpXY(A.point, B.point,
(THRESHOLD - A.density) / (B.density - A.density));
}
}
反復改良のある求根法を用いた求根を示すグラフ
図7は、いくつかの実施形態による、反復改良のある求根法を用いて、メッシュの頂点の位置を取得する例を示す、グラフ700の説明図である。いくつかの実施形態では、図7の例は、図6の方法600に基づいている。たとえば、図7の例に用いられた表面関数は、微分可能関数であるか、または、微分不可能関数であり得る。
グラフ700は、簡略化のため、2Dの例を示す。グラフ700は、ボクセルの2つの元々の頂点(たとえば、隅)間のエッジ上の位置にわたる表面関数を表す、曲線702を示しており、図5の曲線502と同様である。表面関数は、2Dまたは3D関数から、図6のブロック604について上述した(エッジ)直線上の1次関数へと、変換されている。x軸は、ボクセルの2つの元々の頂点V0およびV1(たとえば、ボクセルの隅)間のボクセルのエッジにわたる位置を、表している。y軸は、その位置での表面関数の値を表している。V0でのy値は正であり、V1でのy値は負であり、これは、頂点V0およびV1のx値の間の点VAにて、表面がボクセルエッジと交差することを示している(ここで、VAは未知)。
表面関数が連続であって解析解を持たない場合、位置VAに近い頂点位置を取得するために、求根法が用いられ得る。この例では、表面関数は、微分可能であるか、または微分不可能である。求根法は、任意の連続関数について、根を取得可能である。
線704が、頂点V0につき、求根法を用いて、初回の反復にて決定される。たとえば、割線求根法での線形補間が、利用可能であり、ここで、点VS1が、補間されている。たとえば、点VS1は、以下の割線法の方程式を用いて、決定可能である。
この例では、線704は、点V0と点V1との間に延びる直線であり、表面関数曲線702を近似している。線704における根の位置VS1は、水平軸と交差し、ここで、線704のy値がゼロとなる。位置VS1は、表面関数曲線702における実際の根の位置VAとは異なり、表面関数fは、表面関数が位置VS1にて評価される場合、図示のようにx軸の下方にある曲線702上の点VN1を提供する。位置VS1は、誤差を有し、いくつかの実施形態では、線分706として示されるVS1とVN1(VS1での表面関数の結果)との間で、位置(y軸に沿って)の差により表現可能である。
この場合、VN1とゼロ(VAのy値)との間の誤差は、所望の基準を満たさないものと判定され(たとえば、誤差が閾値を超えている)、点VN1を、前回の反復での点V1の代わりにして、求根法の別の反復回が実行される。事実上、頂点の位置は、V1からVN1へと調整(移動)されている。
線708は、第2回目の反復にて、V0とVN1との間に延びる直線である。線708は、線708が水平軸に交差する位置VS2にて、根を有する。位置VS2は、交差の実際の位置VAとは異なり、表面関数が、位置VS2にて評価される場合には、表面関数は、図示のようにx軸の下方にある曲線702の点VN2を提供する。点VN2は、点VN1よりもVAに近い。位置VS2は、誤差を有し、線分710として示されるVS2とVN2との間で、位置(y軸に沿って)の差により表現可能である。
VS2とゼロ(VAのy値)との誤差が、誤差基準を満たしていなければ、点VN2で点VN1を置き換えて、別の回の反復が実行可能であり、追加の反復回を必要なだけ行う。決定されたゼロ位置とVAとの誤差が、基準を満たすと、反復は継続せず、ゼロ位置は、メッシュ頂点の位置とみなされ得る。
メッシュの決定に逐次加速緩和法を使用
図8は、いくつかの実施形態による、逐次加速緩和法を用いて、表面を近似するメッシュの頂点の位置を決定する、例示的方法800を示すフローチャートである。たとえば、方法800は、上述の図2の方法200のブロック210における、頂点位置決定の例示的実施形態であり得る。いくつかの実施形態では、方法800は、図3の方法300のブロック304にて用いられる技術であり得るか、または、独立して、すなわち図3の方法300とは別に利用可能であり、メッシュ内の頂点の位置を決定する。いくつかの実施形態では、方法800は、たとえば、サーバシステムおよび/またはクライアントシステム上で、方法200および方法300について説明したのと同様に、実行可能である。
なお、「エッジ」または「ボクセルのエッジ」という用語は、方法800の説明に、説明の目的で用いられている。方法400および方法600と同様に、いくつかの実施形態では、線分が、立方ボクセルの面の実際のエッジであり得るもので、いくつかの実施形態では、たとえば、いくつかのサーフェスネッツ、または方法800で使用可能な同様な技術など、いくつかのメッシュ生成技術では、線分は、隣接する2つのボクセルの中心を接続する(または、2つの隣接するボクセルの他の点を接続する)線であり得る。後者の実施形態では、このような線分は、ボクセルのエッジの代わりに使用可能である。たとえば、方法800での頂点は、ボクセルの実際のエッジではなく、ボクセルのこのような線分に沿って、決定または選択され得る。
方法800は、入力データが、占有率値または密度値の形式にて提供される(いずれも、本方法において「占有率値」と称される)、いくつかの実施形態にて用いられ得る。このような値は、表面を含む体積により占められた、規定された各ボクセルの量を、示し得る。いくつかの実施形態では、入力データの様々な形式のいずれかが、方法800にて使用可能である。たとえば、関数により記述された表面を表す入力データや、関数で記述されていない表面を表す入力データなどである。
方法800は、ブロック802で開始し得る。ブロック802では、入力データ内のボクセルの集合が、処理すべきボクセルのグリッドから、選択される。いくつかの実施形態では、ボクセルの集合は、表面が交差するボクセルの完全な集合の部分集合である。いくつかの実施形態では、ボクセルの集合は、ボクセルグリッドの近接ボクセルの集合である。たとえば、近接ボクセルの集合は、3x3個の近接ボクセルの集合、5x5の近接ボクセルの集合などであり得る。集合全体よりも小さいボクセルの集合を選択することにより、メモリおよび/または処理能力の要件が、メッシュ生成のために用いられる演算システムについて、低減可能である。いくつかの実施形態では、選択されたボクセル集合のみが、方法800により処理され、他のボクセルは、方法800により無視される。他の実施形態では、ボクセルの複数の様々な集合が、処理のために選択可能である。たとえば、様々な回の反復にて、様々なプロセッサまたはプロセッサコアについて、部分的または完全に順番になどである。いくつかの実施形態では、表面が交差したグリッドのボクセルの全てが、ブロック802にて選択可能である。これは、多数のボクセルを処理するメモリおよび処理能力の要件により、いくつかの実施形態では、現実的ではないことがある。本方法は、ブロック804へと続く。
ブロック804では、メッシュの頂点の初期近似位置が、選択されたボクセル集合にて、決定される。いくつかの実施形態では、メッシュの頂点の初期近似位置が、選択されたボクセル集合のエッジ上で、決定される。近似位置は、選択された集合内のボクセルに適用する、入力データのボクセル値に基づいて、決定される。たとえば、近似位置は、線形補間を用いることにより、決定可能である。いくつかの例では、入力データから知られる近接ボクセルの値が、取得されて、これらの近接値間で線形補間が可能であり、メッシュの頂点の近似初期位置を探索することができる。いくつかの実施形態では、頂点の初期近似位置は、他の技術を用いて決定可能である。いくつかの実施形態では、方法800の反復にて選択された頂点は、ボクセル集合にて関連づけられて選択されたボクセルの各ボクセル空間の寸法へと、制約され得る。本方法は、ブロック806へと続く。
ブロック806では、選択されたボクセル集合における各ボクセルを占める近似体積が、ブロック804にて決定された頂点の近似位置に基づいて、決定される。いくつかの実施形態では、各ボクセルについて決定された近似占有体積は、入力データが占有率値の形式である場合には、入力データと比較し得る近似占有値である。入力データは、ボクセル内の占有体積を表す各ボクセルについてのボクセル値を、指定していてもよい。いくつかの実施形態では、3D積分は、近似体積がブロック804にて決定される各ボクセルにて、決定可能である。この積分の結果は、ボクセル(たとえば、内側)を占めるメッシュの体積であるため、そのボクセルを占める体積の現在の近似である。本方法は、ブロック808へと続く。
ブロック808では、選択されたボクセル集合の近似体積と、入力データにおけるボクセルの対応するボクセル値との間の誤差が、決定される。たとえば、決定された各近似体積は、入力データにおける対応するボクセル値と、比較され得るものであり、これらの値の間の差が、決定されて、そのボクセルについての誤差を示す。関連づけられた誤差が、選択されたボクセル集合の各ボクセルについて、決定され得る。いくつかの実施形態では、入力データは、決定された近似値と直接比較可能な占有率値を、含み得る。いくつかの実施形態では、入力データは、たとえば、方法200内の入力データに当て嵌められた、新しいボクセルグリッドに基づいて、比較ができるように、決定された近似値に準拠するフォーマットへと、または他のフォーマットへと、変換可能である。本方法は、ブロック810へと続く。
ブロック810では、選択されたボクセル集合についてブロック808にて決定された誤差が、1つまたは複数の所定の基準を満たすかどうか、決定される。たとえば、誤差の閾値量が、ブロック810での仕様のために予め決定されていたならば、集合内の各ボクセルの誤差は、閾値未満となるかどうか、判定される(または、他の実施形態では、閾値を超えているか)。他のまたは追加の基準も、様々な実施形態にて、使用可能である。いくつかの実施形態では、実行されたブロック806からブロック812の反復数が、ブロック810での判定のための代替的または追加的な基準となり得る。たとえば、反復数が、反復閾値を超えていれば(たとえば、3回反復)、所定の基準は満たされている。所定の基準が満たされていれば、本方法は、以下に説明するブロック814へと続く。
ブロック810の所定の基準が集合内のボクセルに合わない場合、処理はブロック812へと続き、ここで、1つまたは複数の選択されたボクセルの頂点の1つまたは複数の近似位置が、調整されて(たとえば、移動して)、逐次加速緩和法による誤差を低減する。いくつかの例では、1つの頂点が選択移動可能か、または、複数の頂点が選択移動可能である。たとえば、近似体積が、対応するボクセル値よりも大きい場合、近似頂点の1つまたは複数が、体積へ向けて内側へと移動され、近似体積が、対応するボクセル値未満である場合、近似頂点の1つまたは複数が、体積から外側へと移動される。いくつかの実施形態では、逐次加速緩和法は、たとえば、頂点の1つを移動、頂点の全てを移動などのように、頂点を移動するため、移動した頂点が特定の方法に基づいて選択可能となる、ボクセルを決定する。いくつかの実施形態では、これらの頂点が移動した量が、調整可能な発見的手法(tunable heuristic)に基づいて(たとえば、メッシュの所望の特徴に基づいて)決定可能である。たとえば、選択された頂点は、同量だけ移動可能であり、または、選択された頂点であって前回の反復で移動したものは、選択された頂点であって移動しなかったものよりも少ない量だけ、移動可能である。
逐次加速緩和法は、前回の反復と、たとえば以下のような各成分について、連続して算出された(ガウスザイデル法を用いた)ガウスザイデル反復(Gauss-Seidel iterate)との間の加重平均の形式を取る、反復法である。
ここで、
は、ガウスザイデル反復を示し、ωは、緩和係数である。反復が解に収束(表面交差の実際の位置)する率を加速する緩和係数として、ある値が選択され得る。
いくつかの実施形態では、緩和係数1の逐次加速緩和法とみなされ得る、ガウスザイデル法が用いられ得る。
1つまたは複数の頂点の移動後、本方法は、次の反復にて、ブロック806へと続き、ブロック812で決定された頂点の新しい近似位置に基づき、選択されたボクセルの近似体積を決定し、ブロック808にて、新しい近似体積についての誤差を決定し、ブロック810にて、誤差が、所定の基準を満たすかどうか判定する。これらの反復内容が、連続した反復の各々について、ブロック812にて新たに決定された頂点位置を用いて、ブロック810にて、誤差が所定の基準を満たすまで、繰り返される。ブロック810の点にて、本方法はブロック814へと続く。このように、本方法は、閾値誤差内の頂点位置へと、反復的に収束する。
いくつかの実施形態では、連続する反復にて、以前の反復で移動済みの1つまたは複数の頂点の代わりに、選択されたボクセル集合の1つまたは複数の異なる頂点が、移動可能であり、かつ/または、選択されたボクセル集合の1つまたは複数の同一の頂点が、後続の反復にても移動可能である。いくつかの例では、ブロック812の1回の反復にて、1つの頂点が移動され、移動した頂点に近接する他の頂点が、ブロック812における次の反復にて、移動されるなどである。他の例では、複数の頂点が、1回の反復にて移動され、複数の他の頂点は、次の反復にて移動されるなどある。他の例では、複数の頂点が、1回の反復にて移動され、1つまたは複数の同一の頂点が、次の反復にて移動される。たとえば、他の頂点が、各反復にて、ランダムまたは規則的に移動可能である。他の例では、選択された集合の全頂点が、各反復にて移動される。頂点を移動するのに用いられるこの技法は、たとえば、入力データの形式および/または内容に依存し得るものであり、この技法は、実際の交差点へのより良好(たとえば、高速)な収束をもたらす。
ブロック814では、ブロック810の所定の基準が満たされており、選択されたボクセル集合の頂点の決定された近似位置が、生成されたメッシュに対して、割り当てられる。本方法は、ブロック816へと続く。
ブロック816では、メッシュの頂点を取得すべき、ボクセルグリッドの1つまたは複数の他のボクセル(選択されたボクセル集合の外側)の有無が、判定される。たとえば、表面が交差するボクセルの他のエッジ上の1つまたは複数の頂点位置は、方法800では決定されなくともよい。いくつかの実施形態では、処理したばかりのボクセルに隣接した1つまたは複数のボクセルが、選択可能であるか、または、そのボクセルグリッドとは別のボクセルが、選択可能である。いくつかの実施形態では、たとえば、所定の閾値または他の基準に基づき、表面が交差したボクセルの全てが、方法800によって処理されるわけではない。処理すべき1つまたは複数の他のボクセルがあれば、本方法は、ブロック802へと戻って、処理すべき他のボクセル集合を選択する。処理すべきボクセルグリッドのボクセルがなければ、本方法は、ブロック818へと続く。
ブロック818では、本方法は、メッシュを完成させる。たとえば、メッシュの追加の処理が、任意に実行可能である。たとえば、1つまたは複数の追加の技術(たとえば、図9の方法900)を用いて、メッシュの頂点を、さらに調整し、メッシュを記憶し、メッシュを表示するなどである。
いくつかの実施形態では、メッシュの頂点および/またはボクセルの並列処理が、実行され得る。たとえば、処理されるボクセル集合における各ボクセルについて、方法800の1つまたは複数のブロックでの頂点および/またはボクセルの並列処理である。様々な実施形態では、方法800の1つまたは複数のブロックは、頂点および/またはボクセルを、順番に、または実質的に並列に、実行可能である。たとえば、ブロック802は、複数のボクセル集合を選択して実行し得るものであり、ブロック804からブロック816が、選択された各ボクセル集合と実質的に並行して、実行され得る。並行的な実行は、メッシュの決定速度を向上させ得る(複数のボクセル/頂点が、同時に計算処理され得るため)。さらに、並行的な実行は、プロセッサ資源をよりよく利用し得る。これは、たとえば、プロセッサが、複数の処理コア(たとえば、GPUまたはマルチコアプロセッサ)を含む場合、かつ/または、複数のスレッドを並行して実行することに対応可能である場合である。
メッシュの細分による表面の近似
図9は、いくつかの実施形態による、メッシュの1つまたは複数の部分(たとえば、線)を細分することにより、表面を近似するメッシュの頂点の位置を決定する、例示的方法900を示すフローチャートである。たとえば、方法900は、追加された頂点を、表面上に、または近似的に表面上になるように、反復的に調整(たとえば、移動)することができる。たとえば、方法900は、上述の図2の方法200のブロック210における、頂点位置決定の例示的実施形態であり得る。いくつかの実施形態では、方法900は、図3の方法300のブロック304にて用いられる技術であり得るか、または、独立して、すなわち図3の方法300とは別に利用可能であり、メッシュ内の頂点の位置を決定する。いくつかの実施形態では、方法900は、1つまたは複数の他の技法、たとえば、ここに説明された方法400、600または800、または他の既知の技法(たとえば、マーチングキューブ法、サーフェスネッツ、または関連の技法)の前後、またはそれとともに実施可能である。いくつかの実施形態では、方法900は、たとえば、サーバシステムおよび/またはクライアントシステム上で、方法200および方法300について説明したのと同様に、実行可能である。
なお、「エッジ」または「ボクセルのエッジ」という用語は、方法900の説明に、説明の目的で用いられている。上述の方法と同様に、いくつかの実施形態では、線分が、立方ボクセルの面の実際のエッジであり得るか、または、いくつかの実施形態では、たとえば、いくつかのサーフェスネッツ、または方法900で使用可能な同様な技術など、いくつかのメッシュ生成技術では、線分は、隣接する2つのボクセルの中心を接続する(または、2つの隣接するボクセルの他の点を接続する)線であり得る。後者の実施形態では、このような線分は、ボクセルのエッジの代わりに使用可能である。たとえば、方法900での頂点は、ボクセルの実際のエッジではなく、ボクセルのこのような線分に沿って、決定または選択され得る。
方法900は、入力データが、距離場として提供されるか、かつ/または、表面関数により記述された表面を表す、いくつかの実施形態にて、使用可能である。いくつかの実施形態では、入力データは、占有率値または密度値として、提供されてもよい。
方法900は、ブロック902で開始し得る。ブロック902では、処理されるべきボクセルのグリッドから、ボクセルが選択される。ボクセルは、表面と交差したグリッドのボクセルのうちの1つであり、たとえば、ブロック206である。本方法は、ブロック904へと続く。
ブロック904では、選択されたボクセルにて、頂点が選択される。いくつかの実施形態では、選択されたボクセルの面(またはエッジ)上の頂点が選択され、面(またはエッジ)は、表面と交差する。いくつかの実施形態では、方法900は、ここに説明された方法400、600もしくは800、または他の既知の技法など、メッシュを生成する方法が実行された後に、実行されてもよく、このような先行する方法により決定された、ボクセルの面上のメッシュの近似頂点は、ブロック904にて選択され得る。このような実施形態では、頂点は、先行する方法により決定された近似位置を有し得る。いくつかの実施形態では、表面関数が、たとえば、図4のブロック404について上述したのと同様に、2Dまたは3D関数から、エッジ上の1次関数へと、変換可能である。本方法は、ブロック906へと続く。
ブロック906では、表面の曲率は、選択されたボクセルにわたって、たとえば、選択されたボクセルのエッジにわたって、決定(たとえば、推定)される。いくつかの実施形態では、表面を規定する表面関数が、既知で微分可能である場合、曲率は、このような階差の方法により、選択された頂点にて、接線曲面または法線を決定することにより、推定可能である。接線の特徴が、比較されて、これらの頂点間に提供された表面の推定された曲率を、決定可能である。たとえば、頂点での2本の接線がほぼ同じ角度である場合、頂点間の表面は、顕著に曲がる傾向はないが、2本の接線が大幅に異なる角度を有する場合には、これらの間の表面は、顕著に曲がる傾向がある。
いくつかの実施形態では、表面の曲率は、表面関数を評価することにより、決定可能である(表面関数が既知の場合)。たとえば、表面関数は、交差しているボクセル面のエッジの中点にて(または、選択された頂点を接続する線の中点にて)、サンプリングまたは評価可能である。関数の結果と表面との間の距離は、決定可能であり、この距離は、表面の曲率を示し得る(たとえば、中点にて、表面への距離が長くなるほど、曲率も大きくなる)。他の実施形態では、たとえば、選択された頂点にて、または、それ以外に、選択されたボクセルの交差面にわたり、近似表面の曲率を局所的に決定する他の方法が、使用可能である。本方法は、ブロック908へと続く。
ブロック908では、ブロック906にて決定された曲率が、閾値を超えているかどうかが、判定される。曲率の閾値は、選択されて、たとえば、許容可能な精度範囲内の線により近似されないようにするには十分に大きな曲率を指定し得る。いくつかの例では、2本の接線が曲率を決定するために上述のように用いられる場合、曲率の閾値は、2本の接線の角度の閾値の差として提供され得る。これは、接線の角度が、閾値の角度差よりも大きい場合、表面の曲率は、曲率の閾値よりも大きいというようにである。同様に、曲率の閾値は、評価された中点と表面との間の距離の量に対する閾値として、提供され得る。中点は、上述したように選択された頂点間に配置されている。曲率が、閾値未満の場合(それ以外には、閾値を満たさない場合)、本方法は、以下に説明するブロック918へと続く。曲率が閾値を超えた場合(それ以外には、閾値を満たす場合)、本方法は、ブロック910へと続く。
ブロック910では、追加の頂点が、選択されたボクセル内の2つの既存の頂点間に挿入されることにより、2つの既存の頂点間の線を、ポリラインへと細分する。いくつかの実施形態では、2つの既存の頂点は、ブロック904にて選択された頂点となり得る。いくつかの例では、2つの既存の頂点は、選択されたボクセルのエッジ上に提供され、追加の頂点は、2つの既存の頂点間の中点に、または2つの頂点に関して異なる点に、挿入可能である(たとえば、既存の頂点の一方に、既存の頂点の他方よりも近い)。いくつかの実施形態は、ブロック906にて決定された曲率に基づく、2つの既存の頂点間の位置に、追加の頂点を配置し得る。たとえば、曲率が、歪曲、すなわち2つの既存の頂点の一方に偏っていると判定された場合、追加の頂点が、その既存の頂点により近く配置され得る。
いくつかの実施形態では、追加の頂点は、既存のメッシュ(たとえば、メッシュポリゴンにおけるある側面)の線における2つの既存の頂点間に挿入され、既存のメッシュは、方法900の先行する反復回、または、方法400、600、800または他のメッシュ生成技法などの先行する方法にて、生成されたものでもよい。いくつかの実施形態では、追加の頂点は、たとえば、図2のブロック208にて決定された、ポリゴンのテンプレートの1つまたは複数のポリゴンの2つの既存の頂点間に挿入可能であり、このような、テンプレートは、方法900用の「メッシュ」と称され得る。本方法は、ブロック912へと続く。
ブロック912では、表面と、ブロック910にて決定された追加の頂点の位置との誤差が、決定される。たとえば、この誤差は、表面関数を追加の頂点の位置の値で評価し、関数の結果とゼロとの差を決定することにより、決定可能である。表面関数のこのような評価からのゼロという結果は、追加の頂点の位置が、正確に表面上にあることを、示している。本方法は、ブロック914へと続く。
ブロック914では、誤差が、1つまたは複数の所定の基準を満たすかどうか、判定される。たとえば、誤差の閾値量が、ブロック914での仕様のために予め決定されていたならば、誤差は、閾値未満となるかどうか、判定される(または、他の実施形態では、閾値を超えているか)。他のまたは追加の基準も、様々な実施形態にて、使用可能である。いくつかの実施形態では、実行されたブロック912からブロック916の反復数が、ブロック914での判定のための代替的または追加的な基準となり得る。たとえば、反復数が、反復閾値を超えていれば(たとえば、3回反復)、所定の基準は満たされている。所定の基準が満たされていれば、本方法は、以下に説明するブロック918へと続く。
ブロック914にて所定の基準が満たされない場合、本方法は、ブロック916へと続き、ここで、追加の頂点の位置は、調整(たとえば、移動)されて、ブロック912にて決定された誤差が、低減するように、たとえば、追加の頂点が、実際の表面により近くなるように配置される量だけ移動されるようになる。いくつかの実施形態では、追加の頂点の新しい(移動後の)位置が、方法400または方法600を参照して上述したように、たとえば、微分可能関数、二分法などを用いた求根法など、同様に求根法を用いて決定される。いくつかの実施形態では、追加の頂点は、決定された誤差に基づく量または所定の量、移動可能である。いくつかの実施形態では、誤差の大きさは、追加の頂点の位置が、実際の位置にどれほど近いかを示し得るものであり、追加の頂点は、実際の位置により近い推定位置に対する誤差に基づいて(たとえば、比例して)、移動し得る。
そして、本方法は、ブロック912へと続き、追加の頂点を調整する別の回の反復を開始し、ここで、前回の反復から移動した位置が、追加の頂点の現在の位置になる。次回の反復では、本方法は、追加の頂点の移動後の位置の誤差を、決定して評価し、所定の基準により示されるように、追加の頂点を移動させ、これは、同様に上述されたように、必要であれば、複数の反復回について、誤差がブロック914での所定の基準を満たすまでなされる。
ブロック918では、ブロック914の所定の基準は満たされており、方法900にて処理すべきボクセルグリッドの別のボクセルがあるかどうか、判定される。処理すべき他のボクセルがある場合、本方法は、ブロック902へと戻り、処理すべき他のボクセルを選択する。いくつかの実施形態では、処理したばかりのボクセルに隣接したボクセルが、選択可能であるか、または、そのボクセルグリッドとは別のボクセルが、選択可能である。いくつかの実施形態では、たとえば、所定の閾値または他の基準に基づき、表面が交差したボクセルの全てが、方法900によって処理されるわけではない。
いくつかの実施形態では、1つまたは複数の追加の頂点を、上述の追加の頂点により先行して細分されていた、1つまたは複数のポリライン上のメッシュへと、追加することにより、メッシュをさらに細分可能である。方法900の反復で選択されて追加された頂点は、関連づけられて選択されたボクセルのボクセル空間の寸法に制約され得る。たとえば、ブロック906と同様に、表面の曲率は、ボクセルの元々の頂点と、最初の追加の頂点との間で決定可能であり、この曲率が曲率の閾値を超えた場合(または、いくつかの実施形態では、最初の追加の頂点後の追加の頂点に用いられる別の閾値を超えた場合)、ブロック908と同様に、その元々の頂点と最初の追加の頂点との間のメッシュ線は、第2の追加の頂点を、そのメッシュ線に対して追加することにより、さらに細分可能である。いくつかの実施形態では、第2の追加の頂点の位置は、最初の追加の頂点についてのブロック916にて上述したのと同様に、表面に近づけて移動させることにより、反復的に改良可能である。たとえば、第2の追加の頂点と表面との誤差が、誤差閾値を超えた場合にである。いくつかの実施形態では、第3、第4および/またはさらなる追加の頂点が、同じメッシュ線に対して同様に追加可能であり、位置が反復的に改良される。いくつかの場合または実施形態では、このような第2(および以降の)追加の頂点は、たとえば、ボクセルの内側または他の位置内にある、ボクセルの面またはエッジ上ではないボクセルの位置に、メッシュに対して追加可能である。
ブロック918にて決定されたように処理すべきボクセルグリッドのボクセルがなければ、本方法は、ブロック920へと続き、メッシュを生成または修正する。いくつかの実施形態では、追加の頂点の位置は、メッシュに割り当てられ、たとえば、メッシュの三角形または他のポリゴンが、作成されるか調整されて、方法900によって追加された追加の頂点を、組み込む。たとえば、メッシュ線が、追加の頂点へと引かれ得る。いくつかの実施形態では、メッシュの追加の処理が、任意に実行されてもよい。たとえば、1つまたは複数の技術を用いて、メッシュ頂点位置をさらに調整し、メッシュを記憶し、メッシュを表示するなどである。
図9は、メッシュについて、ボクセルごとに決定することを示し、方法900の1つまたは複数のブロックが、実質的に並行して実行可能であることが、理解されるであろう。たとえば、ブロック902は、複数のボクセルを選択して実行し得るものであり、ブロック904からブロック918が、選択された各ボクセルと実質的に並行して、実行され得る。並行的な実行は、メッシュの決定速度を向上させ得る(複数のボクセル/頂点が、同時に計算処理され得るため)。さらに、並行的な実行は、プロセッサ資源をよりよく利用し得る。これは、たとえば、プロセッサが、複数の処理コア(たとえば、GPUまたはマルチコアプロセッサ)を含む場合、かつ/または、複数のスレッドを並行して実行することに対応可能である場合である。
メッシュの一部を細分して頂点を追加し、追加された頂点の位置を改良することを示すグラフ
いくつかの実施形態により、図10は、メッシュの一部を細分して、頂点を追加する例を示すグラフの説明図であり、図11は、追加された頂点の位置を改良する例を示すグラフの説明図である。いくつかの実施形態では、図10の例は、図9の方法900に基づいている。
グラフ1000は、簡略化のため、2Dの例を示す。グラフ1000は、いくつかの実施形態では、ボクセルの別々の(たとえば、対向する)エッジ上の2つの頂点V0およびV1間のボクセルのエッジ上の(かつ/または面にわたる)位置にわたる表面関数を表す曲線1002を示す。表面関数は、2Dまたは3D関数から、ブロック904または404を参照して上述したのと同様のエッジ上の1次関数へと、変換されている。x軸は、ボクセルのエッジ(または面)にわたる位置を表す。y軸は、その位置での表面関数の値を表している。位置VAは、表面とボクセルのエッジとの間の交差の実際の位置であり、ここで、表面関数はゼロである。
線1004が、頂点V0およびV1間に、これらの頂点間の表面経路の近似として、提供されている。いくつかの実施形態では、線1004は、図10の例にて実行される方法に先立って生成されたメッシュの一部であり得るか、または、図10の方法の一部として生成され得る。
表面の曲率は、頂点V0およびV1にて決定される。たとえば、接線1006は、頂点V0にて決定可能であり、接線1008は、頂点V1にて決定可能である。これらの接線の角度は、曲率を決定するために、比較され得る。この例では、接線1006および1008の角度の差は、閾値角度よりも大きいので、頂点V0およびV1間の表面の曲率の角度が大きいことを示している。
曲率の閾値を超えた曲率の検出に応じて、追加の頂点VR1が、頂点V0と頂点V1とを接続する線1004に対して追加される。この例では、頂点VR1は、V0およびV1間の中点に追加されている。VR1は、他の実施形態では、線1008上の他の位置に追加され得る。
図11は、追加の頂点VR1が、表面により近い位置へと移動された、図10のグラフ1000を示す。この例では、VN1は、追加の頂点VR1の実際の関数値(y値)である。VN1は、ゼロ(y=0)位置にはないので、表面上にあるわけではない。VN1は表面により近く移動されて、ほぼ表面上にある。この例では、ニュートン・ラプソン求根法(表面関数は微分可能)などの求根法が、用いられている。求根法により取得された根は、VN1での接線1102が水平軸と交わる位置に基づく、頂点VN2にある。VN2は、VN1よりも、VAでの表面位置に近い。
VN2が、VAの閾値距離内にあれば、求根法において、それ以上反復が行われることはなく、VN2が、メッシュの頂点として割り当てられる。これにより、線1004の代わりに用いられる、2本のメッシュ線1104および1106がもたらされ、メッシュ線1104および1106は、表面曲線1002を、線1004よりも近く近似している。
いくつかの実施形態では、追加の反復処理が実行され得る。たとえば、頂点V0およびVN2での曲率が、評価され、曲率が曲率の閾値を超えている場合、メッシュ線1104は、第2の追加の頂点を、2本の線を有するポリラインへと細分し得る。第2の追加の頂点は、ボクセルのエッジまたは面上にある必要はない(たとえば、ボクセル内に位置し得る)。いくつかの実施形態では、第2の追加の頂点は、たとえば、求根法以外の別の技法を用いて、移動可能である。
方法400、600、800または900内のブロックは、上述とは異なる順番で実行(または反復)可能であり、かつ/または、1つまたは複数のブロックが省略され得る。これらの方法は、サーバ上(たとえば、図12の102)および/またはクライアント装置(たとえば、図12の1210または1216)上で、実行可能である。
例示的システムアーキテクチャ
図12は、本開示のいくつかの実施形態による、例示的システムアーキテクチャ1200を示す。システムアーキテクチャ1200(ここでは、「システム」とも称される)は、オンラインプラットフォーム1202、第1のクライアント装置1210(一般に、ここでは、「クライアント装置1210/1216」と称される)、ネットワーク1222と、第2のクライアント装置1216とを、備えている。オンラインプラットフォーム1202は、他にもあるものの、特に、アプリケーションエンジン1204と、1つまたは複数のアプリケーション1205と、サーチエンジン1206と、データ記憶部1208とを、備え得る。クライアント装置1210は、アプリケーション1212を、含み得る。クライアント装置1216は、アプリケーション1218を、含み得る。ユーザ1214および1220は、それぞれ、クライアント装置1210および1216を利用して、オンラインプラットフォーム1202と、対話可能である。
システムアーキテクチャ1200は、説明のために提供されている。いくつかの実施形態では、システムアーキテクチャ1200は、図12に示すものと同一または異なる様式で構成された、同一か、より少ないか、より多いか、あるいは異なる要素を、備え得る。
一実施形態では、ネットワーク1222は、公共ネットワーク(たとえば、インターネット)、私設ネットワーク(たとえば、ローカルエリアネットワーク(LAN)または広域ネットワーク(WAN))、有線ネットワーク(たとえば、イーサネットネットワーク)、無線ネットワーク(たとえば、802.11ネットワーク、Wi-Fi(登録商標)ネットワークまたは無線LAN(WLAN))、セルラーネットワーク(たとえば、ロングタームエボリューション(LTE)ネットワーク)、ルータ、ハブ、スイッチ、サーバコンピュータ、または、これらの組み合わせを、含み得る。
一実施形態では、データ記憶部1208は、非一時的コンピュータ可読メモリ(たとえば、ランダムアクセスメモリ)、キャッシュ、ドライブ(たとえば、ハードドライブ)、フラッシュドライブ、データベースシステム、または、データ記憶可能な他の種類の構成要素もしくは装置であってもよい。データ記憶部1208は、複数の演算装置(たとえば、複数のサーバコンピュータ)に及ぶこともある、複数の記憶要素(たとえば、複数のドライブまたは複数のデータベース)を、さらに含み得る。
いくつかの実施形態では、オンラインプラットフォーム1202は、1つまたは複数の演算装置を有するサーバ(たとえば、クラウドコンピューティングシステム、ラックマウントサーバ、サーバコンピュータ、物理サーバのクラスタ、仮想サーバなど)を、備え得る。いくつかの実施形態では、サーバは、オンラインプラットフォーム1202内に含まれてもよく、独立したシステムであってもよく、または、他のシステムもしくはプラットフォームの一部であってもよい。
いくつかの実施形態では、オンラインプラットフォーム1202は、1つまたは複数の演算装置(ラックマウントサーバ、ルータコンピュータ、サーバコンピュータ、パーソナルコンピュータ、メインフレームコンピュータ、ラップトップコンピュータ、タブレットコンピュータ、デスクトップコンピュータなど)、データ記憶部(たとえば、ハードディスク、メモリ、データベース)、ネットワーク、ソフトウェアコンポーネント、および/または、オンラインプラットフォーム1202上の動作を実行するのに用いられて、ユーザにオンラインプラットフォーム1202へのアクセスを提供し得る、ハードウェアコンポーネントを、備えていてもよい。オンラインプラットフォーム1202は、ウェブサイト(たとえば、1つまたは複数のウェブページ)、または、ユーザにオンラインプラットフォーム1202により提供されているコンテンツへのアクセスを提供するのに用いられ得る、アプリケーションバックエンドソフトウェアを、備えていてもよい。たとえば、ユーザは、クライアント装置1210/1216上のそれぞれのアプリケーション1212/1218を用いて、オンラインプラットフォーム1202にアクセスしてもよい。
いくつかの実施形態では、オンラインプラットフォーム1202は、ユーザ間、または一種のユーザ生成コンテンツシステムに接続を提供する、ソーシャルネットワークの一種であってもよく、そのコンテンツシステムは、ユーザ(たとえば、エンドユーザまたは消費者)が、他のユーザと、オンラインプラットフォーム1202を介して通信可能とし、その通信は、ボイスチャット、ビデオチャット、またはテキストチャットを含んでいてもよい。本開示のいくつかの実施形態では、「ユーザ」は、一個人として表されてもよい。しかし、本開示の他の実施形態は、ユーザのグループまたは自動化供給源により制御されるエンティティ(entity)である「ユーザ」(たとえば、作成ユーザ)をも含んでいる。
いくつかの実施形態では、オンラインプラットフォーム1202が、入力データに基づき、ここに説明された方法および特徴のうちの1つまたは複数を用いて、メッシュを生成可能である。いくつかの実施形態では、1つまたは複数のクライアント装置が、入力データに基づき、ここに説明された方法および特徴のうちの1つまたは複数を用いて、メッシュを生成可能である。
いくつかの実施形態では、オンラインプラットフォーム1202は、仮想ゲーミングプラットフォームであってもよい。たとえば、ゲーミングプラットフォームは、1人のプレーヤまたは複数のプレーヤのゲームを、ゲーム(たとえば、ユーザ生成ゲーム、または他のゲーム)にアクセスまたはそれと対話し得るユーザのコミュニティに対して、クライアント装置1210/1216を用いて、ネットワーク1222を通じて、提供してもよい。いくつかの実施形態では、ゲームは、たとえば、2次元(2D)ゲーム、3次元(3D)ゲーム(たとえば、3Dユーザ生成ゲーム)、仮想現実(VR)ゲーム、または拡張現実(AR)ゲームであってもよい。ゲームにて表されているオブジェクトは、ここで説明されるデータから生成されたメッシュによって規定されたオブジェクトを含み得る。いくつかの実施形態では、ユーザは、ゲームを検索して、検索結果から選択された1つまたは複数のゲームにて、他のユーザとのゲームプレイに参加してもよい。いくつかの実施形態では、検索結果から選択されたゲームは、ゲームの他のユーザと、リアルタイムでプレイされてもよい。いくつかの実施形態では、ゲームプレイは、ゲーム(たとえば、1205)内のクライアント装置(たとえば、1210および/または1216)を用いた、1人または複数人のプレーヤの対話のことであってもよく、クライアント装置1210または1216のディスプレイまたは他の出力装置上での対話の提示のことであってもよい。
いくつかの実施形態では、オンラインプラットフォーム1202は、ソーシャルネットワークプラットフォーム、購入プラットフォーム、メッセージングプラットフォーム、作成プラットフォーム、ユーザによる閲覧および操作用のデジタルコンテンツを提供するプラットフォーム(たとえば、医用スキャニング、地形マップなど)などであり得る。他の共同プラットフォームを、オンラインプラットフォーム1202の代わりに、またはそれに加えて、ここで説明された(たとえば、それらの表面または他の特徴についてのメッシュにより規定された、3Dまたは2Dデジタルオブジェクトを用いた)特徴とともに使用可能である。
1つまたは複数のアプリケーション1205が、オンラインプラットフォームにより提供される。いくつかの実施形態では、アプリケーション1205は、アプリケーションのコンテンツ(たとえば、デジタルメディアアイテム)をエンティティに提示するように構成された、ソフトウェア、ファームウェアまたはハードウェアを用いて、実行または読込可能な電子ファイルを含み得る。たとえば、アプリケーション1205は、アプリケーションコンテンツを提示するゲームであり得る。いくつかの実施形態では、アプリケーション1212/1218が実行されてもよく、アプリケーション1205が、アプリケーションエンジン1204と関連して描画されてもよい。
なお、3D環境または3Dワールドは、アプリケーションコンテンツの表現である幾何学的データの3次元表現を用いたグラフィックスを用いる(または、幾何学的データの3D表現が用いられてもそうでなくとも、少なくとも、コンテンツを提示して3Dコンテンツとして現れるようにする)。2D環境または2Dワールドは、アプリケーションコンテンツの表現である幾何学的データの2次元表現を用いた、グラフィックスを用いる。
いくつかの実施形態では、オンラインプラットフォーム1202は、1つまたは複数のアプリケーション1205をホスティング可能であり、ユーザが、クライアント装置1210/1216のアプリケーション1212/1218を用いて、アプリケーション1205と対話できるようにする(たとえば、アプリケーション、アプリケーションコンテンツ、または他のコンテンツを検索)。いくつかの実施形態では、オンラインプラットフォーム1202のユーザ(たとえば、1214および/または1220)は、たとえば、ゲーム、ビデオ、画像、オーディオデータ、文書など、アプリケーションおよびアプリケーションコンテンツを、プレイ、作成、検索、対話、または構築してもよく、他のユーザと対話し、アプリケーション1205のアプリケーションオブジェクトを作成および構築してもよい(たとえば、ここでは「アイテム」または「視覚アイテム」とも称される)、かつ/または、オブジェクトを検索してもよい。たとえば、ユーザ作成仮想ゲームアイテムの作成では、ユーザは、特に、キャラクタ、キャラクタ用の装飾、対話式ゲーム用の1つまたは複数の仮想環境、ゲームアプリケーション1205内で用いられる構築構造(build structures)を、作成してもよい。いくつかの実施形態では、オンラインプラットフォーム1202は、アプリケーションコンテンツを、アプリケーション(たとえば、1212)へと送信してもよい。いくつかの実施形態では、アプリケーションオブジェクトは、オンラインプラットフォーム1202のアプリケーション1205、またはクライアント装置1210/1216のアプリケーション1212もしくは1218内で、使用、作成、共有、またはそれ以外に描画されるオブジェクトを参照してもよい。たとえば、ゲームオブジェクトは、一部、モデル、キャラクタ、ツール、武器、衣服、建物、乗物、通貨、植物、動物、上述のコンポーネント(たとえば、建物の窓)などを、含んでいてもよい。
なお、オンラインプラットフォーム1202は、1人のユーザから1人または複数人のユーザへの通信メッセージを含み得る、1つまたは複数のメディアアイテムについて、ホスティングしてもよい。メディアアイテムは、デジタルビデオ、デジタル映像、デジタル写真、デジタル音楽、オーディオコンテンツ、メロディー、ウェブサイトコンテンツ、ソーシャルメディア更新内容、電子書籍、電子雑誌、デジタル新聞、デジタルオーディオブック、電子ジャーナル、ウェブブログ、RSSフィード、電子コミック、ソフトウェアアプリケーションなどを含み得るが、それに限定されるわけではない。いくつかの実施形態では、メディアアイテムは、デジタルメディアアイテムをエンティティに提示するように構成された、ソフトウェア、ファームウェアまたはハードウェアを用いて、実行または読込可能な電子ファイルであってもよい。
いくつかの実施形態では、アプリケーション1205は、特定のユーザまたは特定のユーザのグループ(たとえば、プライベートゲーム)と関連づけられていてもよく、オンラインプラットフォーム1202のユーザ(たとえば、パブリックゲーム)に広く利用可能であってもよい。
いくつかの実施形態では、オンラインプラットフォーム1202またはクライアント装置1210/1216は、アプリケーションエンジン1204またはアプリケーション1212/1218を含んでいてもよい。エンジン1204は、アプリケーション1212/1218と同様のアプリケーションを、含んでいてもよい。いくつかの実施形態では、エンジン1204は、アプリケーション1205の開発または実行のために用いられてもよい。たとえば、ゲームエンジン1204は、複数の特徴のなかでも、特に、2D、3D、VRまたはARグラフィックス用の描画エンジン(「レンダラ」)、物理エンジン、衝突検出エンジン(および衝突応答)、音声エンジン、スクリプト機能、アニメーションエンジン、人工知能エンジン、ネットワーキング機能、ストリーミング機能、メモリ管理機能、スレッディング機能、場面グラフ(scene graph)機能、または、映画製作用のビデオサポートを、含んでいてもよい。エンジン1204のコンポーネントは、アプリケーションを演算および描画するのに役立つコマンド(たとえば、描画コマンド、衝突コマンド、物理コマンドなど)を、生成してもよい。いくつかの実施形態では、クライアント装置1210/1216のそれぞれのアプリケーション1212/1218は、独立して動作してもよく、オンラインプラットフォーム1202のエンジン1204とともに動作してもよく、または、両者の組み合わせでもよい。
いくつかの実施形態では、オンラインプラットフォーム1202およびクライアント装置1210/1216の両者が、エンジン(それぞれ、1204、1212および1218)を実行する。様々な実施形態では、各アプリケーション1205では、オンラインプラットフォーム1202上で実行されるエンジン関数と、クライアント装置1210および1216上で実行されるエンジン関数との比が、異なっていてもよい。
いくつかの実施形態では、本体部分(body part)などのデジタルオブジェクトのコンポーネントは、ブロック、円柱、球など、基本的な幾何学形状、または、楔、トーラス、チューブ、溝(channel)など、他の基本的形状であってもよい。いくつかの実施形態では、作成者モジュール(creator module)は、オンラインプラットフォーム1202の他のユーザによる閲覧または使用のためのオブジェクト(たとえば、ゲームキャラクタ)を、公開してもよい。いくつかの実施形態では、オブジェクト、アプリケーション1205、またはアプリケーション環境の作成、修正、またはカスタマイズは、ユーザインターフェース(たとえば、開発者インターフェース)を利用するユーザにより、スクリプティングを伴うかまたはスクリプティングなしで(または、アプリケーションプログラミングインターフェース(API)ありまたはなしで)、行われてもよい。
いくつかの実施形態では、オンラインプラットフォーム1202は、ユーザによりデータ記憶部1208内に作成されたデジタルオブジェクトおよびコンテンツを、記憶してもよい。
いくつかの実施形態では、クライアント装置1210または1216は、各々、パーソナルコンピュータ(PC)、モバイルデバイス(たとえば、ラップトップ、携帯電話、スマートフォン、タブレットコンピュータ、またはノートブックコンピュータ)、ネットワーク接続テレビ、ゲーム機などの演算装置を、備えていてもよい。また、いくつかの実施形態では、クライアント装置1210または1216は、「ユーザ装置」と称されてもよい。クライアント装置1210または1216の数は、説明のために提供されており、制限のためではない。いくつかの実施形態では、任意の数のクライアント装置1210または1216が、用いられてもよい。
いくつかの実施形態では、各クライアント装置1210または1216は、アプリケーション1212または1218のインスタンスを、それぞれ含んでいてもよい。一実施形態では、アプリケーション1212または1218は、ユーザが、アプリケーションまたはアプリケーションコンテンツの検索など、オンラインプラットフォーム1202を使用して対話すること、オンラインプラットフォーム1202によりホスティングされた仮想ゲーム内のオブジェクトを制御すること、または、ゲーム、画像、ビデオアイテム、ウェブページ、文書などのアップロードされたコンテンツを閲覧することを、許可してもよい。一例では、アプリケーションは、Webサーバにより提供されるコンテンツについて、アクセス、検索、提示、または巡回可能なウェブアプリケーション(たとえば、ウェブブラウザと協働するアプリケーション)であってもよい。他の例では、アプリケーションは、クライアント装置1210または1216へとインストールされて、ローカルで実行され、ユーザを、オンラインプラットフォーム1202と対話可能とする、ネイティブアプリケーション(たとえば、モバイルアプリケーション、アプリ、またはゲームプログラム)であってもよい。アプリケーションは、コンテンツ(たとえば、ウェブページ、メディアビューア)を、ユーザに対して、描画、表示、または提示してもよい。実施形態では、アプリケーションは、ウェブページ内に埋め込まれた、埋込メディアプレーヤ(たとえば、フラッシュ(登録商標)プレーヤ)を含んでもよい。
一般に、一実施形態にて、オンラインプラットフォーム1202により実行されるものとして説明された機能は、他の実施形態では、適切であれば、クライアント装置1210もしくは1216またはサーバにより実行可能であってもよい。さらに、特定のコンポーネントによる機能は、別々、または協働する複数のコンポーネントにより実行可能である。また、オンラインプラットフォーム1202は、他のシステムに対して提供されたサービス、または、適切なアプリケーションプログラミングインターフェース(API)による装置として、アクセス可能でもあるため、ウェブサイト内での利用に限定されるものではない。
例示的演算装置
図13は、いくつかの実施形態による、ここに説明する1つまたは複数の特徴を実施するのに用いられ得る例示的演算装置1300のブロック図である。一例では、装置1300は、コンピュータ装置(たとえば、図12の1202、1210および/または1216)を実装して、ここで説明される方法の実施形態を実行するために、用いられてもよい。演算装置1300は、任意の適切なコンピュータシステム、サーバ、または他の電子もしくはハードウェア装置であり得る。たとえば、演算装置1300は、メインフレームコンピュータ、デスクトップコンピュータ、ワークステーション、ポータブルコンピュータ、または電子装置(ポータブル装置、モバイル装置、携帯電話、スマートフォン、タブレットコンピュータ、テレビ、TVセットトップボックス、パーソナルデジタルアシスタント(PDA)、メディアプレーヤ、ゲーム装置、ウェアラブル装置など)であり得る。いくつかの実施形態では、装置1300は、プロセッサ1302と、メモリ1304と、入出力(I/O)インターフェース1306と、音声映像入出力装置1314(たとえば、ディスプレイスクリーン、タッチスクリーン、ディスプレイゴーグルまたは眼鏡、オーディオスピーカ、マイクロフォンなど)とを、備えている。
プロセッサ1302は、プログラムコードを実行して、装置1300の基本的な動作を制御する、1つまたは複数のプロセッサおよび/または処理回路であり得る。「プロセッサ」は、データ、信号または他の情報を処理する、任意の適切なハードウェアおよび/またはソフトウェアシステム、メカニズムまたはコンポーネントを含む。プロセッサは、汎用中央処理装置(CPU)、複数の処理ユニット、機能を実現する専用回路を具備したシステム、または他のシステムを、備え得る。処理は、特定の地理的配置への限定や、一時的な限定の必要がない。たとえば、プロセッサは、「リアルタイム」、「オフライン」、「バッチモード」などにおける、その機能を実行してもよい。処理の各部分は、異なるタイミングで、異なる場所で、異なる(または同一の)処理システムにて、実行されてもよい。コンピュータは、メモリと通信する任意のプロセッサであってもよい。
通例、メモリ1304は、プロセッサ1302によるアクセスのために装置1300内に提供されており、任意の適切なプロセッサ可読記憶媒体であってもよい。たとえば、プロセッサによる実行のため命令の記憶に適した、プロセッサ1302とは別に配置され、かつ/または、そこに統合された、ランダムアクセスメモリ(RAM)、読み取り専用メモリ(ROM)、電気的消去可能読み取り専用メモリ(EEPROM)、フラッシュメモリなどでもよい。メモリ1304は、プロセッサ1302によるサーバ装置1300上で動作し、オペレーティングシステム1308、メッシュ生成エンジンアプリケーション1310、および関連づけられたデータ1312を含む、ソフトウェアを、記憶可能である。いくつかの実施形態では、メッシュ生成エンジンアプリケーション1310は、プロセッサ1302が、ここに説明された機能を実行できるようにする命令を、含み得る。たとえば、図2~図4、図6、図8および図9の方法のいくつかまたは全てである。様々な実施形態では、図2~図4、図6、図8および図9の方法のいくつかまたは全ては、1つまたは複数の装置1300、たとえば、1つまたは複数の装置1300の各々の1つまたは複数のプロセッサ上で、実施可能である。
たとえば、メモリ1304は、入力データからメッシュを生成して、装置1300および/またはオンラインプラットフォーム(たとえば、1202)によって使用するためのメッシュを提供することが可能な、メッシュ生成エンジン1310のためのソフトウェア命令を、含み得る。たとえば、I/Oデバイス1314の表示装置による表示用のメッシュを、記憶、修正および/または描画することである。メモリ1304内のどのソフトウェアでも、他の適切な記憶場所またはコンピュータ可読媒体上に、代替的に記憶可能である。さらに、メモリ1304(および/または他の接続された記憶装置)は、ここに説明された特徴にて用いられる命令およびデータを、記憶可能である。メモリ1304および他の種類の記憶部(磁気ディスク、光学ディスク、磁気テープ、または他の有形の媒体)は、「記憶部」または「記憶装置」とみなされ得る。
I/Oインターフェース1306は、サーバ装置1300に、他のシステムおよび装置とインターフェースがとれるようにする機能を、提供可能である。たとえば、ネットワーク通信装置、記憶装置(たとえば、メモリおよび/またはデータ記憶部1208)、ならびに入出力デバイスが、インターフェース1306を介して、通信可能である。いくつかの実施形態では、I/Oインターフェースは、入力装置(キーボード、ポインティングデバイス、タッチスクリーン、マイクロフォン、カメラ、スキャナなど)、および/または出力装置(ディスプレイ装置、スピーカ装置、プリンタ、モータなど)を含む、インターフェース装置に対して、接続可能である。たとえば、オンラインプラットフォーム1202により生成されたメッシュ(ならびに/または、デジタルオブジェクト、および、そこから抽出されたデジタル的特徴)は、プラットフォーム1202にて記憶可能であり、ネットワークを介して、1つまたは複数のクライアント装置へと、クライアント装置での記憶および表示のために、送信可能である。
説明を簡潔にするために、図13は、プロセッサ1302、メモリ1304、I/Oインターフェース1306、ソフトウェアブロック1308および1310、ならびにデータベース1312の各々について、1つのブロックを示している。これらのブロックは、1つまたは複数のプロセッサまたは処理回路、オペレーティングシステム、メモリ、I/Oインターフェース、アプリケーション、および/またはソフトウェアモジュールを表している。他の実施形態では、装置1300は、図示された構成要素の全てを有していなくともよく、かつ/または、ここに図示されているものの他に、もしくはそれに加えて、他の種類の要素を含む他の要素を有していてもよい。オンラインプラットフォーム1202は、ここでのいくつかの実施形態にて説明されたような動作を実行するものとして、説明されているが、オンラインゲーミングプラットフォーム1202もしくは同様のシステムのあらゆる適切な構成要素もしくは構成要素の組み合わせ、または、このようなシステムと関連づけられた、あらゆる適切な単一もしくは複数のプロセッサが、説明された動作を実行してもよい。
また、ユーザ装置は、ここに説明された特徴を実施し得る、かつ/またはその特徴とともに使用され得る。例示的なユーザ装置は、いくつかの同様な構成要素を、たとえば、プロセッサ1302、メモリ1304、I/Oインターフェース1306などの装置1300として含む、コンピュータ装置であり得る。クライアント装置に適した、オペレーティングシステム、ソフトウェア、およびアプリケーションが、メモリ内に提供されて、プロセッサにより使用され得る。クライアント装置用のI/Oインターフェースは、ネットワーク通信装置に対して接続可能であるとともに、入出力装置に対して接続可能である。入出力装置は、たとえば、音声を取り込むマイクロフォン、画像または映像を取り込むカメラ、音声を出力する音声スピーカ装置、画像または映像を出力する表示装置、または他の出力装置である。音声映像入出力装置1314内の表示装置が、たとえば、装置1300に対して接続可能で(またはそこに含まれ)、ここに説明されるような、画像の事前および事後処理を表示し得る。このような表示装置は、任意の適切な表示装置、たとえば、LCD、LEDもしくはプラズマディスプレイ画面、CRT、TV、モニタ、タッチスクリーン、3D表示画面、AR/VRディスプレイ、プロジェクタ、または他の視覚表示装置を、備え得る。いくつかの実施形態は、音声出力装置、たとえば、テキストを読み上げる音声出力または合成を、提供可能である。たとえば、このような表示装置または出力装置は、メッシュ生成エンジン1310により生成されたメッシュに基づく仮想環境内に、オブジェクト(1つもしくは複数の表面または他の特性/特徴を含む)を、表示可能である。
ここに説明された方法、ブロック、および/または動作は、図示または説明したものとは異なる順番で、実行可能であり、かつ/または、適切な他のブロックもしくは動作と(部分的もしくは完全に)同時に実行可能である。いくつかのブロックまたは動作が、データの一部に対して実行可能であり、たとえば、データの他の部分に対して、後に再度実行可能である。説明されたブロックおよび動作の全てが、様々な実施形態にて、実行される必要があるわけではない。いくつかの実施形態では、ブロックおよび動作は、複数回、異なる順番で、かつ/または、本方法における異なる時点で、実行可能である。
いくつかの実施形態では、方法のいくつかまたは全てが、1つまたは複数のクライアント装置などのシステム上に、実装可能である。いくつかの実施形態では、ここで説明した1つまたは複数の方法が、たとえば、サーバシステムにて、かつ/または、サーバシステムおよびクライアントシステムの双方にて、実装可能である。いくつかの実施形態では、1つまたは複数サーバおよび/またはクライアントの様々な構成要素は、方法の様々なブロックまたは他の部分を、実行可能である。
ここで説明された1つまたは複数の方法(たとえば、方法200、300、400、600、800および/または900)は、コンピュータ上で実行可能なコンピュータプログラム命令またはコードにより、実装可能である。たとえば、コードは、1つまたは複数のデジタルプロセッサ(たとえば、マイクロプロセッサまたは他の処理回路)により実装可能であり、半導体すなわち固体メモリ、磁気テープ、着脱可能コンピュータディスク、ランダムアクセスメモリ(RAM)、読み取り専用メモリ(ROM)、フラッシュメモリ、硬質磁気ディスク、光学ディスク、固体記憶ディスクなどを含む非一時的コンピュータ可読媒体(たとえば、記憶媒体)、たとえば、磁気、光学、電磁、または半導体記憶媒体を含むコンピュータプログラム製品上に、記憶可能である。また、プログラム命令は、電子信号内に記憶可能であり、電子信号として提供可能である。電子信号は、たとえば、サーバ(たとえば、分散システム、および/またはクラウドコンピュータシステム)から抽出されたサービス(SaaS)として、ソフトウェアの形式である。この他に、1つまたは複数の方法が、ハードウェア(論理ゲートなど)内に、またはハードウェアとソフトウェアとの組み合わせで、実装可能である。例示的ハードウェアは、プログラム可能プロセッサ(たとえば、フィールドプログラマブルゲートアレイ(FPGA)、結合プログラム可能論理回路(Complex Programmable Logic Device))、汎用プロセッサ、グラフィックプロセッサ、特定用途向け集積回路(ASIC)などであり得る。1つまたは複数の方法が、システム上で稼働するアプリケーションの構成要素の一部として、または、他のアプリケーションおよびオペレーティングシステムと組み合わせて稼働する、アプリケーションもしくはソフトウェアとして、実行可能である。
ここに説明された1つまたは複数の方法は、任意の種類のコンピュータ装置上で実行可能な、独立型プログラム、ウェブブラウザ上で稼働するプログラム、モバイルコンピュータ装置(たとえば、携帯電話、スマートフォン、タブレットコンピュータ、ウェアラブルデバイス(腕時計、アームバンド、ジュエリー、ヘッドウェア、ゴーグル、眼鏡など)、ラップトップコンピュータなど)上で動作するモバイルアプリケーション(「アプリ」)内で実行可能である。一例では、クライアント/サーバアーキテクチャが、使用可能であり、たとえば、(クライアント装置としての)モバイルコンピュータ装置が、ユーザ入力データを、サーバ装置へ送信し、出力用(たとえば、表示用)の最終出力データを、サーバから受信する。他の例では、全ての演算が、モバイルコンピュータ装置上のモバイルアプリ(および/または他のアプリ)内で実行可能である。他の例では、演算は、モバイルコンピュータ装置と、1つまたは複数のサーバ装置との間で、分割され得る。
特定の実施形態について説明がなされたが、特定の各実施形態は、単に説明のためのものであり、限定すべきものではない。各例に説明された概念は、他の例や実施形態にも適用され得る。
なお、本開示にて説明された、機能ブロック、動作、特徴、方法、装置、およびシステムは、当業者に理解されるようなシステム、装置、および機能ブロックの別の組み合わせへと、統合されても分割されてもよい。プログラム言語およびプログラム技術の任意の適切な組み合わせが、特定の各実施形態のルーチンを実施するために、用いられ得る。たとえば、手続型またはオブジェクト指向型などの別のプログラム技術が、採用されてもよい。ルーチンは、単一の処理装置または複数のプロセッサ上で、実行され得る。ステップ、動作、または演算が、特定の順番で提示されてもよく、別の具体的実施形態では、順番は、変更されてもよい。いくつかの実施形態では、この具体例では順番に示された複数のステップまたは動作が、同時に実行されてもよい。