Pergunta

Como você vai fazer sobre a criação de uma esfera com malhas em Direct-x? Eu estou usando C ++ eo programa será executado em Windows, somente.

Tudo é actualmente prestado através de um objeto IDiRECT3DDEVICE9.

Foi útil?

Solução

Você pode usar o função D3DXCreateSphere .

Outras dicas

Há muitas maneiras de criar uma esfera.

Uma é usar coordenadas polares para gerar fatias de esfera.

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

Dado que struct você gerar a esfera da seguinte forma (eu não testei isso para que eu possa tê-la ligeiramente errado).

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

Isto é como D3DXCreateSphere faz isso eu acredito. É claro que o código acima não formar os rostos, mas isso não é um pouco particularmente complexa de código se você definir sua mente para ela:)

O outro, e mais interessante, na minha opinião, maneira é através da subdivisão de superfície.

Se você começar com um cubo que tem normais definido da mesma forma que o código acima você pode recursivamente subdivida cada lado. Basicamente você encontrar o centro do rosto. Gerar um vetor do centro para o novo ponto. Normalizá-lo. Empurrar o vert para fora para o raio da esfera, como se segue (Assumindo v.n * é o normalizado normal):

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

Você, então, repetir este processo para o ponto médio de cada borda da face você está subdividindo.

Agora você pode dividir cada face em 4 caras novas quadrilateral. Você pode, então, subdividir cada uma dessas quads em 4 novas quads e assim por diante até chegar ao nível de refinamento que você necessita.

Pessoalmente acho esse processo proporciona uma distribuição mais agradável vértice na esfera do que o primeiro método.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top