3D *.x dateien einbinden II

  • VB.NET

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von stefan15.

    3D *.x dateien einbinden II

    Hi Leute ich weiß dieses Thema ist schon öfter vorhanden, aber bei keinem habe ich eine Funktionierenden Lösungsansatz gefunden.
    Ich möchte in einer Windows-Form eine *.x datei laden und dann mit hilfe von DX rendern. Das Tutorial von Devtronik habe ich gelesen und so auch meine erste DX anwendung geschrieben. Soweit funktioniert auch alles, nur eben das Einfügen der Datei in das bestehende Programm nicht.
    Danke schon mal im vorraus!

    Stefan
    Das läuft ja über die Mesh Klasse...
    Und über die Mesh.FromFile Funktion lädst du das...
    Hier mal komplett aus dem Kopf:

    VB.NET-Quellcode

    1. Private m As Mesh
    2. Private m_Textures() As Texture
    3. Private m_Materials() As Material
    4. Sub Load(filename As String)
    5. Dim extMat() As ExtendedMaterial = Nothing
    6. m = Mesh.FromFile(filename,Managed,DEVICE,extMat)
    7. For x As Integer = 0 To extMat.Length -1
    8. m_Materials(x) = extMat(x).Material3D
    9. If IO.File.Exists(extMat(x).TextureFilename) Then
    10. m_Textures(x) = TextureLoader.FromFile(DEVICE,extMat(x).TextureFilename)
    11. End If
    12. Next
    13. End Sub
    14. Sub Draw()
    15. For x As Integer = 0 To m_Materials.Length -1
    16. DEVICE.SetTexture(0,m_Textures(x))
    17. DEVICE.Material = m_Materials(x)
    18. m.DrawSubset(x)
    19. Next
    20. End SUb

    Denke das stimmt so weit(Namespaces musste noch selbst rausfinden :P)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Hey,

    kann es sein, dass du nur die "Microsoft.DIrectX.Direct3D.dll", aber nicht die "Microsoft.DirectX.Direct3DX.dll" eingebunden hast? Die brauchst du nämlich auch, sie stellt Klassen wie eben z.B. die Mesh-Klasse zur Verfügung.

    MfG
    Turtle10
    Achja verwende die neuste Version der Direct3DX.dll sonst könntest du einige Probleme geben(zweimal darfste raten, warums davon so viele Versionen gibt...xD)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Hey,

    hast du vielleicht versucht, den Namespace "Microsoft.DirectX.Direct3DX" zu importieren? Den gibt es nämlich nicht... Alle Klassen der "Microsoft.DirectX.Direct3DX" stecken nämlich im Namensraum "Microsoft.DirectX.Direct3D"...

    MfG
    Turtle10
    Ok da hab ich nun doch noch einen Hänger. Ich möchte nun die Figur (panzerUSA1.x) darstellen.
    Mit m.drawsubset(x) geht es wohl nicht giebt es eine Möglichkeit das Mesh direkt an die Device zu übergeben???
    Hier mal mein Kompletter Code: (Das 3-Eck aus dem Tut ist noch drinn)


    VB.NET-Quellcode

    1. Imports Microsoft
    2. Imports Microsoft.DirectX
    3. Imports Microsoft.DirectX.Direct3D
    4. Public Class Form
    5. Private m As Mesh
    6. Private m_Textures() As Texture
    7. Private m_Materials() As Material
    8. Dim Frames As Integer = 0
    9. Public Mouse As DirectInput.Device
    10. Public MouseState As DirectInput.MouseState
    11. Public KeyBoard As DirectInput.Device
    12. Public KeyBoardState As DirectInput.KeyboardState
    13. Dim Camera As Camera
    14. Private VertexBuf As VertexBuffer
    15. Public Dev As Device 'Variable für DX Device
    16. Public Parameter As PresentParameters 'Parameter für das DX Device
    17. Sub Loadxfile(ByVal filename As String)
    18. Dim extMat() As ExtendedMaterial = Nothing
    19. m = Mesh.FromFile(filename, MeshFlags.Managed, Dev, extMat)
    20. For x As Integer = 0 To extMat.Length - 1
    21. m_Materials(x) = extMat(x).Material3D
    22. If IO.File.Exists(extMat(x).TextureFilename) Then
    23. m_Textures(x) = TextureLoader.FromFile(Dev, extMat(x).TextureFilename)
    24. End If
    25. Next
    26. End Sub
    27. Sub Draw()
    28. For x As Integer = 0 To m_Materials.Length - 1
    29. Dev.SetTexture(0, m_Textures(x))
    30. Dev.Material = m_Materials(x)
    31. m.DrawSubset(x)
    32. Next
    33. End Sub
    34. Public Sub initialsieren()
    35. Label2.Text = "Parameter der Engine"
    36. Parameter = New PresentParameters
    37. Parameter.Windowed = True ' Fenstermodus wird genutzt
    38. Parameter.SwapEffect = SwapEffect.Discard ' SwapEffect
    39. Parameter.EnableAutoDepthStencil = True ' Autotiefe
    40. Parameter.AutoDepthStencilFormat = DepthFormat.D16 ' Format der Autotiefe
    41. Label2.Text = "Starten der Divice mit den Parametern"
    42. Dev = New Device(0, DeviceType.Hardware, Me.Handle, _
    43. CreateFlags.SoftwareVertexProcessing, Parameter)
    44. ' Form1 als Besitzer und Sonstige Infos festlegen
    45. Label2.Text = "Camera"
    46. Camera = New Camera(Dev, Me, 1, 50, _
    47. New Vector3(0, 0, 5), _
    48. New Vector3(0, 0, 0))
    49. Label2.Text = "Tastartur"
    50. KeyBoard = New DirectInput.Device(DirectInput.SystemGuid.Keyboard)
    51. KeyBoard.SetCooperativeLevel(Me, DirectInput.CooperativeLevelFlags.Background Or _
    52. DirectInput.CooperativeLevelFlags.NonExclusive)
    53. KeyBoard.Acquire()
    54. Label2.Text = "Maus"
    55. Mouse = New DirectInput.Device(DirectInput.SystemGuid.Mouse)
    56. Mouse.SetCooperativeLevel(Me, DirectInput.CooperativeLevelFlags.Background Or _
    57. DirectInput.CooperativeLevelFlags.NonExclusive)
    58. Mouse.Acquire()
    59. Label2.Text = "READY and OK"
    60. End Sub
    61. Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
    62. Handles Me.Load
    63. initialsieren()
    64. Loadxfile("C:\panzerUSA1.x")
    65. Draw()
    66. Timer1.Start()
    67. End Sub
    68. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) _
    69. Handles Timer1.Tick
    70. Frames += 1
    71. Label5.Text = Frames
    72. MouseState = Mouse.CurrentMouseState
    73. If MouseState.X <> 0 Or MouseState.Y <> 0 Then
    74. Camera.Position += New Vector3(MouseState.X / _
    75. Screen.PrimaryScreen.WorkingArea.Width, _
    76. MouseState.Y / _
    77. Screen.PrimaryScreen.WorkingArea.Height, 0)
    78. End If
    79. KeyBoardState = KeyBoard.GetCurrentKeyboardState
    80. Dev.Clear(ClearFlags.Target Or ClearFlags.ZBuffer, Color.CornflowerBlue, 1, 0)
    81. Dev.RenderState.Lighting = False
    82. Dev.RenderState.CullMode = Cull.Clockwise & Cull.CounterClockwise
    83. VertexBuf = New VertexBuffer(GetType(CustomVertex.PositionColored), 3, _
    84. Dev, Usage.None, _
    85. CustomVertex.PositionColored.Format, Pool.Default)
    86. Dim vertex As CustomVertex.PositionColored() = _
    87. CType(VertexBuf.Lock(0, LockFlags.None), CustomVertex.PositionColored())
    88. vertex(0) = New CustomVertex.PositionColored(0, 1, 0, Color.Blue.ToArgb)
    89. vertex(1) = New CustomVertex.PositionColored(1, -1, 1, Color.Red.ToArgb)
    90. vertex(2) = New CustomVertex.PositionColored(-1, -1, 1, Color.Green.ToArgb)
    91. VertexBuf.Unlock()
    92. Dev.SetStreamSource(0, VertexBuf, 0)
    93. Dev.VertexFormat = CustomVertex.PositionColored.Format
    94. Dev.BeginScene()
    95. Dev.DrawPrimitives(PrimitiveType.TriangleList, 0, 1)
    96. Dev.EndScene()
    97. Dev.Present()
    98. If KeyBoardState(DirectInput.Key.PageUp) Then
    99. Dev.Transform.World *= Matrix.RotationZ((TextBox1.Text))
    100. End If
    101. If KeyBoardState(DirectInput.Key.PageDown) Then
    102. Dev.Transform.World *= Matrix.RotationZ("-" & (TextBox1.Text))
    103. End If
    104. If KeyBoardState(DirectInput.Key.Left) Then
    105. Dev.Transform.World *= Matrix.RotationY("-" & (TextBox1.Text))
    106. End If
    107. If (KeyBoardState(DirectInput.Key.Right)) Then
    108. Dev.Transform.World *= Matrix.RotationY((TextBox1.Text))
    109. End If
    110. If (KeyBoardState(DirectInput.Key.Up)) Then
    111. Dev.Transform.World *= Matrix.RotationX((TextBox1.Text))
    112. End If
    113. If (KeyBoardState(DirectInput.Key.Down)) Then
    114. Dev.Transform.World *= Matrix.RotationX("-" & (TextBox1.Text))
    115. End If
    116. End Sub
    117. End Class[vb]
    [/vb]
    Das funktioniert sehr wohl, du rufst nur wohl die Draw-Methode an der falschen Stelle auf...Das musst du zwischen Device.BeginScene und EndScene setzen ;)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Ok, danke (hätte ich auch selbst drauf kommen können)!
    Nur noch mal zur klarstellung, damit ich hier nichts falsches versuche, frage:
    Ich erstelle eine Figur die mir einer Textur umgeben ist.
    Die Textur ist dann hier:
    m_Textures(x) = TextureLoader.FromFile(Dev, extMat(x).TextureFilename)
    festgelegt.??
    jop so kann mans sehen...
    Das Mesh ist in verschiedene Teilstücke unterteilt, dabei werden einmal unterschiedliche Materialien getrennt und das andere mal die unterschiedlichen Objekte...
    Zu einem Material muss aber keine Textur festgelegt sein(das bleibt somit Nothing), aber wenn es eine Textur gibt, wird es an der von dir genannten Stelle geladen...
    die Draw-Methode durchläuft alle Teilstücke, legt Textur und Materialien fest, die angezeigt werden und zeichnet das entsprechende Teilstück über den Index per drawSubset...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Ok, wenn ich nun einen Würfel rendern möchte muss ich ihm neben dem .x file noch eine z.B. grüne .bmp erstellen und diese dann als material festlegen?
    Ich habe schon versucht ein Material über einen File anzugeben aber dennoch kommt der error.
    Es dürfte kein Error kommen, außerdem muss man keine Texturen angeben, die Materialien kannst du ebenfalls manuell festlegen, sofern du das möchtest, um evtl. im nachhinein etwas einzufärben oder dynamisch zu machen...
    Hier wo du die Texture Manuell eingefügt hast, wird aber geguckt, ob die Texture, welche im X-File geschrieben steht vorhanden ist, du solltest aber nach deiner eigenen Schauen...

    Und Allgemein: Material != Texture ;)

    Du hast erst jetzt von einem Fehler geschrieben?! Wie lautet dieser denn?
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    ich habe folgenden code:

    VB.NET-Quellcode

    1. Dim extMat() As ExtendedMaterial = Nothing
    2. m = Mesh.FromFile(filename, MeshFlags.Managed, Dev, extMat)
    3. For x As Integer = 0 To extMat.Length - 1
    4. m_Materials(x) = extMat(x).Material3D
    5. m_Textures(x) = TextureLoader.FromFile(Dev, "C:\Texture\würfel.bmp")
    6. Next


    ich würde schon gerne im 3D-Programm schon die Materialien festlegen. Das Problem ist nur das ich bei dem Würfel das Material nicht einbinden musste sondern auf eine Farbe zugegriffen habe, welche so verfügbar war. Kannst du mir eventuell ein beispiel für das einsetzten eines Materials zeigen, dass nicht so eingebunden ist sondern extern in einem Ordner auf der Platte ist. Ich meine damit nicht das ich nun bei jedem Objekt in vb erst festlegen will wie er aussieht sondern nur die Material Ressouce Extern ist. Irgentwie bin ich da auf dem falschen Weg...
    Beim Exportieren in das .X Format wird das Material automatisch in der X-Datei gespeichert, es sei denn du hast nen schlechten Exporter^^

    Edit: Du hast immer noch nicht den Fehler genannt, oder wars das etwa? Du siehst nichts?->Dann musst du wohl mal die World Transformationen, oder View-Transformationen anpassen...Per BoundingBox könntest du auch gucken wie groß das Objekt im Endeffekt wird ;)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    also ich habe nun alles so definiert:

    VB.NET-Quellcode

    1. Dim extMat() As ExtendedMaterial = Nothing
    2. m = Mesh.FromFile(filename,Managed,DEVICE,extMat)
    3. For x As Integer = 0 To extMat.Length -1
    4. m_Materials(x) = extMat(x).Material3D
    5. If IO.File.Exists(extMat(x).TextureFilename) Then
    6. m_Textures(x) = TextureLoader.FromFile(DEVICE,extMat(x).TextureFilename)
    7. End If
    8. Next

    wenn ich nun einen Würfel erstelle (3D Programm) gehen dann diese einstellungen? :
    Vertex Color [ja]
    Normal Vector [ja]
    Visible Objects only [nein]
    UV Mapping [ja]
    ?(

    Edit: Der Error tritt bei
    m_Materials(x) = extMat(x).Material3D
    auf