Direct-x でメッシュを使用して球体を作成するにはどうすればよいですか? 私は C++ を使用しており、プログラムは Windows でのみ実行されます。
現在、すべてが IDiRECT3DDEVICE9 オブジェクトを通じてレンダリングされます。
球を作成する方法はたくさんあります。
1つは、極座標を使用して球のスライスを生成することです。
struct Vertex
{
float x, y, z;
float nx, ny, nz;
};
その構造体を考えると、次のように球を生成します(私はこれをテストしていないので、少し間違っている可能性があります)。
std::vector< Vertex > verts;
int count = 0;
while( count < numSlices )
{
const float phi = M_PI / numSlices;
int count2 = 0;
while( count2 < numSegments )
{
const float theta = M_2PI / numSegments
const float xzRadius = fabsf( sphereRadius * cosf( phi ) );
Vertex v;
v.x = xzRadius * cosf( theta );
v.y = sphereRadius * sinf( phi );
v.z = xzRadius * sinf( theta );
const float fRcpLen = 1.0f / sqrtf( (v.x * v.x) + (v.y * v.y) + (v.z * v.z) );
v.nx = v.x * fRcpLen;
v.ny = v.y * fRcpLen;
v.nz = v.z * fRcpLen;
verts.push_back( v );
count2++;
}
count++;
}
これがD3DXCreateSphereが私が信じている方法です。もちろん、上記のコードは顔を形成しませんが、それに気を配れば、それは特に複雑なコードではありません:)
もう1つ、そして私の意見ではもっと興味深い方法は、サーフェスの細分化によるものです。
上記のコードと同じ方法で定義された法線を持つ立方体から始める場合は、各辺を再帰的に細分割できます。基本的にあなたは顔の中心を見つけます。中心から新しい点までのベクトルを生成します。正規化します。次のように、頂点を球の半径まで押し出します(vn *が正規化された法線であると仮定します)。
v.x = v.nx * sphereRadius;
v.y = v.ny * sphereRadius;
v.z = v.nz * sphereRadius;
次に、細分割する面の各エッジの中点に対してこのプロセスを繰り返します。
これで、各面を4つの新しい四辺形の面に分割できます。次に、必要な改良レベルに到達するまで、これらの各クワッドを4つの新しいクワッドなどに細分化できます。
個人的には、このプロセスは最初の方法よりも球上でより良い頂点分布を提供することがわかりました。
機能を使用できますD3DXCreateSphere
。