Bonjour,
Je débute en DirectX (via VB.NET), et je rencontre un problème :
lorsque je fais un device.Transform.World.RotateY(), je ne vois aucune rotation à l'écran, et je ne comprends pas pourquoi.
Pourriez vous m'aider, s'il vous plait?
Version imprimable
Bonjour,
Je débute en DirectX (via VB.NET), et je rencontre un problème :
lorsque je fais un device.Transform.World.RotateY(), je ne vois aucune rotation à l'écran, et je ne comprends pas pourquoi.
Pourriez vous m'aider, s'il vous plait?
peux tu mettre tout ton code, je connais pas le vb et sur la ligne que tu as écrit, je comprend que dalle au chainage que tu fais ><
Oki, alors voilà :
Code:
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 Imports Microsoft.DirectX Imports Microsoft.DirectX.Direct3D Public Class Form1 Dim device As Device Dim present As New PresentParameters Dim triangle(3) As CustomVertex.TransformedColored Dim buff As VertexBuffer Dim sens As Integer = 1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.SetStyle(ControlStyles.AllPaintingInWmPaint Or ControlStyles.Opaque, True) Initialisation() creationTriangle() End Sub Public Sub Initialisation() present.Windowed = True present.SwapEffect = SwapEffect.Discard device = New Device(0, DeviceType.Hardware, Me, CreateFlags.SoftwareVertexProcessing, present) End Sub Public Sub creationTriangle() triangle(0).Color = Color.Red.ToArgb triangle(0).Position = New Vector4(100, 1, 0, 1) triangle(1).Color = Color.Orange.ToArgb triangle(1).Position = New Vector4(200, 0.866 * 200, 0, 1) triangle(2).Color = Color.Yellow.ToArgb triangle(2).Position = New Vector4(1, 0.866 * 200, 0, 1) End Sub Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint device.RenderState.Lighting = False device.RenderState.CullMode = Cull.None device.Clear(ClearFlags.Target, Color.DarkBlue, 1.0, 0) device.BeginScene() device.Transform.World.RotateY(2) 'Rotations de 2radians par exemple device.VertexFormat = CustomVertex.TransformedColored.Format device.DrawUserPrimitives(PrimitiveType.TriangleList, 1, triangle) device.EndScene() device.Present() Me.Invalidate() End Sub End Class
je suppose (vu que j'ai pas ce qu'il faut pour tester du vb) que device.Transform.World.RotateY(2) ne multiplie pas World par une nouvelle matrice de rotation, et c'est ça le problème.
- soit tu déclare une variable angle que tu incrémente au fil du temps et tu fais :
device.Transform.World.RotateY(angle).
- soit tu récupère World, tu créé une autre matrice avec ton Rotate(2) et à chaque tour de boucle tu multiplie World par cette matrice.
Erf cela n'a pas l'air de fonctionner :s
peux tu expliciter plus ce qui ne va pas?
Il n'y a aucune erreur, mais le triangle reste tel quel
sur ce coup là je sais pas, qu'importe comment je regarde je comprend pas le code ><
désolé
Ok, merci quand même ;)
Bonjour, je ne connais pas bien VB mais il me semble qu'il n'y ait pas de boucle d'affichage dans ton code, autrement dit comme tu n'appelles qu'une fois paint tu vois ton triangle affiché avec la rotation de 2 radians puis c'est fini.
Salut smirnoff_933k je ne suis pas encore tout à fait spécialiste de Direct3d et encore moins de Dx Managed mais tu ne sembles pas définir de matrice de vue et de matrice de projection.
Tu fais une transformation sur la matrice World seulement !Code:
1
2 device.Transform.World.RotateY(2) 'Rotations de 2radians par exemple
Si tu veux faire de la programmation D3d il est indispensable de consulter la doc du SDK de Direct X
Regarde dans les tutos ( Managed DX ) et notamment le tutorial 3 , fichier matrice.cs
SetupMatricesest appelée juste après Device.BeginScene() dans la fonction de renduCode:
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 private void SetupMatrices() { // For our world matrix, we will just rotate the object about the y-axis. // Set up the rotation matrix to generate 1 full rotation (2*PI radians) // every 1000 ms. To avoid the loss of precision inherent in very high // floating point numbers, the system time is modulated by the rotation // period before conversion to a radian angle. int iTime = Environment.TickCount % 1000; float fAngle = iTime * (2.0f * (float)Math.PI) / 1000.0f; device.Transform.World = Matrix.RotationY( fAngle ); // Set up our view matrix. A view matrix can be defined given an eye point, // a point to lookat, and a direction for which way is up. Here, we set the // eye five units back along the z-axis and up three units, look at the // origin, and define "up" to be in the y-direction. device.Transform.View = Matrix.LookAtLH( new Vector3( 0.0f, 3.0f,-5.0f ), new Vector3( 0.0f, 0.0f, 0.0f ), new Vector3( 0.0f, 1.0f, 0.0f ) ); // For the projection matrix, we set up a perspective transform (which // transforms geometry from 3D view space to 2D viewport space, with // a perspective divide making objects smaller in the distance). To build // a perpsective transform, we need the field of view (1/4 pi is common), // the aspect ratio, and the near and far clipping planes (which define at // what distances geometry should be no longer be rendered). device.Transform.Projection = Matrix.PerspectiveFovLH( (float)Math.PI / 4, 1.0f, 1.0f, 100.0f ); }
Alors Smirnoff as-tu résolu le problème ?
Si oui ce serait bien de le préciser et mettre résolu