begin process at 2010 02 10 06:47:51
  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 serveur et plusqu'un client [ par houcem001 ] Salut je suis entrain de programmer une plateforme de discussion mais j'ai un probleme pour envoyer des messages à un client sachant son adresse IP . Problème lors de l'ajout de données [ par juninho2lyon ] Bonjourje suis en train de créer une application en C# utilisant une base de données Access.Or quand je clique sur le bouton "ajouter", j'ai l'erreur palindrome_programme incomplet [ par francouas ] je pense que ma fonction est bonne mais le main est incompletcomment appeller la fonction correctement pour qu'il affiche si c'est un palindrome ou pa C# - Erreur NullReferenceException [ par skyline86 ] Bonjour, 'ai un message NullReferenceExceptionsur la ligne     Program.monFormulaire.lb_log.BeginInvoke(new GPRSListener.Principale.affichageLog( probleme de connection de combobox à la base de données [ par amal2008 ] salut, je realise une application en c# en utilisant sqlserver voilà mon code du fichier App.config xml< base de donnée [ par medinfo87 ] using System;using System.Collections.Generic;using System.Linq;using System.Data;using System.Configuration;using System.Data.SqlClient;using System. erreur dans traduction via api google :"Index and length must refer to a location within the string" [ par tkd1984 ] bonjour j'ai entrain de realiser une application desktop sous c#,qui traduire n'import quelle texte entrer avec l'aide de l'api google,voici le code : Destruction référence statique en .NET 3.5 [ par abaudouin84 ] <link rel="Fi


Nos sponsors


Sondage...

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
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,484 sec (4)

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