3DLightEngine Library preview

4 commentaires

Je mettrai bientôt à disposition une librairie opensource nommée LightEngine3D. Son but sera de résoudre de manière simple quelques scénarii d'utilisation d'interfaces 3D qui serait assez compliqué à gérer voir impossible directement avec la classe simplifiée PlaneProjection. Celle-ci est basée sur du calcul matricielle et par conséquent la structure Matrix3D. Je porterai également quelques méthodes de Matrix3D fournies par DirectX. Au programme backface culling Z, sorting automatic, Vector3D, Camera et peut-être lumière directionnelle, etc... C'est dans tous les cas un projet de longue haleine mais je n'ai pas non plus envie de faire une usine à gaz. L'idée principale est de créer un mini moteur 3D que vous pourrez facilement étendre par la suite.

Install Microsoft Silverlight

Le code utilisé pour créer ce projet est simpliste :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
//on définit un angle d'ouverture de 60°
double FovY = Matrix3DUtils.DegresToRadians(60); 
//image affichée par défaut
Uri BitmapUri= new Uri("Blend3_logo3.jpg", UriKind.Relative);
 
Element3D E3D;
 
Scene3D s;
 
public MainPage()
{
   // Required to initialize variables
   InitializeComponent();
 
   ResetBtn.Click += new RoutedEventHandler(ResetBtn_Click);
 
   E3D = new Element3D(MonUIElement);
 
   E3D.NormalDirectionChanged += new Element3D.DirectionChanged(E3D_NormalDirectionChanged);
 
   E3D.DotProductChanged += new Element3D.DirectionChanged(E3D_DotProductChanged);
 
   #region Personalize perspective and ViewPort
   /*
   Perspective p = new Perspective(FovY,		            //Angle d'ouverture
   LayoutRoot.ActualWidth / LayoutRoot.ActualHeight,   //Rapport largeur/hauteur
   1.0,                                                //La distance visible la plus proche 
   3000.0);                                            //La distance visible la plus éloignée
 
   Viewport v = new Viewport(LayoutRoot.ActualWidth, LayoutRoot.ActualHeight);
 
   s = new Scene3D(LayoutRoot, p, v);
   */
   #endregion
 
   #region Personalize clip plane
   /*
   s = new Scene3D(LayoutRoot, FovY,1,3000);
   */
   #endregion
 
   #region Personalize Field of view angle
   s = new Scene3D(LayoutRoot, FovY);
   #endregion
}
 
//produit scalaire du vecteur caméraObjet par le vecteur de l'axe z objet
void E3D_DotProductChanged(Element3D sender, int normalDirection)
{
   ProduitScalaireTxt.Text = sender.DotProduct.ToString();
}
 
//Lorsque la direction de la normal par rapport à la caméra change on réaffecte une image
void E3D_NormalDirectionChanged(Element3D sender, int normalDirection)
{
   DirectionTxt.Text = normalDirection.ToString();
   Uri BitmapUri = normalDirection == 1 ? new Uri("Blend3_logo3.jpg", UriKind.Relative) : new Uri("Blend3_logo.jpg", UriKind.Relative);
   MonUIElement.Source = new BitmapImage(BitmapUri);
}
 
//A chaque fois que la valeur du slider assurant la translation change on réaffecte
//celle-ci à la propriété adéquate du Element3D et on recalcule la scène
private void onTranslateXChange(object sender, RoutedPropertyChangedEventArgs<double> e)
{
   E3D.GlobalOffsetX = e.NewValue;
   s.RenderScene();
}
//
</double>

Il suffit d'utiliser la classe enveloppante Element3D et d'instancier une nouvelle scène. J'ajouterai très rapidement la classe ContainerElement3D. Par défaut l'objet n'est pas dans un container mais directement dans la Scene3D. Cet exemple montre qu'il est relativement simple d'étendre les capacités existantes de Silverlight en matière de 3D. La prochaine étape, porter une partie des fonctionnalités DirectX...

Bookmark and Share

4 Comments so far

  1. maru on September 5th, 2009

    ça envoie de la saucisse ! On veut un objet camera maintenant :)

  2. pepe323 on September 28th, 2009

    Cela ressemble beaucoup a ce que je suis en train de coder.
    Peux tu nous dire quand tu publiera le code source ?

  3. Eric Ambrosi on September 28th, 2009

    comme je suis en cours d’écriture d’un livre sur Silverlight, je ne peux pas m’y consacrer beaucoup en ce moment. je pense m’y remettre d’ici décembre et fournir la librairie en février. Je fais ça afin de me remettre doucement au mathématiques projectives mais également en vue de donner une librairie 3D facile d’utilisation pour la communauté… Peut-être pourrons-nous avoir plus d’échange à ce propos dans le futur :)

  4. [...] cours de construction, j’ai fais un article dessus disponible à l’adresse suivante : 3dlightengine-library-preview. « [...]

Leave a Reply

Security Code: