Question

Comment allez-vous créer une sphère avec des mailles dans Direct-x? J'utilise C ++ et le programme sera exécuté sur Windows uniquement.

Tout est actuellement rendu à travers un objet IDiRECT3DDEVICE9.

Était-ce utile?

La solution

Vous pouvez utiliser le D3DXCreateSphere fonction.

Autres conseils

Il y a beaucoup de façons de créer une sphère.

La première consiste à utiliser des coordonnées polaires pour générer des tranches de la sphère.

struct Vertex
{
    float x, y, z;
    float nx, ny, nz;
};

Étant donné que struct vous souhaitez générer la sphère comme suit (je ne l'ai pas testé ce que je puisse ai légèrement mal).

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++;
}

Voici comment D3DXCreateSphere le fait que je crois. Bien sûr, le code ci-dessus forment pas les visages mais c'est à pas un peu particulièrement complexe de code si vous définissez votre esprit à lui:)

L'autre et plus intéressant à mon avis, est ainsi par subdivision de surface.

Si vous commencez avec un cube qui a Normales défini de la même façon que le code ci-dessus, vous pouvez récursive diviser chaque côté. Fondamentalement, vous trouverez le centre de la face. Générer un vecteur du centre vers le nouveau point. Normer. Appuyez sur le vert vers le rayon de la sphère de la manière suivante (en supposant que v.n * est la normale normalisée):

v.x = v.nx * sphereRadius;
v.y = v.ny * sphereRadius;
v.z = v.nz * sphereRadius;

Vous pouvez ensuite répéter ce processus pour le point milieu de chaque bord de la face vous subdivisant.

Maintenant, vous pouvez diviser chaque face en 4 nouveaux visages quadrilatères. Vous pouvez ensuite diviser chacun de ces quads en 4 nouveaux quads et ainsi de suite jusqu'à ce que vous obtenez au niveau de raffinement dont vous avez besoin.

Personnellement, je trouve que ce processus fournit une distribution de sommet plus agréable sur la sphère que la première méthode.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top