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

OpenGL Discussion :

View frustum culling


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Inscrit en
    Octobre 2010
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 2
    Par défaut View frustum culling
    Bonjour,je cherche en ce moment a appliquer l'algorithme du view frustum culling, mais je suis confronté à un problème que je n'ai pas pu résoudre :
    J'ai réussi à calculer l’équation des deux plans 'near' et 'far', mais la normal des autres plans est inadéquate (elle ne marche que quand la caméra est à la position (0,0,0) (j'ai posté a la fin une vidéo qui le montre), voici comment je calcule pas exemple les deux points du plan left :
    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
     
        Vector c,t;
        double wNear, hNear;
        Vector normal,point;
        Vector right,direction,up = InitVector(0,1,0),camPos = InitVector(m->x,m->y,m->z);
        hNear = 2*tan((double) (f->fovy*M_PI/180)*0.5) *f->near;
        wNear =  hNear* f->ratio;
     
        direction = MinusVectors(InitVector(m->x_f,m->y_f,m->z_f),camPos);// camPos -> cible
        NormaliseVector(&direction);
        right = VectorProduct(direction,up); 
        ......
        c = AddVectors(camPos,AddVectors(ScaleVector(direction,f->near),AddVectors(ScaleVector(up,hNear/2.0),ScaleVector(right,-(wNear/2.0)))));// c est le point à gauche et au centre du plan Near
        t = AddVectors(camPos,AddVectors(ScaleVector(direction,f->near),AddVectors(ScaleVector(right,-wNear/2.0),ScaleVector(up,-hNear/2.0))));// t est le point à gauche et en bas du plan near.
        normal = VectorProduct(t,c);
        point = c;
        SetPlane(&f->planes[LEFT_PLANE],normal,point);
    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
    void SetPlane (Plane *p,Vector normal,Vector point)
    {
        p->normal = normal;
        p->d  = - DotProduct(normal,point);
    }
    Vector AddVectors(Vector v1, Vector v2)
    {
        Vector result = v1;
        result.x += v2.x;
        result.y += v2.y;
        result.z += v2.z;
        return result;
    }
     
    Vector MinusVectors (Vector v1, Vector v2)
    {
        Vector result = v1;
        result.x -= v2.x;
        result.y -= v2.y;
        result.z -= v2.z;
        return result;
    }
     
    Vector ScaleVector (Vector v, double scale)
    {
        Vector result = v;
        result.x *= scale;
        result.y *= scale;
        result.z *= scale;
        return result;
    }
     
    double DotProduct (Vector v1, Vector v2)
    {
        return v1.x*v2.x + v1.y*v2.y + v1.z*v2.z;
    }
    Vector VectorProduct (Vector v1,Vector v2)
    {
        Vector result;
        result.x = v1.y*v2.z - v1.z*v2.y;
        result.y = v1.z*v2.x - v1.x*v2.z;
        result.z = v1.x*v2.y - v1.y*v2.x;
        return result;
    }
    void NormaliseVector ( Vector *v)
    {
        double lenght = sqrt(v->x*v->x + v->y*v->y + v->z*v->z);
        v->x/=lenght;
        v->y/=lenght;
        v->z/=lenght;
    }
    Vector InitVector (double x,double y, double z)
    {
        Vector result;
        result.x = x;
        result.y = y;
        result.z = z;
        return result;
    }
    [ame="http://www.youtube.com/watch?v=GFYowJqWGNE"]YouTube - VFX 2011 05 03 18 29 51 84[/ame]

    Merci

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 150
    Billets dans le blog
    150
    Par défaut
    Bonjour,

    Je ne comprends pas vraiment pourquoi vous ne déplacer pas la camera elle même au lieu d'une camera virtuelle pour votre test ...
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Candidat au Club
    Inscrit en
    Octobre 2010
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 2
    Par défaut
    Bonjour, si je le fais, mais dans la boucle principale.

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

Discussions similaires

  1. Problème avec mon view frustum culling
    Par overdrivr dans le forum OpenGL
    Réponses: 1
    Dernier message: 22/08/2011, 22h29
  2. Frustum culling : problème
    Par casafa dans le forum OpenGL
    Réponses: 17
    Dernier message: 09/11/2007, 08h32
  3. clipping / frustum culling
    Par Elendhil dans le forum Moteurs 3D
    Réponses: 2
    Dernier message: 13/06/2007, 21h57
  4. Frustum Culling optimisé
    Par Ingham dans le forum Développement 2D, 3D et Jeux
    Réponses: 12
    Dernier message: 19/05/2007, 17h50
  5. Probleme avec du frustum Culling
    Par zlamouche dans le forum OpenGL
    Réponses: 13
    Dernier message: 18/03/2004, 08h29

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