Criação de malhas esféricas com Direct X?
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.
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.