Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1560 connectés 

  FORUM HardWare.fr
  Programmation
  Algo

  triangulation d'une sphère

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

triangulation d'une sphère

n°1032829
the_ugly
Posté le 01-04-2005 à 21:13:30  profilanswer
 

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).

mood
Publicité
Posté le 01-04-2005 à 21:13:30  profilanswer
 

n°1032840
bjone
Insert booze to continue
Posté le 01-04-2005 à 21:33:47  profilanswer
 

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

n°1032841
bjone
Insert booze to continue
Posté le 01-04-2005 à 21:35:35  profilanswer
 

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.

n°1032842
bjone
Insert booze to continue
Posté le 01-04-2005 à 21:37:24  profilanswer
 

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. }

n°1033012
Lam's
Profil: bas.
Posté le 02-04-2005 à 09:25:59  profilanswer
 

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...
 

n°1033028
bjone
Insert booze to continue
Posté le 02-04-2005 à 11:14:48  profilanswer
 

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

n°1039837
the_ugly
Posté le 08-04-2005 à 11:32:49  profilanswer
 

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.

n°1039920
bjone
Insert booze to continue
Posté le 08-04-2005 à 12:56:34  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Algo

  triangulation d'une sphère

 

Sujets relatifs
[OpenGL/software] creer une sphere[OpenGL / GLUT] Appliquer une texture à une sphère
afficher une sphere avec Glut sous delphi3triangulation de delaunay
[3D]: formule d'un vecteur tangent en un point d'une sphère?[opengl] Sphere texturee??
Plus de sujets relatifs à : triangulation d'une sphère


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR