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 :

C# : Sphère aplatie !


Sujet :

DirectX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut C# : Sphère aplatie !
    Bonjour,


    Bonjour,

    Sauriez-vous pourquoi la sphére est un peu aplatie?
    Le rapport hauteur/largeur est environ de 2/3.

    Voilà le code :

    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
    Code :
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using Microsoft.DirectX;
    using Microsoft.DirectX.Direct3D;
     
    namespace DX
    {
    public partial class Form1 : Form
      {
    	public Form1()
    	{
    		InitializeComponent();
    	}
    	public Matrix view;
    	public Device device = null;
    	public Mesh MySphere = null;
    	public void InitializeGraphics()
    	{
    		// setting components size
    		DXpnl.Top = TopPnl.Height;
    		DXpnl.Left = 0;
    		DXpnl.Width = ClientSize.Width;
    		DXpnl.Height = ClientSize.Height - TopPnl.Height; 
    		// paramètres de présentation
    		PresentParameters Params = new PresentParameters();
    		Params.Windowed = true;
    		Params.BackBufferFormat = Format.X8R8G8B8;
    		Params.AutoDepthStencilFormat = DepthFormat.D24S8;
    		Params.EnableAutoDepthStencil = true;
    		Params.BackBufferCount = 2;
    		Params.SwapEffect = SwapEffect.Discard;
    		// création du device;
    		device = new Device(0, DeviceType.Hardware, DXpnl.Handle, 
    			CreateFlags.SoftwareVertexProcessing, Params);
    		// public static Mesh Sphere(Device ,  radius,  slices, stacks);
    		MySphere = Mesh.Sphere(device, 3, 128, 128);
    	}
    	private void Render()
    	{
    		device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, 
    			System.Drawing.Color.Black, 1.0f, 0);
    		device.BeginScene();
    		device.Transform.Projection = Matrix.PerspectiveFovLH(
    			(float)Math.PI/4 , 1.0f, 1.0f, 100.0f);
    		// Function LookAtLH ( cameraPosition, cameraTarget,cameraUpVector)
    		view = Matrix.LookAtLH(new Vector3(0, 0, -20), 
    				new Vector3(0, 0, 0), new Vector3(0, 1, 0));
    		device.Transform.View = view;
    		device.RenderState.Ambient = System.Drawing.Color.White;
    		device.RenderState.Lighting = true;
    		// set Lights
    		device.Lights[0].Type = LightType.Directional;
    		device.Lights[0].Position = new Vector3(0.0f, 0.0f, -10.0f);
    		device.Lights[0].Direction = new Vector3(1.0f, -0.5f, 1.0f);
    		device.Lights[0].Ambient = Color.White;
    		device.Lights[0].DiffuseColor = ColorValue.FromColor(Color.White);
    		device.Lights[0].SpecularColor = ColorValue.FromColor(Color.WhiteSmoke);
    		device.Lights[0].Enabled = true;
     
    		Material mat = new Material();
    		mat.Ambient = Color.Aqua;
    		device.Material = mat;
    		device.SetTexture(0, null);
    		MySphere.DrawSubset(0);
    		device.EndScene();
    		device.Present();
    	}
     
    	private void Form1_Paint(object sender, PaintEventArgs e)
    	{
    	Render();
    	}
       }
    }

  2. #2
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Rebonjour,

    En fait, je viens de m'apercevoir que le "coefficient" d'aplatissement varie avec le rapport hauteur/largeur du Panel sur lequel on trace.

    J'arrive à compenser en ajustant le ratio d'aspect, mais ce n'est probablement pas la bonne solution.

    Auriez-vous une solution/explication pour un débutant en C# et DirectX ?

  3. #3
    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
    En fait, je viens de m'apercevoir que le "coefficient" d'aplatissement varie avec le rapport hauteur/largeur du Panel sur lequel on trace
    Normal non ?

    J'arrive à compenser en ajustant le ratio d'aspect, mais ce n'est probablement pas la bonne solution
    Si, c'est fait pour ça.

  4. #4
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Bonjour,

    Normal non ?
    A vrai dire, je ne comprends pas pourquoi la projection dépend de la fenêtre de destination.

    Pour moi, la fenêtre correspondait au capteur de l'appareil photo.
    Dans ce cas, ce n'est pas parce qu'on agrandit la surface du capteur ou que l'on coupe des bandes latérales que l'image change : on a simplement plus ou moins de vision périphérique.
    Dans OpenGl où on gère une caméra, il faut changer la focale pour changer/agrandir l'image au centre du capteur.

    Je suppose que DirectX travaille différement ... ou bien non ?

  5. #5
    Membre éclairé
    Avatar de funkydata
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    515
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 515
    Par défaut
    Je ne connais pas le mode de fonctionnement d'opengl mais pour Directx, la matrice de projection "projete" ton objet à l'écran c'est à dire qu'elle definie les coordonnées de ton objet dans ta fenêtre de rendu. Si tu as une fenetre avec un aspect ratio de 2/3 et que tu calcules ta matrice avec un aspect ratio de 1/1 c'est normal que ta sphère soit applati puisqu'en fait les coordonnées calculées seront erronées. Tu es donc obligé de passer l'aspect ratio correct dans le calcul de la matrice ...

  6. #6
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Merci à vous deux pour vos réponses.

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

Discussions similaires

  1. Sphère texturée et rotation
    Par Steki-kun dans le forum OpenGL
    Réponses: 4
    Dernier message: 26/02/2007, 21h52
  2. [C#] Colorer une sphère
    Par blinkseb dans le forum DirectX
    Réponses: 1
    Dernier message: 18/04/2005, 14h49
  3. probleme de texture sur une sphère
    Par sebpp dans le forum OpenGL
    Réponses: 2
    Dernier message: 12/04/2005, 19h46
  4. Texture sur d'une sphère
    Par Yellowmat dans le forum OpenGL
    Réponses: 1
    Dernier message: 16/12/2004, 10h59
  5. Problème avec le rendu de sphère
    Par Francky033 dans le forum DirectX
    Réponses: 10
    Dernier message: 29/08/2003, 22h00

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