asagran
Messages postés9Date d'inscriptionjeudi 7 février 2008StatutMembreDernière intervention11 février 2008
-
7 févr. 2008 à 16:29
asagran
Messages postés9Date d'inscriptionjeudi 7 février 2008StatutMembreDernière intervention11 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 =>
// 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;
Julien237
Messages postés883Date d'inscriptionvendredi 3 novembre 2000StatutMembreDernière intervention 3 mars 20097 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.
asagran
Messages postés9Date d'inscriptionjeudi 7 février 2008StatutMembreDernière intervention11 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);}
Julien237
Messages postés883Date d'inscriptionvendredi 3 novembre 2000StatutMembreDernière intervention 3 mars 20097 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...
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)