begin process at 2012 02 07 08:44:24
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C#

 > 

Multimédia

 > 

DirectX

 > 

rotation de points


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

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 device

publicDevice device;

// Procédure d'initialisation du device Direct3D

publicvoid 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 rapides

presentParams.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 VertexBuffer

privateVertexBuffer vBuffer;

// Nos Vertices

privateCustomVertex.PositionColored[] Vertices;

// Procédure de création de notre triangle

publicvoid 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 buffer

vBuffer =

newVertexBuffer(typeof(CustomVertex.PositionColored), Vertices.Length,

device, 0,

CustomVertex.PositionColored.Format, Pool.Default);

// On stocke les vertices dans le vertex buffer

vBuffer.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ène

device.RenderState.Lighting =

false;

device.RenderState.CullMode =

Cull.None;

device.Clear(

ClearFlags.Target, 0, 1.0f, 0);

// Début de la scène

device.BeginScene();

////////////////////////////////////////////

////////////////////////////////////////////

////////////////////////////////////////////

if (STATICS.ALLSTARS_AR.Count>0)

{

// On défini le vertex buffer à lire

device.SetStreamSource(0, vBuffer, 0);

// On défini le type des vertices stockées dans notre vertex buffer

device.VertexFormat =

CustomVertex.PositionColored.Format;

// On dessine le vertex buffer

device.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

asagran

pour faciliter la lecture j'ai stocké la source ici =>
[ Lien ]
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 device

privateDevice device = null;

// Notre VertexBuffer

privateVertexBuffer vBuffer;

// Nos Vertices

privateCustomVertex.PositionColored[] Vertices;

// Initialisation de la form

public Form1()

{

InitializeComponent();

// Appel de la procédure d'initialisation du device Direct3D

InitializeGraphics();

CreateTriangle();

// Evènement pour la boucle de rendu

this.Paint += newPaintEventHandler(this.Render);

}

// Procédure d'initialisation du device Direct3D

privatevoid InitializeGraphics()

{

// Définition des PresentParameters

PresentParameters presentParams = newPresentParameters();

presentParams.Windowed =

true;

presentParams.SwapEffect =

SwapEffect.Discard;

// Creation de notre device

device =

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 positifs

device.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 triangle

privatevoid 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 buffer

vBuffer.SetData(Vertices, 0,

LockFlags.None);

}

// La boucle de rendu

privatevoid Render(object sender, PaintEventArgs e)

{

// Effacement de la scène

device.Clear(

ClearFlags.Target, 0, 1.0f, 0);

// Début de la scène

device.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 positifs

device.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 à lire

device.SetStreamSource(0, vBuffer, 0);

// On défini le type des vertices stockées dans notre vertex buffer

device.VertexFormat =

CustomVertex.PositionColored.Format;

// On dessine le vertex buffer

device.DrawPrimitives(

PrimitiveType.TriangleList, 0, Vertices.Length / 3);

// Fin de la scène

device.EndScene();

// Présentation de la scène à l'écran

device.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


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,811 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales