IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

3D Java Discussion :

[Java3D]Construction de terrain


Sujet :

3D Java

  1. #1
    Futur Membre du Club
    Inscrit en
    Septembre 2004
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 4
    Par défaut [Java3D]Construction de terrain
    Bonjour,

    J'ai un pb concernant java3D.

    J'ai une grille d'altitude de ce type

    int Alt[][] = new int [Xmax][Ymax]

    avec Alt[x][y] = z et Xmax=Ymax=1000

    que je charge avec un fichier txt.

    On a donc l'ordre dans ce tableau est simple

    x=0; y=0 / x=0;y=1 ..............................x=0;y=1000
    x=1; y=0 / x=1;y=1 ..............................x=1;y=1000
    .
    .
    .
    .
    x=1000; y=0 / x=1000;y=1 ..............................x=1000;y=1000


    Avec ce Tableau je dois construire un terrain 3D. Je prépare donc mon Univers 3D et je crée une classe MaShape qui hérite de Shape3D.

    Lors d'un premier test j'ai construit mon terrain en utilisant des Points de cette manière :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    g = new PointArray(1001*1001, PointArray.COORDINATES | PointArray.COLOR_3 |PointArray.TEXTURE_COORDINATE_2 
    int index=0;
     
    for (int x=0; x < 1001;x++){
     
    for(int y=0;y<1001;y++){
     
    //On Applique un changement de repère 
    PointDouble p = tr.transformCarteEcran(x,y);
     
    g.setCoordinate(index,
    new Point3d(p.getX(),p.getY(),(double)(Alt[x][y])/10000));
    g.setColor(index,blue);
     
    //Cette Partie permet de placer la texture 
    p = trTex.transformEcranCarte(p.getX(),p.getY(),1);
    q.set((float)p.getX(),(float)p.getY());
    g.setTextureCoordinate(index++,q);
     
    }
     
    }

    Et là pas de Pb ça marche (du moins quand je ne prends pas un repère trop grand car si il y a trop d'espace entre les points pas beau)

    Maintenant j'aimerai ne plus avoir des points mais des triangles et là ben je n'y arrive pas. Please est-ce que someone peut m'aider







    [Modéré par Didier]
    Ajout de tag dans le titre
    Lire les règles du forum : Règles du forum Java

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2002
    Messages : 652
    Par défaut
    Pour avoir des Shapes valides tu doit respecter une chose simple.
    Les points de ton shape doivent être enregistrés dans l'ordre anti-horaire ce qui définis leur normal.
    Par défaut, tout shape construit n'est visible que d'un seul coté.

    Personnelement, j'utilise des QuadArray et non des PointArray.

    Voici un exemple basic.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
     
    package org.alwin;
    import java.net.URL;
     
    import javax.media.j3d.*;
    import javax.media.j3d.Shape3D;
    import javax.vecmath.Color3f;
    import javax.vecmath.Point3f;
     
    import com.sun.j3d.utils.geometry.Cylinder;
    import com.sun.j3d.utils.image.TextureLoader;
     
    public class Plancher extends Shape3D {
      private BranchGroup bg = new BranchGroup();
     
      public BranchGroup getBg() {
        return bg;
      }
     
      public Plancher() {
        QuadArray plane = new QuadArray(4, GeometryArray.COORDINATES | GeometryArray.COLOR_3 );
     
        float x = 10.0f;
        float y = 0.0f;
        float z = 10.0f;
        Point3f[] pointList = new Point3f[4];
        pointList[0] = new Point3f(-x, y, z);
        pointList[1] = new Point3f( x, y, z);
        pointList[2] = new Point3f( x, y,-z);
        pointList[3] = new Point3f(-x, y,-z);
        plane.setCoordinates(0,pointList);
     
        Color3f[] cols = new Color3f[4];
        Color3f col = new Color3f(0.5f,0.2f,0.2f);
        for( int i = 0; i < cols.length; i++)
          cols[i] = col;
        plane.setColors(0,cols);
     
        setGeometry(plane);
     
        createAppearance();
        bg.addChild(this);
      }
      private void createAppearance()
      {
        Appearance app = new Appearance();
        Material mat = new Material(white, red, white, white, 25f);
        app.setMaterial(mat);
        mat.setLightingEnable(true);
     
     
        PolygonAttributes pa = new PolygonAttributes();
        pa.setCullFace(PolygonAttributes.CULL_NONE);
        pa.setPolygonMode(PolygonAttributes.POLYGON_FILL);
          // On force à une visibilité double face
        app.setPolygonAttributes(pa);
     
        setAppearance(app);
      }
     
    }
    Cet exemple est très simpliste, il construit un simple carré mais j'espère qu'il t'aideras.

  3. #3
    Futur Membre du Club
    Inscrit en
    Septembre 2004
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 4
    Par défaut
    Pour ce qui est de cet Exemple pas de PB. Le PB principal est que mon terrain représente une grille de 1000*1000 Quad ce qui veut dire 1000*1000*4 Point à définir et là outOfMemory (d'autant que je dois ensuite appliqué une texture). N'existe-t-il pas un moyen moins gourmand. Le PB c'est que je définis plusieurs fois les même points


    v3-----------v2-----------v5
    | | |
    | | |
    | | |
    | | |
    v0-----------v1-----------v4

    Pour cette exemple je dois déclarer un QuadArray(8,QuadArray.COORDINATES) alors que je n'ai besoin que de 6 points

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2002
    Messages : 652
    Par défaut
    Ha ok, j'avais mal saisis ton problème.

    Bon, 1000 * 1000 c'est pas mal, soit ton terrain est grand, soit tu désire une certaine finesse. Tout ceci se paye en effet.

    Si tu ne veux pas dupliquer les points, il vas faloire travailler de manière optimisée donc, plus complexe.

    1 / Faire une liste de points
    2/ Faire une liste de quad prennant les indices des points

    Ainsi, chaque point est unique

    Si tu regarde la structure des fichiers DXF, de mamoire c'est ce qu'ils utilisent.

    Pour ton exemple ;
    Points = V0, V1, V2, V3, V4, V5
    Quad = [0,1,2,3],[1,4,5,2]

    Bon, le setCoordinates ne doit plus marcher par contre, mais je crois ( je n'ai pas Java3D ici ) que tu a un addCoordinate.

  5. #5
    Futur Membre du Club
    Inscrit en
    Septembre 2004
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 4
    Par défaut
    J'ai tenté comme ça, mais ça ne marche pas mieux. Finalement j'ai procédé en augmentant petit à petit le nombre de carré de mon terrain et j'arrive à un maximum de 200*200. Le poste de travail que l'on m'a attribué n'est pas equipé de carte 3D (les #{~[#{[[), je pense que la limitation vient de là. Evidemment en passant d'une résolution de 1000*1000 à 200*200 on perd de la finesse (A Savoir que le terrain est censé représenté une zone de 60*60 km²).

  6. #6
    Expert confirmé

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 817
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 817
    Par défaut
    Avec une vieille ATI Rage 16Mo j'arrive à charger des modèles d'environ 120000 triangles... en sachant qu'avec le même programme en delphi+opengl je peux charger un peu plus.

    Peut-être est-ce aussi un problème de RAM... chez moi, c'est ce qui limite (tant que j'aurais pas optimisé un peu le code).

    As-tu essayé en augmentant la mémoire disponible pour la machine Java?
    Avec un petit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    java -Xmx128m monProg
    voir plus que 128 Mo si tu as...
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  7. #7
    Futur Membre du Club
    Inscrit en
    Septembre 2004
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 4
    Par défaut
    Ok Merci. Vu que j'ai 2Go de Ram, tout baigne !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [java3D][collision]
    Par geofun dans le forum 3D
    Réponses: 7
    Dernier message: 12/02/2007, 14h49
  2. [JBuilder 7] Construction d'executable natif
    Par renaudfaucon dans le forum JBuilder
    Réponses: 3
    Dernier message: 24/11/2006, 22h28
  3. [jAPI]Probleme de construction
    Par exe dans le forum C++Builder
    Réponses: 10
    Dernier message: 07/08/2003, 10h03
  4. Gestion des collisions - terrains
    Par Dranor dans le forum DirectX
    Réponses: 1
    Dernier message: 26/06/2003, 18h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo