ボックス、コーン、引用したすべてのプリミティブシェイプのエッジとフェースを生成する方法は、頂点を作成すると同時にそれらを生成することです。実際、それに応じてエッジと面を簡単に計算できる論理的な方法で頂点を作成する必要があります。
空間内のポイントのセットを入力として取り、その上でいわゆる「ポイントセットの三角形分割」を計算するアルゴリズムがありますが、ポイントセットの三角形分割の問題はNP完全であるため、エッジと面を作成するのが高速です。頂点を計算し、アルゴリズムに機能させるだけではありません。このソリューションが存在することを知らせてください。
この非効率的なソリューションは別として、以下の例のように、プリミティブはケースごとにしか処理できないと思います。
メッシュは頂点と面です。メッシュに面を構成しない線が含まれていない限り、エッジは面の説明に含まれます。頂点は、3つの浮動小数点座標のタプルです。エッジは、単に頂点への参照のペアですが、ここでも、確かにそれらは必要ありません。たとえば、頂点がインデックス付き配列にあるとします。さてあなたのエッジはその配列のインデックスのペアになるでしょう。面は、インデックス付き配列の場合、頂点への参照の3つ組またはインデックスの3つ組です。
これらの各プリミティブシェイプを構成する頂点、エッジ、面をカウントできる必要があります。それらをカウントできることは、オブジェクトのプロパティを理解することであり、ループを使用して、それらを構築する方法を考案するのに役立ちます。これから見る他のツール。
コーン
n + 2頂点、3nエッジ、2n面を持つ円錐の場合:
- 2つの別々の頂点を作成します。
- 最初の2つの頂点間のセグメントに垂直な平面内にある頂点の1つ(ベース頂点)の周りに円を作成します。うまくいけば、三角法を使用して円を作ることができますよね?これで、円錐のすべての頂点が完成しました。これもすべてのエッジの3分の1です(円にはn個のエッジがあり、合計で3n 個のエッジがあります)。
- 作るNのベース頂点からエッジn個の円の頂点。顔の半分(n面)を作成できます。
- 作るNの先端頂点からエッジn個の円の頂点。それと同じように、もう半分の面(n面)を作成できます。
1)
2)
3)
4)
最終結果:
円を形成するループを実行するときに、エッジと面を作成することもできます。同じ複雑さ、同じこと。円に1つの頂点を作成し、それを頂点の配列に格納し、必要に応じて対応するエッジ(インデックスのペア)をインデックスのペアの配列に追加し、最後に対応する面をインデックスのトリプレットの配列に追加します。次の頂点に移動します。
シリンダーとチューブ:同じ作業を2回行わず、クワッド
繰り返しになりますが、チューブの場合は、円柱の上部または下部のディスクの中心となる頂点と円で始まります。
- 頂点を作成します。
- 頂点の周りに円を作成します。円の連続する頂点の間、および中央の頂点と各円の頂点の間にエッジ(必要な場合)を追加します。中心の頂点と円の2つの連続する頂点で構成される頂点の各トリプレットの間に面を追加します。
- これらすべてを複製し、コピーを先ほど作成したベースに垂直な方向に、希望するシリンダーの長さだけ移動します。
- 上部と下部をリンクします。
上部と下部をリンクするには、互いに向き合う頂点のペアのペアの間に四角形を作成する必要があります。では、先に考えて、4つの頂点から2つの三角形の面を作成する関数を作成してみませんか?
できました。今回は、同じ構造(円+中心)が円柱内に2回出現するという事実を使用してショートカットを作成していることに注意してください。すべての頂点、エッジ、面を手動で作成する必要はありません。必要な場合はコーンとは反対です。
この怠惰の原則に従って、円の4分の1を作成してそれを複製することも可能です。また、非常に単純な変換を使用して完全な円を作成することもできます(どの円でも有効なので、円錐も使用できます)。それほど複雑な形状ではありません。
作成を簡単にするために、作成するオブジェクトの幾何学的プロパティを常に使用する必要があります。つまり、それらの対称性と不変条件。
円柱の場合は、ベース頂点を作成せず、円を作成し、複製し、コピーを変換し、四角形を作成します。
球とカプセル:複雑さを追加しますが、同じ作業を2回行うことはできません
カプセルを作成するには、UV球を作成し、それを2つの半分に分割し、最初の半分を移動してから、2つをカプセルの側面にリンクします。
再び、球の1/8(!!)だけを作成し、それを複製して反転し、別の軸などを除いて結果を複製および反転して、4つのステップで完全な球を取得することができます(8番目を作成) 、複製し、3回反転します)。やり過ぎかもしれませんが、サークルの場合ほどではありません。
単純なUV球:
実際には、半分だけを作成し(たとえば)、半分を複製し、コピーを上下逆にして、カプセルの長さだけ翻訳します。
上半分と下半分をリンクします。
本当の(やや)大変な作業は、球体を作る三角法に由来します。UV球に属するすべての頂点のセットは、フォームのすべての点のセットとして記述できます。
ここで、Rは球の半径であり、特定の正の偶数の整数Nに対して、定数
θ=×π/ N、
kとnは整数で、kは0から2N-1まで変化し、nは-N / 2から+ N / 2まで変化します。
半球または8分の1の球を作成するには、kとnが取る値のセットを制限する必要があります。
場合は、kは実数だけでなく、整数の数字だった、あなたは全体の球、その表面上だけではなく、頂点を取得したいです。したがって、ここで行ったのは、プリミティブの表面方程式をラスタライズすることです。
繰り返しになりますが、三角法、頂点、四角形、対称性、不変量、幾何学が増えます!トーラスの表面の方程式を見つけ、適切に「ラスタライズ」し、トーラスの(明白な)対称性を使用して問題を単純化し、最後に、定義した頂点のセットをループして、エッジと面を作成します。行こう!
見る?完全に簡単です。