Managed DirectX.D3D Problem

06/17/2012 00:54 Jeoni#1
Hallo Community,
ich beschäftige mich momentan ein bisschen mit managed D3D. Hab mir dazu ein Tutorial angesehen und die Source nachgebaut (bzw. kopiert). Hat auch alles einwandfrei funktioniert. Im Tutorial wurde mit zwei Würfeln gearbeitet (jeder bestehend aus 12 Dreiecken --> 36 Punkte).
Ich wollte dann mich mal selber testen und wollte eine sich drehende Pyramide machen. Die Pyramide besteht aus 6 Dreiecken (2 für die Grundfläche und für jede Mantelfläche je eines), also 18 Punkten. Ich habe (meines erachtens nach sogar richtig) die Koordinaten angegeben und jeden Schritt aus dem Tutorial in meine eigene Source mit eingebaut. Das Problem ist nun, dass es nicht funktioniert. Es kommt zwar der schwarze Hintergrund (Device richtig initialisiert?), aber es taucht einfach keine Pyramide auf.
Jetzt bin ich echt am verzweifeln (es gibt ja nicht einmal eine Fehlermeldung nach der man googlen könnte), weil ich einfach keinen Fehler finde. :(
Ich hoffe jetzt auf irgendeinen guten .net Programmierer, der den Fehler findet (wahrscheinlich ist der so einfach, dass ich mir am liebsten die Tastatur gegen den Kopf hauen würde :D ).

Tutorial Source:

Meine Source:
Auch wenn ich in meinem Sourcecode etwas anders auf die Klasse, welche sich mit D3D beschäftigt zugegriffen habe, sollte es doch trotzdem funktionieren.

Für beide Quellcodes wurden (je die selben) Teile der managed Developer Runtime vom DirectX SDK August 2007 als Referenz mit eingebunden.

Hoffend, dass mir jemand helfen kann :)
Jeoni

P.S.: Ich möchte keine Kommentare wie "VB.net suckt, nimm C#" o.ä. lesen. Die beiden Sprachen unterscheiden sich (grob) nur in der Syntax.
Desweiteren ist mir natürlich bekannt, dass managed D3D unperformanter ist, als unmanaged D3D und dass .net Sprachen blöd sind. Das muss nicht weiter erörtert oder erwähnt werden ;)
Also bitte nur Lösungsvorschläge zum Problem posten und nichts derart Allgemeines, danke.
06/17/2012 02:19 boxxiebabee#2
Quote:
Originally Posted by Jeoni View Post
und dass .net Sprachen blöd sind.
:O

Deswegen seh ich mir nichtmal den Source im Spoiler an.
Auch wenn ich nicht oft Desktop Apps mache, finde ich .NET super für Anwendungssoftware.
06/17/2012 10:00 Jeoni#3
Das ist auch nur zum Teil meine Meinung. Ich finde .net auch relativ ok, solange man damit keine großen, performanten Programme machen will.
Ich wollte das nur anbringen, damit hier niemand sagt ".net ist blöd, weil unperformant, nimm C/C++" ;)
Denn bei D3D kann man solche Sprüche grundsätzlich schon erwarten.
06/17/2012 14:02 x]vIrus[x#4
managed directx wird nicht mehr weiterentwickelt und wurde quasi von MS mit XNA abgelöst, XNA jedoch "steht" in der entwicklung im Moment auch (nur directx9, vermutlich wegen der xbox) ich empfehle daher dir SlimDX mal anzuschauen, bevor du dich zu sehr an MDX o.ä. gewohnt hast ^^

dies soll kein "X ist scheiße, nimm Y" spam sein, sondern lediglich ein hinweis
06/17/2012 15:50 Jeoni#5
Danke für den Hinweis. Wusste ich auch schon (DX SDK August 2007 war das letzte SDK mit managed Support). Ich will lediglich mal in MS DX reinschauen. Viel machen werde ich damit nicht. Vielleicht sehe ich mir später auch mal XNA oder SlimDX an. ;)

