begin process at 2012 05 28 23:29:29
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Windows

 > 

DirectX

 > 

Création d'un mesh à partir de points. --> Stack overflow


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Création d'un mesh à partir de points. --> Stack overflow

samedi 10 mars 2007 à 14:03:48 | Création d'un mesh à partir de points. --> Stack overflow

rotfa

Salut à tous.

Je suis entrain de développer une game-engine spécifique qui pourrait être utilisé dans des cours pour faire des démos et développer des compétences.
Voila je crée un tube (courbé ou non) qui est définit par des points et par un radius (demi diamètre). Ce tube est créé à partir de triangles qui sont définit dans le champ _indices. Les coordonnées des points se trouvent dans _ropeVertices.

Lorsque je dessine le tube avec le vertexBuffer et Indexbuffer et drawIndexedPrimitive... ca marche sans problème.
Lorsque je veux, comme ici, le transformer dans un mesh, je recoit une message d'erreur: Stack Overflow à un moment de l'exécution (qui change naturellement à chaque fois :-( ). Si j'enlève le mesh ca marche, mais ca ne rentre pas dans la structure globale
du projet. J'ai loupé qqch.?



private CustomVertex.PositionNormalTextured[] _ropeVertices;
private VertexBuffer _vb;
private IndexBuffer _ib;
private int[] _indices;
private Mesh mesh;


public Mesh createRope(Device dev, Vector3[] points,  float radiusOfRope)
{
    Vector3 n;
    int circleSubdivision = 20;
    for (int i = 0; i < points.Length-1; i++)
    {
n = Vector3.Subtract(points[i], points[i+1]);
createCircle(points[i], n, radiusOfRope, circleSubdivision, (float)i % 2);
    }
    n = Vector3.Subtract(points[points.Length - 2], points[points.Length - 1]);
    createCircle(points[points.Length - 1], n, radiusOfRope, circleSubdivision, (float)points.Length - 1 % 2);
 
    _indices = newint[(points.Length - 1)*circleSubdivision* 6]; 
    int k=0;
    int faces = 0;
    for (int j = 0; j < points.Length - 1; j++)
    {
for (int i = 0; i < circleSubdivision - 1; i++)
            {
    _indices[k] = i + j * circleSubdivision;   
    _indices[k + 1] = _indices[k] + 1;     
    _indices[k + 2] = _indices[k] + circleSubdivision;     
    _indices[k + 3] = _indices[k + 1];
    _indices[k + 4] = _indices[k + 2] + 1;
    _indices[k + 5] = _indices[k + 2];
    k += 6;
    faces += 2;
}
_indices[k] = (j + 1) * circleSubdivision - 1;
_indices[k + 1] = j * circleSubdivision;
_indices[k + 2] = _indices[k] + circleSubdivision;
_indices[k + 3] = _indices[k + 1];
_indices[k + 4] = _indices[k + 1] + circleSubdivision;
_indices[k + 5] = _indices[k + 2];
k += 6;
faces += 2;
    }      
 
mesh = newMesh(faces, _ropeVertices.Length, MeshFlags.Dynamic,  
            CustomVertex.PositionNormalTextured.Format, dev);
   
    AttributeRange[] attributeRange = newAttributeRange[1];
    attributeRange[0].AttributeId = 0;
     attributeRange[0].FaceStart = 0;
    attributeRange[0].FaceCount = faces;
    attributeRange[0].VertexStart = 0;
    attributeRange[0].VertexCount = _ropeVertices.Length;   
    mesh.SetAttributeTable(attributeRange);
   
    mesh.VertexBuffer.SetData(_ropeVertices, 0, LockFlags.None);
    mesh.IndexBuffer.SetData(_indices, 0, LockFlags.None);                     <--- souvent ca plante ici
    return mesh;
}
 
//créer un cercle dans la plaine définit par le point et la normale et le subdivier en un nombre de //points
private void createCircle(Vector3 center, Vector3 normal, float radius, int subdivisions, float texturePosition)
{
    float arcus_increment = (float)(2.0 * Math.PI /subdivisions); //cylinder angular increment
    float tu_increment = (float)(1.0 / (subdivisions)); //texture horiz. increment
    Vector3 v = newVector3();   
    _ropeVertices = incArray(_ropeVertices,subdivisions);
   
    int insertPosition = _ropeVertices.Length - subdivisions;
 
    Vector3 x = newVector3(normal.Y, -normal.X, 0);
    if (x.X == 0 && x.Y == 0 && x.Z == 0)
    {
x = newVector3(0, normal.Z, -normal.Y);
    }
    Vector3 y = newVector3(normal.Z, 0, -normal.X);
    if (y.X == 0 && y.Y == 0 && y.Z == 0)
    {
y = newVector3(0, normal.Z, -normal.Y);
    }
    x.Normalize();
    y.Normalize();
    if (y.Z > 0)
    {
y.X *= -1;
y.Z *= -1;
    }
    for (int i = 0; i < subdivisions; i++)
    {
float arcus = i * arcus_increment;
v = Vector3.Multiply(x, radius * (float)Math.Cos(arcus)) + Vector3.Multiply(y, radius * (float)Math.Sin(arcus));
v += center;
 
//Point
_ropeVertices[insertPosition + i].Position = v;
 
//Normale
v.Y = 0;  
_ropeVertices[insertPosition + i].Normal = v;
 
//Texture
 _ropeVertices[insertPosition + i].Tv = i * tu_increment;
 _ropeVertices[insertPosition + i].Tu = texturePosition;
    }
}
 
private CustomVertex.PositionNormalTextured[] incArray(CustomVertex.PositionNormalTextured[] srcArray, int numItems)
{
    if (srcArray == null)
    {
return new CustomVertex.PositionNormalTextured[numItems];
    }
    else
    {
CustomVertex .PositionNormalTextured[] newArray = newCustomVertex.PositionNormalTextured[srcArray.Length + numItems];
Array .Copy(srcArray, newArray, srcArray.Length);
return newArray;
    }
}


Cette discussion est classée dans : points, float, mesh, indices, ropevertices


Répondre à ce message

Sujets en rapport avec ce message

gérer des millions de points [ par fafa21081974 ] Bonjour tout le monde après deux mois de stage et d'initition à C++, il m'est souvent arrivé de vous contacter et votre aide m'a toujours bcp dépann Detecter axe de symétrie dans un polygone [ par alexis0788 ] Bonjour à tous, je suis actuellement en fin de projet informatique en C sur les polygones. Je touche au but mais la dernière question est, je trouve, Simulateur & conduite automatique d'1 voiture [ par sonia393 ] Bonjour, voila, je suis en train de créer un petit simulateur de voiture avec conduite automatique : j'ai un état 1 (position, cap, vitesse, accélérat maillage [ par widwid ] bonjourje développe un code pour visualiser en 3D la surface externe d'un nuage de points.Dans un premier temps, j'ai classé mes points dans des courb conversion float to double [ par chalmia2s ] Bonjour,J'ai un probleme de conversion float, double, voila la partie du programme concerné: float *rd, float*rq;  double aide pour pb de Programmation de la méthode gram_schmidt [ par hac1002008 ] salut a tous , je debut avec c++ builder , je vous fait voir ma pocedure qui calcule la methode gram_schmidt mais elle a ne donne pas le resultat exac UN PETIT COUP DE MAIN POUR SE PROGRAMME SVP !! [ par dualphil ] Bon voila le code j'ai la même erreur en boucle genre 20 fois je sais que sa doit être un truc tout bête mais j'arrive pas à trouver [^^sad1] Voila le Tableaux d'objets identiques [ par zebulon88 ] Bonjour à tous, voilà j'ai un problème, j'utilise un tableau d'objet avec des paramètres fixés par rand le problème est que lorsque je fixe la valeur Maillage applique a un nuage de points [ par aerocrazy ] Bonjour a tous! Actuellement je cherche a créer un maillage 3D a base de triangles en OpenGL a partir d'un nuage de points. J'ai essaye de développer


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,749 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales