手続き型ジオメトリの生成


10

私は最近、OS XのSceneKitを調べて、次のような幾何学的形状を作成するファクトリーメソッドがいくつかあることに気づきました。

ボックス、カプセル、コーン、シリンダー、平面、ピラミッド、球、トーラス、チューブ。

このようなプリミティブシェイプをレンダラーに追加することに興味がありますが、手続き型生成の理解を集めるための適切なソースを見つけるのに苦労しています。理論を詳しく説明しているリソースはいくつかありますが、それをバックアップするための適切なソースコードがありません。

SceneKitは、そのような形状の属性を動的に設定できるファクトリメソッドを提供します。ボックスの場合、各面を分割する幅、高さ、および深さのセグメントの数に整数値を指定できます。

理論は理解していますが、目的の効果を実現するためにジオメトリ面を細分割し始める知識がありません。

各形状の頂点は、単純なループで生成するのが非常に簡単です。私が困惑しているのは、面の作成方法、つまり各面の適切なテクスチャ座標を知っていることです。法線は面ごとに計算できるため、自分がやりたいことを達成できると確信しています。

誰でも手続き型ジオメトリの詳細を提供できますか?私が本当に必要なのは、情報を収集するためのソースコードです。私はチュートリアルを求めて高低を検索しましたが、これまでにいくつかの妥当なサイトまたはブログしか思いつきませんでした。優れた本、チュートリアル、ブログ、研究論文をいただければ幸いです。

コメントに基づいて編集

基本的な形状の頂点を作成する方法を知っていることを明確にしておく必要があります。これらのほとんどは、おそらく単純なループで実現できます。私が理解していないのは、生成された頂点の配列から面を作成する方法です。どうやら順序付けられていないように見える頂点の配列から三角形ストリップを作成するにはどうすればよいですか?

このポイントを通過すると、各面から法線を作成できると思います。これについてはまだ詳しく説明していませんが、これへの多くの参照があり、実装するのは簡単です。

理想的には、SceneKitが提供する方法など、特定のプロパティセットからジオメトリを生成できるようにしたいと考えています。SceneKitがそれを実行し、BlenderやMayaなどで同様のことができることを考えると、私は不可能を実装しようとしているのではないと思います。

最後の側面は、テクスチャの適用です。繰り返しますが、これは私が実装したものではありませんが、要件を読んで認識しています。

ここでの主な問題は、私が達成したいことはわかっているが、前述のプリミティブの実装方法を解読するのに苦労していることです。ソースコードを使っていくつかの知識の類似点を見つけることができると期待していましたが、今のところ適切なものに出会ったことはありません。


問題はジオメトリの細分割であると言いますが、頂点の作成は簡単であると言い、次に問題は面の作成方法であり、問​​題はテクスチャマッピングであると言います。あなたの問題は何ですか?頂点の位置を生成できますか?エッジとフェースを生成できますか?また、テクスチャ座標は、テクスチャとそれで何を実現したいかによって異なります。そのため、テクスチャ座標に関する質問は適切ではありません。最後に、プリミティブ生成は単にジオメトリに関するものであり、それが「手続き型ジオメトリ」と呼ばれることはほとんどありませんが、それはそのためです。
jrsala 2013年

立方体や平面などの単純な形状のジオメトリを作成する方法を理解しています。理解できない面の作成です。一連の頂点から顔を作成するにはどうすればよいですか?より複雑な形状のポイントをプロットすることは、基本的には理解していますが、問題の一部です。それらをすべて三角形のストリップまたは三角形に接着することは、頭を包み込むのに苦労していることです。
CaptainRedmuff 2013年

よろしくお願いします。明確にするために質問を編集することができます。回答時間!
jrsala 2013年

回答:


11

ボックス、コーン、引用したすべてのプリミティブシェイプのエッジとフェースを生成する方法は、頂点を作成すると同時にそれらを生成することです。実際、それに応じてエッジと面を簡単に計算できる論理的な方法で頂点を作成する必要があります。

空間内のポイントのセットを入力として取り、その上でいわゆる「ポイントセットの三角形分割」を計算するアルゴリズムがありますが、ポイントセットの三角形分割の問題はNP完全であるため、エッジと面を作成するのが高速です。頂点を計算し、アルゴリズムに機能させるだけではありません。このソリューションが存在することを知らせてください。

この非効率的なソリューションは別として、以下の例のように、プリミティブはケースごとにしか処理できないと思います。

メッシュは頂点と面です。メッシュに面を構成しない線が含まれていない限り、エッジは面の説明に含まれます。頂点は、3つの浮動小数点座標のタプルです。エッジは、単に頂点への参照のペアですが、ここでも、確かにそれらは必要ありません。たとえば、頂点がインデックス付き配列にあるとします。さてあなたのエッジはその配列のインデックスのペアになるでしょう。面は、インデックス付き配列の場合、頂点への参照の3つ組またはインデックスの3つ組です

これらの各プリミティブシェイプを構成する頂点、エッジ、面をカウントできる必要があります。それらをカウントできることは、オブジェクトのプロパティを理解することであり、ループを使用して、それらを構築する方法を考案するのに役立ちます。これから見る他のツール。

コーン

n + 2頂点、3nエッジ、2n面を持つ円錐の場合

  1. 2つの別々の頂点を作成します。
  2. 最初の2つの頂点間のセグメントに垂直な平面内にある頂点の1つ(ベース頂点)の周りに円を作成します。うまくいけば、三角法を使用して円を作ることができますよね?これで、円錐のすべての頂点が完成しました。これもすべてのエッジの3分の1です(円にはn個のエッジがあり、合計で3n 個のエッジがあります)。
  3. 作るNのベース頂点からエッジn個の円の頂点。顔の半分(n面)を作成できます。
  4. 作るNの先端頂点からエッジn個の円の頂点。それと同じように、もう半分の面(n面)を作成できます。

1)2つの頂点 2)とサークル
3)と顔
4)と顔
最終結果:結果

円を形成するループを実行するときに、エッジと面を作成することもできます。同じ複雑さ、同じこと。円に1つの頂点を作成し、それを頂点の配列に格納し、必要に応じて対応するエッジ(インデックスのペア)をインデックスのペアの配列に追加し、最後に対応する面をインデックスのトリプレットの配列に追加します。次の頂点に移動します。

シリンダーとチューブ:同じ作業を2回行わず、クワッド

繰り返しになりますが、チューブの場合は、円柱の上部または下部のディスクの中心となる頂点と円で始まります。

  1. 頂点を作成します。
  2. 頂点の周りに円を作成します。円の連続する頂点の間、および中央の頂点と各円の頂点の間にエッジ(必要な場合)を追加します。中心の頂点と円の2つの連続する頂点で構成される頂点の各トリプレットの間に面を追加します。
  3. これらすべてを複製し、コピーを先ほど作成したベースに垂直な方向に、希望するシリンダーの長さだけ移動します。
  4. 上部と下部をリンクします。

上部と下部をリンクするには、互いに向き合う頂点のペアのペアの間に四角形を作成する必要があります。では、先に考えて、4つの頂点から2つの三角形の面を作成する関数を作成してみませんか?

できました。今回は、同じ構造(円+中心)が円柱内に2回出現するという事実を使用してショートカットを作成していることに注意してください。すべての頂点、エッジ、面を手動で作成する必要はありません。必要な場合はコーンとは反対です。

この怠惰の原則に従って、円の4分の1を作成してそれを複製することも可能です。また、非常に単純な変換を使用して完全な円を作成することもできます(どの円でも有効なので、円錐も使用できます)。それほど複雑な形状ではありません。

作成を簡単にするために、作成するオブジェクトの幾何学的プロパティを常に使用する必要があります。つまり、それらの対称性不変条件

円柱の場合は、ベース頂点を作成せず、円を作成し、複製し、コピーを変換し、四角形を作成します。

球とカプセル:複雑さを追加しますが、同じ作業を2回行うことはできません

カプセルを作成するには、UV球を作成し、それを2つの半分に分割し、最初の半分を移動してから、2つをカプセルの側面にリンクします。

再び、球の1/8(!!)だけを作成し、それを複製して反転し、別の軸などを除いて結果を複製および反転して、4つのステップで完全な球を取得することができます(8番目を作成) 、複製し、3回反転します)。やり過ぎかもしれませんが、サークルの場合ほどではありません。

単純なUV球:
球

実際には、半分だけを作成し(たとえば)、半分を複製し、コピーを上下逆にして、カプセルの長さだけ翻訳します。
半分

上半分と下半分をリンクします。
カプセル

本当の(やや)大変な作業は、球体を作る三角法に由来します。UV球に属するすべての頂点のセットは、フォームのすべての点のセットとして記述できます。

ポイント

ここで、Rは球の半径であり、特定の正の偶数の整数Nに対して、定数

θ=×π/ N

knは整数で、k0から2N-1まで変化し、n-N / 2から+ N / 2まで変化します。

半球または8分の1の球を作成するには、knが取る値のセットを制限する必要があります。

場合は、kは実数だけでなく、整数の数字だった、あなたは全体の球、その表面上だけではなく、頂点を取得したいです。したがって、ここで行ったのは、プリミティブの表面方程式をラスタライズすることです。

恐ろしいトーラス:結局簡単です。

繰り返しになりますが、三角法、頂点、四角形、対称性、不変量、幾何学が増えます!トーラスの表面の方程式を見つけ、適切に「ラスタライズ」し、トーラスの(明白な)対称性を使用して問題を単純化し、最後に、定義した頂点のセットをループして、エッジと面を作成します。行こう!

見る?完全に簡単です。


ワオ。このようなきめ細かい対応と多くの事例をありがとうございました。私は、球の半分を単に生成し、対称要素をミラーリングするという考えを考慮していませんでした。私が簡単に理解できる方法でこれを書く時間を割いてくださり、うまくいけば簡単に実践できることを感謝します。
CaptainRedmuff 2013年

どういたしまして!コードがなかったのは残念です。
jrsala 2013年

方法の概要は、私が本当に必要としていたもののより多くでした。少なくともそこから行動計画を立て始めることができます:]面取りされたエッジを持つボックス/キューブに関する情報はないと思いますか?docs.autodesk.com/3DSMAX/15/ENU/3ds-Max-Help/images/...
CaptainRedmuff

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.