Pregunta

¿Cómo se puede ir sobre la creación de una esfera con mallas en Direct-X? Estoy usando C ++ y el programa se puede ejecutar en Windows, solamente.

Todo se hace actualmente a través de un objeto IDiRECT3DDEVICE9.

¿Fue útil?

Solución

Se puede utilizar el D3DXCreateSphere función.

Otros consejos

Hay un montón de maneras de crear una esfera.

Uno es utilizar coordenadas polares para generar las rebanadas de la esfera.

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

Dado que estructura que le genera la esfera de la siguiente manera (no he probado esto, así que podría haber conseguido que un poco 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++;
}

Esta es la forma en D3DXCreateSphere lo hace creo. Por supuesto, el código anterior no forma las caras pero eso no es un poco especial complejidad de código si usted fija su mente en ello:)

La otra, y más interesante en mi opinión, forma es a través de subdivisión de superficies.

Si usted comienza con un cubo que tiene las normales definen del mismo modo que el código anterior se puede subdividir de forma recursiva cada lado. Básicamente se encuentra el centro de la cara. Generar un vector desde el centro hasta el nuevo punto. Normalizarla. Empuje la vert a la radio de la esfera de la siguiente manera (Asumiendo v.n * es la normalizada normal):

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

A continuación, repetir este proceso para el punto medio de cada borde de la cara que está subdividiendo.

Ahora se puede dividir cada cara en 4 caras nuevas cuadrilátero. A continuación, puede subdividir cada una de esas quads en 4 quads nuevos y así sucesivamente hasta llegar al nivel de refinamiento que necesite.

Personalmente encuentro este proceso proporciona una distribución vértice más agradable en la esfera que el primer método.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top