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

DirectX Discussion :

Problème d'affichage de la "face arrière" d'un carré


Sujet :

DirectX

  1. #1
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut Problème d'affichage de la "face arrière" d'un carré
    Bonjour,

    un problème basique mais plutôt étrange :
    un carré est dessiné sur le plan 0xy, de centre 0 et de côté 20.
    - si la caméra est placée "au dessus" de celui-ci c'est à dire selon les "z" négatifs le carré s'affiche;
    - si la caméra est placée "en dessous" de celui-ci c'est à dire selon les "z" positifs le carré ne s'affiche pas.

    Voici le code C# trés largement inspiré d'un tutorial :
    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
     
    using System;
    using System.Drawing;
    using System.Windows.Forms;
    using Microsoft.DirectX;
    using Microsoft.DirectX.Direct3D;
     
    namespace game
    {
        public class Game : Form
        {
            static void Main()
            {
                Game g = new Game();
                g.InitializeGraphics();
                g.Show();
                while (g.Created)
                {
                    g.Render();
                    Application.DoEvents();
                }
            }
     
            Game()
            {
                this.Size = new Size(800, 800);
                this.Resize += new EventHandler(onResize);
            }
     
            private Device device;
            private VertexBuffer vertices;
     
            private void onResize(object o, EventArgs ea)
            {
                this.Size = new Size(800, 800);
            }
     
            protected bool InitializeGraphics()
            {
                PresentParameters pres = new PresentParameters();
                pres.Windowed = true;
                pres.SwapEffect = SwapEffect.Discard;
     
                device = new Device(0, DeviceType.Hardware, this, CreateFlags.SoftwareVertexProcessing, pres);
     
                device.RenderState.Lighting = false;
     
                vertices = CreateVertexBuffer(device);
     
                return true;
            }
     
            protected VertexBuffer CreateVertexBuffer(Device device)
            {
                device.VertexFormat = CustomVertex.PositionColored.Format;
     
                VertexBuffer buf = new VertexBuffer(typeof(CustomVertex.PositionColored), 6, device, 0, CustomVertex.PositionColored.Format, Pool.Default);
     
                CustomVertex.PositionColored[] verts = (CustomVertex.PositionColored[])buf.Lock(0, 0);
     
                verts[0] = new CustomVertex.PositionColored(-10, 10, 0, Color.Red.ToArgb());
                verts[1] = new CustomVertex.PositionColored(10, 10, 0, Color.Green.ToArgb());
                verts[2] = new CustomVertex.PositionColored(10, -10, 0, Color.Blue.ToArgb());
                verts[3] = new CustomVertex.PositionColored(-10, 10, 0, Color.Red.ToArgb());
                verts[4] = new CustomVertex.PositionColored(10, -10, 0, Color.Red.ToArgb());
                verts[5] = new CustomVertex.PositionColored(-10, -10, 0, Color.Red.ToArgb());
     
                buf.Unlock();
                return buf;
            }
     
            protected void SetupMatrices()
            {
                device.Transform.View = Matrix.LookAtLH(new Vector3(0, 0, -30F), new Vector3(0, 0, 0), new Vector3(0, 1, 0));
                device.Transform.Projection = Matrix.PerspectiveFovLH((float)Math.PI / 4.0F, 1.0F, 1.0F, 100.0F);
            }
     
            protected void Render()
            {
                device.Clear(ClearFlags.Target, Color.White, 1.0F, 0);
     
                device.BeginScene();
     
                SetupMatrices();
     
                device.SetStreamSource(0, vertices, 0);
                device.DrawPrimitives(PrimitiveType.TriangleList, 0, 2);
                device.EndScene();
     
                device.Present();
            }
        }
    }
    C'est sur la ligne qu'est positionnée la caméra:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    device.Transform.View = Matrix.LookAtLH(new Vector3(0, 0, -30F), new Vector3(0, 0, 0), new Vector3(0, 1, 0));
    avec "-30F" il y a le carré, avec "30F" il n'est plus là.

    Outre ce problème auriez vous des conseils pour améliorer ce code?

    Merci.

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Le back-face culling (élimination des faces arrières) est activé par défaut. Si tu veux le désactiver, il faut jouer sur le renderstate CullMode (mettre à None).

  3. #3
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    En effet c'était ça, en ajoutant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    device.RenderState.CullMode = Cull.None;
    dans "InitializeGraphics" la face arrière s'affiche.

    Merci beaucoup.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 25/06/2010, 08h39
  2. [Kylix] problème d'affichage
    Par scalvi dans le forum EDI
    Réponses: 1
    Dernier message: 18/06/2003, 11h07
  3. Réponses: 1
    Dernier message: 06/03/2003, 12h57
  4. probléme d'affichage d'une fiche
    Par sb dans le forum Composants VCL
    Réponses: 7
    Dernier message: 29/08/2002, 10h43

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