Accueil > Forum > > > > rotation de points
rotation de points
jeudi 7 février 2008 à 16:29:09 |
rotation de points

asagran
|
bonjour, je débute en 3D et j'ai le probleme suivant: pour la réalistion d'un petit soft permettant de visualiser une carte 3d d'étoiles j'ai fait un premier test avec CustomVertex.TransformedColored et mes points apparaissent mais dès que je veux passer à du PositionColored afin de pouvoir faire des rotations (et autres) plus rien n'apparait => using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using System.Xml;using System.IO;using System.Collections;using System.Drawing.Drawing2D;using Microsoft.DirectX;using Microsoft.DirectX.Direct3D;namespace STAR_HERO{ publicpartialclassForm1 : Form{ // Notre devicepublicDevice device; // Procédure d'initialisation du device Direct3Dpublicvoid InitializeGraphics() { try{ PresentParameters presentParams = newPresentParameters();presentParams.SwapEffect = SwapEffect.Discard;presentParams.Windowed = true;presentParams.AutoDepthStencilFormat = DepthFormat.D16;presentParams.EnableAutoDepthStencil = true;//attendre la synchronisation avec l'ecran (VSync)//utiliser PresentInterval.Immediate pour des vitesses rapidespresentParams.PresentationInterval = PresentInterval.One; device = newDevice(0, DeviceType.Hardware, view_pan, CreateFlags.HardwareVertexProcessing, presentParams);device.Transform.Projection = Microsoft.DirectX. Matrix.PerspectiveFovLH(0.5f, this.view_pan.Width, this.view_pan.Height, 50);device.Transform.View = Microsoft.DirectX. Matrix.LookAtLH(newVector3(1, 1, 30),newVector3(100, 100, -10),newVector3(1, 1, 1)); } catch (DirectXException e){ MessageBox.Show(null, "Error intializing graphics: "+ e.Message, "Error");Close(); } } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Notre VertexBufferprivateVertexBuffer vBuffer;// Nos VerticesprivateCustomVertex.PositionColored[] Vertices;// Procédure de création de notre trianglepublicvoid Create_Scene() { // On défini les vertices de notre triangle/*Vertices = new CustomVertex.PositionColored[3];Vertices[0] = new CustomVertex.PositionColored(new Vector3(100.0f, 125.0f, 0.5f), Color.Beige.ToArgb()); Vertices[1] = new CustomVertex.PositionColored(new Vector3(275.0f, 275.0f, 0.5f), Color.Orange.ToArgb()); Vertices[2] = new CustomVertex.PositionColored(new Vector3(125.0f, 275.0f, 0.5f), Color.Blue.ToArgb()); */ Vertices = newCustomVertex.PositionColored[STATICS.ALLSTARS_AR.Count*6];int count = 0;try{ for (int i = 0; i < STATICS.ALLSTARS_AR.Count; i++){ STAR star = (STAR)STATICS.ALLSTARS_AR[i];Vertices[i + count] = newCustomVertex.PositionColored(newVector3(star.X, star.Y, star.Z), Color.White.ToArgb());Vertices[i + count + 1] = newCustomVertex.PositionColored(newVector3(star.X + 1, star.Y, star.Z), Color.Yellow.ToArgb());Vertices[i + count + 2] = newCustomVertex.PositionColored(newVector3(star.X, star.Y + 1, star.Z), Color.Yellow.ToArgb());Vertices[i + count + 3] = newCustomVertex.PositionColored(newVector3(star.X - 1, star.Y, star.Z), Color.Yellow.ToArgb());Vertices[i + count + 4] = newCustomVertex.PositionColored(newVector3(star.X, star.Y - 1, star.Z), Color.Yellow.ToArgb());count += 5; } } catch (Exception ex) { debug_txt.AppendText("********"+ex.Message+"*******"); } // On crée le vertex buffervBuffer = newVertexBuffer(typeof(CustomVertex.PositionColored), Vertices.Length,device, 0, CustomVertex.PositionColored.Format, Pool.Default);// On stocke les vertices dans le vertex buffervBuffer.SetData(Vertices, 0, LockFlags.None);} ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////publicvoid Process(Device device) { device.Transform.Projection = Microsoft.DirectX. Matrix.PerspectiveFovLH(0.5f, this.view_pan.Width, this.view_pan.Height, 50);device.Transform.View = Microsoft.DirectX. Matrix.LookAtLH(newVector3(1, 1, 30),newVector3(100, 100, -10),newVector3(1, 1, 1)); // Effacement de la scènedevice.RenderState.Lighting = false;device.RenderState.CullMode = Cull.None;device.Clear( ClearFlags.Target, 0, 1.0f, 0);// Début de la scènedevice.BeginScene(); //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// if (STATICS.ALLSTARS_AR.Count>0){ // On défini le vertex buffer à liredevice.SetStreamSource(0, vBuffer, 0); // On défini le type des vertices stockées dans notre vertex bufferdevice.VertexFormat = CustomVertex.PositionColored.Format;// On dessine le vertex bufferdevice.DrawPrimitives(PrimitiveType.PointList, 0, Vertices.Length); for (int i = 0; i < STATICS.ALLSTARS_AR.Count; i++){ STAR star = (STAR)STATICS.ALLSTARS_AR[i];g.DrawString(star.Name, new System.Drawing.Font("Verdana", 7), newSolidBrush(Color.White), star.X + 4, star.Y - 6);} angle = angle + 0.1f; device.Transform.World = Microsoft.DirectX. Matrix.Translation(-5, -10 * 1 / 3, 0) *Microsoft.DirectX. Matrix.RotationAxis(newVector3(angle * 0.2f, angle * 1.5f, angle * 3f), angle); } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////device.EndScene(); device.Present(); this.view_pan.Invalidate();} float angle = 0f;////////////////////////////////////////SEARCH search; Graphics g;public Form1() { InitializeComponent(); InitializeGraphics(); g = view_pan.CreateGraphics(); search = newSEARCH(this); } privatevoid button1_Click(object sender, EventArgs e) { search.list(); } privatevoid button2_Click(object sender, EventArgs e){ search.list(); } } }
|
|
jeudi 7 février 2008 à 16:34:52 |
Re : rotation de points
|
jeudi 7 février 2008 à 19:58:01 |
Re : rotation de points

Julien237
|
As-tu bien saisi la différence entre TransformedColored et PositionColored ?
PositionColored -> La position est définie dans l'espace de Device, en 3D, puis projetée sur ton écran en appliquant les matrices de transformations World, View et Projection.
TransformedColored -> La position est définie directement sur l'espace de la surface de dessin sur la projection. Les transformations de projection sont donc gérée par ton programme afin de fournir un point "transformé".
Les coordonnées doivent donc être différentes (selon tes informations de projections) lorsque tu vas travailler avec des PositionColored.
Pour commencer, je te conseille de travailler avec une projection très simple :
World = Matrix.Identity -> Pas de transformation du monde View = Matrix.LookAtLH(vec3(0, 0, -5), vec3(0, 0, 0), vec3(0, 1, 0)) -> On se positionne en z = -5 et on regarde à l'origine, le haut est dirigé selon les y positifs Projection = Matrix.PrespectiveFovLH(Pi/2, Window.Width / Window.Height, 0.1f, 1000f) -> Projection "naturelle"
Ensuite dessine une étoile à l'origine par exemple. Normalement tu devrais la voir.
Tu peux règler le diamètre des points dessinés avec Device.RenderState.PointSize.
Julien.
|
|
vendredi 8 février 2008 à 12:17:57 |
Re : rotation de points

asagran
|
j'ai essayé avec ta proposition, en virant la partie rotation et en plaçant une étoile en 0,0,0 => pareil, ça n'apparait pas. Je viens aussi de tester avec un exemple simple d'affichage direct d'un triangle dans la Frame (au lieu d'un panel), ça fait la même chose, ça marche en Transformed mais pas en Position => 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 test3d2{ publicpartialclassForm1 : Form{ // Notre deviceprivateDevice device = null;// Notre VertexBufferprivateVertexBuffer vBuffer;// Nos VerticesprivateCustomVertex.PositionColored[] Vertices;// Initialisation de la formpublic Form1(){ InitializeComponent(); // Appel de la procédure d'initialisation du device Direct3DInitializeGraphics(); CreateTriangle(); // Evènement pour la boucle de renduthis.Paint += newPaintEventHandler(this.Render);} // Procédure d'initialisation du device Direct3Dprivatevoid InitializeGraphics(){ // Définition des PresentParametersPresentParameters presentParams = newPresentParameters();presentParams.Windowed = true;presentParams.SwapEffect = SwapEffect.Discard;// Creation de notre devicedevice = newDevice(0, DeviceType.Hardware, this, CreateFlags.SoftwareVertexProcessing, presentParams);device.Transform.World = Microsoft.DirectX. Matrix.Identity;//On se positionne en z = -5 et on regarde à l'origine, le haut est dirigé selon les y positifsdevice.Transform.View = Microsoft.DirectX. Matrix.LookAtLH(newVector3(0, 0, -5), newVector3(0, 0, 0), newVector3(0, 1, 0));//Projection "naturelle"device.Transform.Projection = Microsoft.DirectX. Matrix.PerspectiveFovLH((float)(Math.PI / 2), this.Width / this.Height, 0.1f, 1000f);} // Procédure de création de notre triangleprivatevoid CreateTriangle(){ Vertices = newCustomVertex.PositionColored[3];Vertices[0] = newCustomVertex.PositionColored(newVector3(0f, 0f, 0f), Color.Beige.ToArgb());Vertices[1] = newCustomVertex.PositionColored(newVector3(75.0f, 75.0f, 0.5f), Color.Orange.ToArgb());Vertices[2] = newCustomVertex.PositionColored(newVector3(125.0f, 275.0f, 0.5f), Color.Blue.ToArgb());vBuffer = newVertexBuffer(typeof(CustomVertex.PositionColored), Vertices.Length,device, 0, CustomVertex.PositionColored.Format, Pool.Default);// On stocke les vertices dans le vertex buffervBuffer.SetData(Vertices, 0, LockFlags.None);} // La boucle de renduprivatevoid Render(object sender, PaintEventArgs e){ // Effacement de la scènedevice.Clear( ClearFlags.Target, 0, 1.0f, 0);// Début de la scènedevice.BeginScene(); device.Transform.World = Microsoft.DirectX. Matrix.Identity;//On se positionne en z = -5 et on regarde à l'origine, le haut est dirigé selon les y positifsdevice.Transform.View = Microsoft.DirectX. Matrix.LookAtLH(newVector3(0, 0, -5), newVector3(0, 0, 0), newVector3(0, 1, 0));//Projection "naturelle"device.Transform.Projection = Microsoft.DirectX. Matrix.PerspectiveFovLH((float)(Math.PI / 2), this.Width / this.Height, 0.1f, 1000f);// On défini le vertex buffer à liredevice.SetStreamSource(0, vBuffer, 0); // On défini le type des vertices stockées dans notre vertex bufferdevice.VertexFormat = CustomVertex.PositionColored.Format;// On dessine le vertex bufferdevice.DrawPrimitives( PrimitiveType.TriangleList, 0, Vertices.Length / 3);// Fin de la scènedevice.EndScene(); // Présentation de la scène à l'écrandevice.Present(); } } }
|
|
vendredi 8 février 2008 à 12:19:31 |
Re : rotation de points

asagran
|
ps: comment on affiche du code automatiquement indenté ici ? (ça ferait plus propre)
|
|
vendredi 8 février 2008 à 13:29:59 |
Re : rotation de points

Julien237
|
Zut c'est bizarre... T'inquiète pas, ça fait un bout de temps que je fais du DirectX, mais à chaque fois je dois chipoter beaucoup avant d'arriver à mon résultat... Je pense à m'offrir un vrai bouquin sur le sujet un de ces 4, jpense que c'est le mieux à faire si on veut faire un peu de sérieux... Je teste ce soir sur mon pc et je te dis quoi.
C'est toujours la m*** pour afficher du code, je sais pas comment on peut faire...
Julien.
|
|
vendredi 8 février 2008 à 17:44:16 |
Re : rotation de points

Julien237
|
Ah j'ai trouvé ! Quel b*** pour remettre le code en forme dans VS ! Il faut désactiver les lumières et dessiner les deux côtés du triangle :
device.RenderState.CullMode = Cull.None; device.RenderState.Lighting = false;
Pour utiliser les lumières, tu dois en mettre dans ta scène et spécifier des Normal à tes vertices.
CullMode j'imagine que tu vois ce que c'est ? (Selon le mode, il ne dessine le triangle que "d'un coté", on ne le voit alors que de ce coté là, ou des deux)
Julien.
|
|
samedi 9 février 2008 à 10:35:09 |
Re : rotation de points

asagran
|
"device.RenderState.CullMode = Cull.None; device.RenderState.Lighting = false;"
==> malheureusement j'ai déjà essayé, ça marche pô :(
|
|
samedi 9 février 2008 à 10:54:25 |
Re : rotation de points

Julien237
|
Réponse acceptée !
Bah je te jure que chez moi le triangle s'affiche ! Je lui ai donné des composantes un peu moins extravagantes : (0; 0; 0) - (1; 1; 0) - (1; 0; 0)
Essaie un peu ? Sinon je t'envoie ma source telle quelle et si ca marche pas change de carte graphique :p.
Julien.
|
|
dimanche 10 février 2008 à 13:50:57 |
Re : rotation de points

asagran
|
damned, tu as raison, avec ces coordonnées il apparait :) bon alors du coup il semblerait que pour mes étoiles ça soit un "simple" probleme d'échelle.
Bon, au moins maintenant je sais dans quelle direction aller, merci bcp :)
|
|
Cette discussion est classée dans : using, device, star, vertices, positioncolored
Répondre à ce message
Sujets en rapport avec ce message
Initialisation de direct3d : problème [ par araxor ]
Bonjour à tous. J'ai décidé de me lancer dans direct3D. J'utilise visual studio 2005. J'ai suivi un tutorial pour l'initialisation. J'ai essayé de com
Bug pour créer device [ par LordOfTheShadow ]
Salut à tous j'ai essayé de faire un petit moteur 3D grâce à un webcast de msdn mais j'ai un bug alors que même après avoir vérifié j'ai fait exacteme
Probleme affichage de mesh directx [ par manipulat ]
Bonjour tout le monde je me permet de poser une question car je ne comprend pas bien l'origine du probleme, c'est une partie de mon code servant a aff
valide GroupBox [ par spiderams ]
Bonjour, je réalise une application web où l'étudiant doit choisir au moins une serie contenant plusieurs option alors j'ai fait 2 groupbox serie qui
Que manque t-il a mon code ? svp [ par krysis ]
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace TPTableau { class Program { static vo
timer programmé avec barre espace [ par Flodeb ]
Bonjour, Je souhaite activer un un timer avec la barre espace, je suis pour le moment capable de le faire en cliquant sur un bouton mais je veux rempl
accès à une base de donnée [ par moussstiqu3 ]
Bonjour, je travail actuellement sur visual studio 2010. Je débute sur c# et je voudrais me connecter à une base de donnée. On m'a conseiller la base
DirectX.capture capture et traitement des image en temps réel [ par gearmat ]
salut a tous, Je suis entrain de coder une appli pour faire la lecture de code barre via webcam j'utilise la librairie directX.capture pour captu
SOS: Binding d'un Combobox [ par yayasam ]
A l'aide SVP, c'est la 2eme fois ke je poste mon problème et j'ai tjs pas de réponse:[^^sad1] mon problème réside dans le Binding d'un combobox: tout
Service Windows qui ne veut pas démarrer [ par 0nn2belle ]
Bonsoir tout le monde, Je suis débutante en C# [^^happy8] et je suis confrontée à un souci qui, je l'espère, n'est pas de taille !! [^^confus2] En fai
Livres en rapport
|
Derniers Blogs
[TECHDAYS2012] OUI J'Y SERAI![TECHDAYS2012] OUI J'Y SERAI! par JeremyJeanson
Bonsoir, Certes, je l'annonce avec un peu de retard, mais je serai effectivement au Techdays demain. Comme l'an dernier, je participerai au programme ATE (Ask The Expert). Si vous avez des questions Workflow, WCF, AppFabric ou plus généralement .net, n'hé...
Cliquez pour lire la suite de l'article par JeremyJeanson TFS INTEGRATION TOOLS - SUIVI DES SYNCHRONISATIONS AVEC REPORTING SERVICESTFS INTEGRATION TOOLS - SUIVI DES SYNCHRONISATIONS AVEC REPORTING SERVICES par vfabing
Afin de s'assurer du bon fonctionnement des différentes synchronisations effectuées par les TFS Integration Tools, 2 rapports sont présents dès l'installation. Il suffit alors d'effectuer les manipulations suivantes pour pouvoir les visualiser : Loca...
Cliquez pour lire la suite de l'article par vfabing CSS CONTENT STATE SELECTORS (PERSONNAL DRAFT)CSS CONTENT STATE SELECTORS (PERSONNAL DRAFT) par FREMYCOMPANY
Bonjour à tous, Je viens de publier une proposition comprenant 5 pseudo-classes pour le CSS Working Group ayant trait à l'état de chargement d'un élément (ex: IMG,VIDEO,AUDIO,OBJECT pour l'HTML.). Si le c½ur vous en dit, vous pouvez retrouver cette p...
Cliquez pour lire la suite de l'article par FREMYCOMPANY MBA : POURQUOI FAIRE ET COMMENT LE CHOISIR ?MBA : POURQUOI FAIRE ET COMMENT LE CHOISIR ? par ROMELARD Fabrice
Formation initiale Durant la formation, le découpage classique est le suivant (je donnerai les équivalences Suisse lorsque je les connaîtrais) : Ecole primaire jusqu'au Collège : Formation générale permettant d'obtenir les méthodes...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice Y'A DES ERREURS QUI PEUVENT RENDRE LE DéVELOPPEUR VIOLENTY'A DES ERREURS QUI PEUVENT RENDRE LE DéVELOPPEUR VIOLENT par Aleks
Quand on a ce genre d'erreur sans log :
Et bas on a juste envie de choper le gas de Microsoft qu'a développé ça et lui foutre des baffes de Coboye ! ...
Cliquez pour lire la suite de l'article par Aleks
Logiciels
Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|