Ich hoffe, dass bald jemand den / die Fehler findet.
MfG
06/18/2012 19:04 x]vIrus[x#6
uppe ma bitte das projekt als zip oder rar, dann schau ichs mir an :p
06/18/2012 20:48 Jeoni#7
Kein Problem.
[Only registered and activated users can see links. Click Here To Register...]
[Only registered and activated users can see links. Click Here To Register...]
[Only registered and activated users can see links. Click Here To Register...] (aus dem DirectX SDK August 2007)
Auf Virenscans verzichte ich erstmal (es geht ja nur um Sources). Wenn du mir nicht traust, lösche meine Vorkompilierten exe Dateien und lad dir das original DXSDK von Microsoft runter ;)
Danke, dass du mir versuchst zu helfen und viel Erfolg :)
Jeoni
06/18/2012 22:32 x]vIrus[x#8
hi, dein problem war relativ einfach, jedoch habe ich dort zuletzt gesucht ^^

im anhang dein Archiv, im prinzip musst du noch was über matrizenmultiplikation lernen ^^

effektiv hast du deine pyramide durch die fehlerhafte implementierung der multiplikation einfach außerhalb des sichtbaren bereiches gezeichnet
06/18/2012 23:02 Jeoni#9
Alles klar, vielen Dank. :)
Aber am anfang waren die Rotationen doch gar nicht "an". Da wurde die fehlerhafte Matrizenmultiplikation doch gar nicht ausgeführt, oder?
Mein Fehler war, soweit ich das jetzt im Vergleich beurteilen kann, dass ich keine "Startpostition" der Pyramidenmatrix festgelegt habe, was in dem korrigierten Code durch Matrix.Identity geschafft ist. Ist es nicht besser diese "Startposition" ganz am Anfang (vor der While-Schleife in der RenderLoop-Sub) zu setzen, statt jeden Frame neu? Wie ist das in der Tutorial Source gelöst worden? Ich sehe da nichts Vergleichbares. Da wird die Matrix "einfach so" multipliziert, ohne Startposition oder ähnliches. Und wie kommt es dann zu stande, dass die beiden Würfel nebeneinander sind und nicht irgendwie ineinander stecken?
Hoffe, dass du mir weiterhelfen kannst :D
Jeoni

/Edit: Ich hab noch ein paar Makel entdeckt (eher von der Schönheitssorte, nichts Gravierendes).
Meine Animation Sub sieht nun so aus:
Die Startpositionszuweisung hab ich vor der While-Schleife der RenderLoop Sub gepackt. Ich hoffe, dass das keine Fehler sind. :D
06/20/2012 23:20 x]vIrus[x#10
also im tut verursacht das hier die verschiebung:
p_MatCube2 = Matrix.Multiply(Matrix.RotationY(cubeangle), _
Matrix.Translation(-5, 0, 0))

Tanslation

Warum du keine Rotation gesehen hast ist, weil du quasi (wenn wir jetzt mal von matrix weggehen) 0 x 10 gemacht hast, deine matrix ist überall 0, und egal was man mit 0 multipliziert, es ergibt immer 0. da eine matrix auch gleichzeitig die größe repräsentiert, hast du eine pyramide mit der größe 0 und der position 0 mit der rotation 0 an der position 0 gezeichnet ;)

das tutorial multipliziert 2 rotationsmatrizen miteinander, beide haben die größe 1, nur eine andere rotation, also siehst du deine pyramide

schönheitsfehler im code kannst du behalten, ich war froh, dass ich den syntax für ne if else if else bedingung herausgefunden hab :P VB syntax *würg*
06/24/2012 16:31 Jeoni#11
Alles klar, vielen Dank. Nun habe ich ein weitere Problem:
Ich wollte mal schrift zeichnen und in diversen Tutorials ist erklärt, dass man dafür das Direct3D.Font Objekt benötigt. Leider findet er das bei mir nicht.
Code:
Imports Microsoft.DirectX.Direct3d
Imports Microsoft.DirectX
...
Dim moDevice As Device 'Funktioniert
Dim moDevice2 As Direct3D.Device 'Funzt auch
Dim moFont As Font 'Funktioniert nicht
Dim moFont As Direct3D.Font 'ebenfalls nicht
Benutzen tu ich das DirectX SDK von August 2007 und auch in der beiliegenden Documentation ist das Font-Objekt aufgeführt, aber im Code scheint es nicht existent zu sein. Er schlägt mir daher auch nicht vor, wenn ich schon "Direct3D.F" geschrieben habe, dass es mit ".Font" sein könnte.
Kann mir wer helfen?
MfG
Jeoni