Rotation de points

Résolu
asagran Messages postés 9 Date d'inscription jeudi 7 février 2008 Statut Membre Dernière intervention 11 février 2008 - 7 févr. 2008 à 16:29
asagran Messages postés 9 Date d'inscription jeudi 7 février 2008 Statut Membre Dernière intervention 11 février 2008 - 10 févr. 2008 à 13:50
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{

public
partial
class
Form1 :
Form{

// Notre device

public
Device device;

// Procédure d'initialisation du device Direct3D

public
void 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 =

new
Device(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(

new
Vector3(1, 1, 30),

new
Vector3(100, 100, -10),

new
Vector3(1, 1, 1)); 

}

catch (
DirectXException e){

MessageBox.Show(
null,
"Error intializing graphics: "+ e.Message,
"Error");Close();

}

}

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

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

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

// Notre VertexBuffer

private
VertexBuffer vBuffer;

// Nos Vertices

private
CustomVertex.
PositionColored[] Vertices;

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

public
void 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 =

new
CustomVertex.
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] =

new
CustomVertex.
PositionColored(
new
Vector3(star.X, star.Y, star.Z),
Color.White.ToArgb());Vertices[i + count + 1] =

new
CustomVertex.
PositionColored(
new
Vector3(star.X + 1, star.Y, star.Z),
Color.Yellow.ToArgb());Vertices[i + count + 2] =

new
CustomVertex.
PositionColored(
new
Vector3(star.X, star.Y + 1, star.Z),
Color.Yellow.ToArgb());Vertices[i + count + 3] =

new
CustomVertex.
PositionColored(
new
Vector3(star.X - 1, star.Y, star.Z),
Color.Yellow.ToArgb());Vertices[i + count + 4] =

new
CustomVertex.
PositionColored(
new
Vector3(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 =

new
VertexBuffer(
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);

}

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

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

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

public
void 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(

new
Vector3(1, 1, 30),

new
Vector3(100, 100, -10),

new
Vector3(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 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),
new
SolidBrush(
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(
new
Vector3(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 =
new
SEARCH(
this);


private
void button1_Click(
object sender,
EventArgs e)
{
search.list();


private
void button2_Click(
object sender,
EventArgs e){

search.list();

}

}

}

9 réponses

Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 7
9 févr. 2008 à 10:54
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.

<hr size="2" width="100%" />Julien.
3
asagran Messages postés 9 Date d'inscription jeudi 7 février 2008 Statut Membre Dernière intervention 11 février 2008
7 févr. 2008 à 16:34
pour faciliter la lecture j'ai stocké la source ici =>
http://cryptmaster.free.fr/test3D/STAR_HERO_TRANSFORMED.rar
0
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 7
7 févr. 2008 à 19:58
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.

<hr size="2" width="100%" />Julien.
0
asagran Messages postés 9 Date d'inscription jeudi 7 février 2008 Statut Membre Dernière intervention 11 février 2008
8 févr. 2008 à 12:17
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{

public
partial
class
Form1 :
Form{

// Notre device

private
Device device =
null;

// Notre VertexBuffer

private
VertexBuffer vBuffer;

// Nos Vertices

private
CustomVertex.
PositionColored[] Vertices;

// Initialisation de la form

public Form1(){

InitializeComponent();

// Appel de la procédure d'initialisation du device Direct3DInitializeGraphics();

CreateTriangle();

// Evènement pour la boucle de rendu

this.Paint +=
new
PaintEventHandler(
this.Render);}

// Procédure d'initialisation du device Direct3D

private
void InitializeGraphics(){

// Définition des PresentParameters

PresentParameters presentParams =
newPresentParameters();presentParams.Windowed true;presentParams.SwapEffect

SwapEffect.Discard;

// Creation de notre devicedevice =

new
Device(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(
new
Vector3(0, 0, -5),
new
Vector3(0, 0, 0),
new
Vector3(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

private
void CreateTriangle(){

Vertices =

new
CustomVertex.
PositionColored[3];Vertices[0] =

new
CustomVertex.
PositionColored(
new
Vector3(0f, 0f, 0f),
Color.Beige.ToArgb());Vertices[1] =

new
CustomVertex.
PositionColored(
new
Vector3(75.0f, 75.0f, 0.5f),
Color.Orange.ToArgb());Vertices[2] =

new
CustomVertex.
PositionColored(
new
Vector3(125.0f, 275.0f, 0.5f),
Color.Blue.ToArgb());

vBuffer =

new
VertexBuffer(
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 rendu

private
void 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(
new
Vector3(0, 0, -5),
new
Vector3(0, 0, 0),
new
Vector3(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();

}

}

}
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
asagran Messages postés 9 Date d'inscription jeudi 7 février 2008 Statut Membre Dernière intervention 11 février 2008
8 févr. 2008 à 12:19
ps: comment on affiche du code automatiquement indenté ici ? (ça ferait plus propre)
0
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 7
8 févr. 2008 à 13:29
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...

<hr size="2" width="100%" />Julien.
0
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 7
8 févr. 2008 à 17:44
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)

<hr size="2" width="100%" />Julien.
0
asagran Messages postés 9 Date d'inscription jeudi 7 février 2008 Statut Membre Dernière intervention 11 février 2008
9 févr. 2008 à 10:35
"device.RenderState.CullMode = Cull.None;device.RenderState.Lighting false;"> malheureusement j'ai déjà essayé, ça marche pô :(
0
asagran Messages postés 9 Date d'inscription jeudi 7 février 2008 Statut Membre Dernière intervention 11 février 2008
10 févr. 2008 à 13:50
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 :)
0
Rejoignez-nous