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
Livres en rapport
|
Derniers Blogs
UNE JOLIE-HORLOGE ET PAS QU'UN PEU !UNE JOLIE-HORLOGE ET PAS QU'UN PEU ! par neodante
Pour les possesseurs d'iPhone, ça y est Bijin Tokei - qui se traduit littéralement en Français par " Jolie Horloge " - est arrivé et GRATUITEMENT s'il vous plaît ! Après la version Tokyo, Hokkaido, night club, racing, Gal, "pour les mademoiselles'", . voi...
Cliquez pour lire la suite de l'article par neodante TECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICESTECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICES par ROMELARD Fabrice
Animé par: Gaetan Bouveret et Julien Chomarat Business Connectivity Services (BCS) est dans SharePoint 2010 la version 2 de Business Data Catalog (BDC dans SharePoint 2007). Il s'agit de la solution permettant de visualiser des données provenan...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice [DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE[DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE par orion
Comme de nombreux geek, je suis un grand amateur de série TV et je rate régulièrement des épisodes de mes séries préférés. Une solution s'offre à vous avec ce merveilleux site : Tv Gorge - www.tvgorge.com Moteur de recherche à l'appui, vous pouvez ...
Cliquez pour lire la suite de l'article par orion TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010 par ROMELARD Fabrice
Animé par: Vincent Bellet et Baptiste Giraudier La BI dans SharePoint 2010, Les nouveaux services d'application dans SP2010 et SQL Server Reporting services 2008 R2. La BI dans SharePoint est généralisée pour tous afin de permettre à tous les coll...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
DB-MAIN (9.1.0)DB-MAIN (9.1.0)DB-MAIN is a data-modeling and data-architecture tool. It is designed to help developers and anal... Cliquez pour télécharger DB-MAIN Xilisoft DPG Convertisseur (5.1.37.0120)XILISOFT DPG CONVERTISSEUR (5.1.37.0120)Xilisoft DPG Convertisseur offre aux fans de Nintendo DS une bonne solution leur permettant de dé... Cliquez pour télécharger Xilisoft DPG Convertisseur GraphicsGale (2.01.01)GRAPHICSGALE (2.01.01)GraphicsGale est un logiciel de PixelArt avec de nombreuse fonctionnalités permettant de réalisé ... Cliquez pour télécharger GraphicsGale Architecte 3D (Platinum 2010)ARCHITECTE 3D (PLATINUM 2010)Architecte 3D Platinium vous permet de concevoir facilement les plans votre future maison, de l'é... Cliquez pour télécharger Architecte 3D TeamViewer 5 (TeamViewer 5)TEAMVIEWER 5 (TEAMVIEWER 5)Dépanner un ami,expliquer une manipulation devient un jeu d'enfant.
Prise en main d'un autre ord... Cliquez pour télécharger TeamViewer 5
|