誰かが球の頂点、インデックス、テクスチャ座標を作成する方法を説明してもらえますか?これを行う方法についてのドキュメントが驚くほど不足しており、私は学習に興味を持っています。
gamedev.netなどで明らかな、グーグル、ルックなどを試してみました。しかし、球体ポイントの生成、それらのインデックス付け、テクスチャリングはカバーしていません。
誰かが球の頂点、インデックス、テクスチャ座標を作成する方法を説明してもらえますか?これを行う方法についてのドキュメントが驚くほど不足しており、私は学習に興味を持っています。
gamedev.netなどで明らかな、グーグル、ルックなどを試してみました。しかし、球体ポイントの生成、それらのインデックス付け、テクスチャリングはカバーしていません。
回答:
2つの一般的なアプローチがあります。
左端はuv球体、右端はicosphereと呼ばれます。
GLUTはuvアプローチを使用する傾向があります:freeglutソースコードの関数glutSolidSphere()
を見てください。
ここでicosphereを生産する上で優れた記事は以下のとおりです。http://blog.andreaskahler.com/2009/06/creating-icosphere-mesh-in-code.html
紫外線球は球体のように見えます。多くの目的では完全に問題ありませんが、たとえば球体を変形したい場合など、ユースケースによっては、極の周りの頂点の密度が大きいという欠点があります。ここでは、icosphereの方が優れており、頂点は均等に分布しています。
また、これは興味深いかもしれません:http : //kiwi.atmos.colostate.edu/BUGS/geodesic/text.htmlそれは、顔をゾーンに整理するアプローチを説明しています。
http://vterrain.org/Textures/spherical.htmlは、テクスチャを選択する方法の優れた説明を提供します。
それを行うには2つの方法があります。
球座標でシータとファイを歩いて、面とトリスを生成します
二十面体を作成し、目的のテッセレーションに達するまで再帰的に面を細分割します。
最初の方法では、ダブルネストされたforを使用して、シータとファイをウォークします。シータとファイを歩くと、三角形を回転させて球体を作成します。
それを行うコードは次のようになります。
for( int t = 0 ; t < stacks ; t++ ) // stacks are ELEVATION so they count theta
{
real theta1 = ( (real)(t)/stacks )*PI ;
real theta2 = ( (real)(t+1)/stacks )*PI ;
for( int p = 0 ; p < slices ; p++ ) // slices are ORANGE SLICES so the count azimuth
{
real phi1 = ( (real)(p)/slices )*2*PI ; // azimuth goes around 0 .. 2*PI
real phi2 = ( (real)(p+1)/slices )*2*PI ;
//phi2 phi1
// | |
// 2------1 -- theta1
// |\ _ |
// | \ |
// 3------4 -- theta2
//
//vertex1 = vertex on a sphere of radius r at spherical coords theta1, phi1
//vertex2 = vertex on a sphere of radius r at spherical coords theta1, phi2
//vertex3 = vertex on a sphere of radius r at spherical coords theta2, phi2
//vertex4 = vertex on a sphere of radius r at spherical coords theta2, phi1
// facing out
if( t == 0 ) // top cap
mesh->addTri( vertex1, vertex3, vertex4 ) ; //t1p1, t2p2, t2p1
else if( t + 1 == stacks ) //end cap
mesh->addTri( vertex3, vertex1, vertex2 ) ; //t2p2, t1p1, t1p2
else
{
// body, facing OUT:
mesh->addTri( vertex1, vertex2, vertex4 ) ;
mesh->addTri( vertex2, vertex3, vertex4 ) ;
}
}
}
そのため、上キャップと下キャップをクワッドではなくトライのみで巻き取ることが重要です。
二十面体を使用するには、二十面体のポイントを生成し、そこから三角形を巻き上げます。原点にある20面体の頂点は次のとおりです。
(0, ±1, ±φ)
(±1, ±φ, 0)
(±φ, 0, ±1)
where φ = (1 + √5) / 2
ポイントがローカルに均一である必要はないが、グローバルに均一である必要があり、設定されたパターンに従う必要がない場合は、ダーツ投げアルゴリズムのバリアントを使用して、半径rの球にn個のポイントを分散できます。平均してdistポイントは離れています。これらの値は大体次のとおりです。
最も簡単なケースでは、(0、1)から2つの均一に分布した変数uおよびvを選択し、式θ = 2× π × uおよびϕ = arc に従って極座標を計算することにより、ランダムに均一にポイントを選択できますcos(2× v -1); 次に、既に選択されているポイントに近すぎるポイントをすべて削除します。やや複雑でパフォーマンスが大幅に向上したアルゴリズムについては、Cline、Jeschke、White、Razdan、およびWonkaによる「Dart Throwing on Surfaces」を参照してください。
最初の4つのポイントを選択した後(それらの3つが縮退していないと仮定すると、つまり、それらは同じ大円上にないが、それはほとんどありそうにない)、それらの間に4つの面を作成し、追加するたびに新しいポイントでは、それに属する面を3つのサブ面に分割できます。
テクスチャリングの目的で、ポイントをキューブマップにマップできます。