Domanda

Come si fa a creare una sfera con maglie in Direct-x? Sto utilizzando C ++ e il programma verrà eseguito su Windows, solo.

Tutto è attualmente resa attraverso un oggetto IDirect3DDevice9.

È stato utile?

Soluzione

È possibile utilizzare il D3DXCreateSphere funzione.

Altri suggerimenti

Ci sono molti modi per creare una sfera.

Una è quella di utilizzare le coordinate polari per generare le fette della sfera.

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

Dato che struct ci si genera la sfera come segue (non ho ancora testato questo modo forse ho capito un po 'sbagliato).

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

Questo è il modo D3DXCreateSphere fa credo. Naturalmente il codice di cui sopra non forma i volti, ma quello non è un po 'particolarmente complesso di codice, se si imposta la vostra mente ad esso:)

L'altra, e più interessante, a mio parere, modo è attraverso la suddivisione della superficie.

Se si inizia con un cubo che ha normali definiti allo stesso modo come il codice di cui sopra è possibile in modo ricorsivo suddividere ogni lato. In sostanza si trova il centro del viso. Generare un vettore dal centro al nuovo punto. Normalizzarlo. Spingere il vert verso il raggio della sfera come segue (Supponendo v.n * è il normalizzata normale):

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

È quindi ripetere la procedura per il punto medio di ogni spigolo della faccia che si sta suddividendo.

Ora è possibile dividere ogni faccia in 4 nuovi volti quadrilatero. È quindi possibile suddividere ciascuna di quelle quad in 4 nuovi quad e così via fino ad arrivare al livello di raffinatezza si richiedono.

Personalmente trovo questo processo fornisce una distribuzione più bello vertice sulla sfera rispetto al primo metodo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top