triangulation d'une sphère

triangulation d'une sphère - Algo - Programmation

Marsh Posté le 01-04-2005 à 21:13:30    

Bonjour,
 
J'aimerai avoir un algo qui me sorte les coordonnées des sommets des triangles lorsque l'on veut trianguler une sphère (je le fais en c++, mais je veux juste l'algo peu importe le langage).
En entrée il y a deux variables : le nombre de paralléles et le nombre de méridiens.
Les triangles sont découpés de la manière suivante : pour l'hémisphère nord on prend chaque rectangle formé par le croisement de 2 parallèles avec 2 méridiens et on le coupe en 2 sur une diagonale (on a donc 2 triangles). Au-dessus du dernier parallèle on ajoute directement les triangles reliant l'hémisphère (qui est leur sommet commun). Puis on fait le même traitement par symétrie pour l'hémisphère sud.
Le rayon de la sphére est connue et les coordonnées des points sont en sphériques (phi et téta).
J'espère que vous avez compris ce que je veux et merci à vous (même si vous me répondez pas).

Reply

Marsh Posté le 01-04-2005 à 21:13:30   

Reply

Marsh Posté le 01-04-2005 à 21:33:47    

ça tu veux dire:
http://img196.exs.cx/img196/5522/sphere8bc.png

Reply

Marsh Posté le 01-04-2005 à 21:35:35    

en fait moi je génère un arc vertical que je fais tourner autour de l'axe vertical... stou c'est assez simple en fait, après il y a des techniques plus sioux pour avoir des triangles de surface plus régulière.

Reply

Marsh Posté le 01-04-2005 à 21:37:24    

le code que j'utilises:
 

Code :
  1. bool PlanetRenderer::GeneratePlanet( int Slices, int Stacks )
  2. {
  3. int MaxStacks=Stacks+1;
  4. int MaxSlices=Slices+1;
  5. PlanetGenerated=false;
  6. // Scope VertexBuffer
  7. {
  8.  PVertex *Vtx;
  9.  VertexBuffer::Locker Lck;
  10.  // Création et Lock
  11.  if( !PlanetVB.Create( MaxStacks*MaxSlices, sizeof(PVertex), D3DFVF_NORMAL ) || !Lck.Lock(PlanetVB,Vtx) )
  12.   return false;
  13.  float dDir=D3DX_PI*2/Slices;
  14.  float dElev=D3DX_PI/Stacks;
  15.  float dU=1.0f/Slices;
  16.  float dV=1.0f/Stacks;
  17.  float Elev=D3DX_PI/2;
  18.  float V=0;
  19.  // du haut vers le bas
  20.  for( int i=0 ; i < MaxStacks ; i++, Elev-=dElev, V+=dV )
  21.  {
  22.   float Dir=0, U=1;
  23.   float S_Elev=sin(Elev);
  24.   float Ray=cos(Elev);
  25.   //DebugPrintf("%d Elev: %f, S: %f C: %f",i,Elev,S_Elev,Ray);
  26.   // dans le plan x/z, => de la droite vers la gauche au niveau de la texture
  27.   for( int j=0 ; j < MaxSlices ; j++, Dir+=dDir, Vtx++, U-=dU )
  28.   {
  29.    Vtx->Normal[0]=cos(Dir)*Ray;    // X
  30.    Vtx->Normal[1]=S_Elev;   // Y        
  31.    Vtx->Normal[2]=sin(Dir)*Ray; // Z  
  32.    Vtx->Tangent[0]=-cos(Dir+D3DX_PI/2);
  33.    Vtx->Tangent[1]=0;
  34.    Vtx->Tangent[2]=-sin(Dir+D3DX_PI/2);
  35.    D3DXVec3Cross( (D3DXVECTOR3*) Vtx->BiNormal, (D3DXVECTOR3*)  Vtx->Normal, (D3DXVECTOR3*) Vtx->Tangent   );
  36.    Vtx->Tex[0]=U;
  37.    Vtx->Tex[1]=V;
  38.   }
  39.  }
  40. }
  41. // Scope IndexBuffer
  42. {
  43.  WORD *Idx;
  44.  IndexBuffer::Locker Lck;
  45.  if( !PlanetIB.Create( MaxSlices*Stacks*6 ) || !Lck.Lock(PlanetIB,Idx) )
  46.   return false;
  47.  for( int i=0 ; i < Stacks ; i++ )
  48.  {
  49.   int Top=i*MaxSlices;
  50.   int Bottom=Top+MaxSlices;
  51.   for( int j=0 ; j < Slices ; j++ )
  52.   {
  53.    int T=Top+j;
  54.    int B=Bottom+j;
  55.    *Idx++=T; *Idx++=B; *Idx++=T+1;
  56.    *Idx++=T+1; *Idx++=B; *Idx++=B+1;
  57.   }
  58.  }
  59. }
  60. return PlanetGenerated=true;
  61. }

Reply

Marsh Posté le 02-04-2005 à 09:25:59    

bjone a écrit :

en fait moi je génère un arc vertical que je fais tourner autour de l'axe vertical... stou c'est assez simple en fait, après il y a des techniques plus sioux pour avoir des triangles de surface plus régulière.


Ce qu'on appelle parfois des sphères géodésiques. C'est obtenu de façon récursive. Voir la question 7.6 là:
   http://apodeline.free.fr/FAQ/CGAFAQ/CGAFAQ-7.html
 
Par contre bjone, je pense pas que tu aurais du lui donner ton code: ça ressemble méchamment à un énoncé d'exercice...
 

Reply

Marsh Posté le 02-04-2005 à 11:14:48    

arf dsl. de toutes façon il est pas optimal, y'a de la duplication de vertex pour rien :D

Reply

Marsh Posté le 08-04-2005 à 11:32:49    

Merci. C'est bien un exercice que j'ai à faire mais ce que vous m'avez mis ne m'a servi à rien, il y a trop de trucs dont je ne connaissais la signification, mais j'ai réussi à faire ma propre sphère avec juste des points en coordonnées sphériques. Elle ressemble à la votre.

Reply

Marsh Posté le 08-04-2005 à 12:56:34    

oui c'est normal il y a des objets perso pour le Direct3D.
 
c'était pour avoir l'idée générale pour avoir un truc qui marche.


Message édité par bjone le 08-04-2005 à 13:27:47
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed