DirectX9 Kamera Problem

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von jonichecker.

    DirectX9 Kamera Problem

    So liebe Forenmitglieder

    könnt ihr mir bei folgendem Code helfen

    VB.NET-Quellcode

    1. Imports Microsoft.DirectXImports Microsoft.DirectX.Direct3D
    2. Public Class Form1 Public bmp As Texture Private device As Microsoft.DirectX.Direct3D.Device Public Sub Initialize() Dim present As PresentParameters = New PresentParameters present.Windowed = True 'we?ll draw on a window present.SwapEffect = SwapEffect.Discard 'discuss later device = New Microsoft.DirectX.Direct3D.Device(0, DeviceType.Hardware, Me, CreateFlags.HardwareVertexProcessing, present) device.RenderState.CullMode = Cull.Clockwise & Cull.CounterClockwise End Sub
    3. Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load Me.SetStyle(ControlStyles.AllPaintingInWmPaint Or ControlStyles.Opaque, True) 'Do not draw form?s background\ Me.Height = 600 Me.Width = 800 Me.Text = "HI!!"
    4. Initialize()
    5. End Sub
    6. Public yhigh As Integer = 31 Public richtung As Boolean = True
    7. Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    8. If richtung = True Then yhigh = yhigh + 1 Else yhigh = yhigh - 1
    9. End If
    10. If yhigh > 300 Then richtung = False End If
    11. If yhigh < 1 Then richtung = True End If
    12. Dim vertices1 As CustomVertex.TransformedColored() = New CustomVertex.TransformedColored(0 To 3) {} 'create an array of vertices vertices1(0).Position = New Vector4(150, 100, 0, 1) vertices1(0).Color = Color.Red.ToArgb 'encode color in Argb vertices1(1).Position = New Vector4(Me.Width / 2 + 100, 100, 0, 1) vertices1(1).Color = Color.Green.ToArgb vertices1(2).Position = New Vector4(250, 300, 50, 1) vertices1(2).Color = Color.Yellow.ToArgb
    13. Dim vertices2 As CustomVertex.TransformedColored() = New CustomVertex.TransformedColored(0 To 3) {} 'create an array of vertices vertices2(0).Position = New Vector4(Me.Width / 2 + 100, 100, 0, 1) vertices2(0).Color = Color.Green.ToArgb 'encode color in Argb vertices2(1).Position = New Vector4(Me.Width / 2 + 200, yhigh, 0, 1) vertices2(1).Color = Color.Red.ToArgb vertices2(2).Position = New Vector4(250, 300, 0, 1) vertices2(2).Color = Color.Yellow.ToArgb
    14. Dim vertices3 As CustomVertex.TransformedColored() = New CustomVertex.TransformedColored(0 To 3) {} 'create an array of vertices vertices3(0).Position = New Vector4(150, 100, 0, 1) vertices3(0).Color = Color.Green.ToArgb 'encode color in Argb vertices3(1).Position = New Vector4(Me.Width / 2 + 200, yhigh, 0, 1) vertices3(1).Color = Color.Red.ToArgb vertices3(2).Position = New Vector4(Me.Width / 2 + 100, 100, 0, 1) vertices3(2).Color = Color.Yellow.ToArgb device.Clear(ClearFlags.Target, Color.SteelBlue, 1.0, 0)
    15. Dim vertices4 As CustomVertex.TransformedTextured() = New CustomVertex.TransformedTextured(0 To 3) {} 'create an array of vertices vertices4(0).Position = New Vector4(399, 100, 0, 1)
    16. vertices4(1).Position = New Vector4(Me.Width / 2 + 300, yhigh, 0, 1)
    17. vertices4(2).Position = New Vector4(Me.Width / 2 + 300, 100, 0, 1)
    18. device.Clear(ClearFlags.Target, Color.SteelBlue, 1.0, 0)
    19. device.BeginScene() 'all drawings after this line camera() device.VertexFormat = CustomVertex.TransformedColored.Format device.SetTexture(0, bmp)
    20. device.DrawUserPrimitives(PrimitiveType.TriangleList, 1, vertices3) device.DrawUserPrimitives(PrimitiveType.TriangleList, 1, vertices4) device.DrawUserPrimitives(PrimitiveType.TriangleList, 1, vertices2)
    21. device.EndScene() 'all drawings before this line
    22. device.Present() Me.Invalidate() 'redraw
    23. End Sub
    24. 'kamera Public view As Matrix Public projection As Matrix
    25. Public Sub camera() Dim posi As New Vector3(400, 1, 1) Dim target As New Vector3(250, 300, 50) Dim up As New Vector3(0, 1, 0) view = Matrix.LookAtRH(posi, target, up) projection = Matrix.PerspectiveFovRH(Math.PI / 4, 1024, 768, 400) device.Transform.View = view device.Transform.Projection = projection
    26. End Sub
    27. 'End Class






    Ich komm mit der kamera net Klar
    kann mir jmd helfen und erklären was ich falsch mach?
    Tut mir leid dass es die formatierung so verzogen hier noch das projekt als datei
    Dateien
    • WorkingDX.zip

      (21,31 kB, 136 mal heruntergeladen, zuletzt: )
    du hast doch eine...
    du kannst eine Position festlegen, wo du hinguckst und eine wo du stehst(deine posi und target Variablen)...
    diese einfach global Deklarieren, sodass du diese von überall verändern kannst(Properties sind immer schön, auch die Möglichkeit einer Klasse wäre hier geboten...)

    die camera Methode rufst du dann jedes mal beim ändern dieser Variablen auf...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Dim posi As New Vector3(400, 1, 1) ' Da ist die Position der Kamera...
    Dim target As New Vector3(250, 300, 50)' dahin guckt die Kamera
    Dim up As New Vector3(0, 1, 0)
    view = Matrix.LookAtRH(posi, target, up)device.Transform.View = view

    du hast somit alles was du brauchst...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    So dass hier hab ich der initialisieren Code führt es aus
    aber es passiert nix!

    VB.NET-Quellcode

    1. Public Sub Kamera()
    2. Dim posi As New Vector3(400, 300, 3000) ' Da ist die Position der Kamera...
    3. Dim target As New Vector3(500, 300, 300) ' dahin guckt die Kamera
    4. Dim up As New Vector3(0, 1, 0)
    5. view = Matrix.LookAtRH(posi, target, up)
    6. device.Transform.View = view
    7. End Sub
    Hi,

    erstmal reicht die View-Matrix nicht aus. Du brauchst zusätzlich noch die Projektionsmatrix (erreichbar über device.Transform.Projection) - diese beschreibt das Sichtfeld deiner Kamera (angegeben in Radians), das Seitenverhältnis und die Near- und die FarPlaneDistance (über diese gibst du an, welche Distanz Vertices zur Kamera minimal bzw. maximal haben müssen, um dargestellt zu werden). Diese Matrix erstellst du übrigens über Matrix.PersepctiveFovLH (die View-Matrix sollte m.E. ebenfalls eine Matrix.LookAtLH sein, da DirectX ein Linkssystem verwendet). Zum zweiten machen wohl deine Vertices ebenfalls Probleme. Das Format CustomVertex.TransformColored gibt nämlich an, dass die Positionen der Vertices bereits in Bildschirmkoordinaten angegeben sind, also bereits durch die Matrizen transformiert sind. Eine erneute Transformation könnte zu seltsamen Ergebnissen führen...

    MfG
    bei deiner Sub camera(iim ersten Code) siehst du bereits eine Projektionsmatrix...die vertices bleiben wie sie sind...du musst einfach die camera Methode auch mal aufrufen...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---

    Gut hab die Lösung, hier der fertige Code

    hier der Code

    VB.NET-Quellcode

    1. Imports Microsoft.DirectX
    2. Imports Microsoft.DirectX.Direct3D
    3. Public Class Form1
    4. Public bmp As Texture
    5. Public Shared device As Microsoft.DirectX.Direct3D.Device
    6. Public Sub Initialize()
    7. Dim present As PresentParameters = New PresentParameters
    8. present.Windowed = True 'we?ll draw on a window
    9. present.SwapEffect = SwapEffect.Discard 'discuss later
    10. device = New Microsoft.DirectX.Direct3D.Device(0, DeviceType.Hardware, Me, CreateFlags.HardwareVertexProcessing, present)
    11. device.RenderState.CullMode = Cull.Clockwise & Cull.CounterClockwise
    12. device.RenderState.Lighting = False
    13. End Sub

    VB.NET-Quellcode

    1. Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    2. Me.SetStyle(ControlStyles.AllPaintingInWmPaint Or ControlStyles.Opaque, True) 'Do not draw form?s background\
    3. Me.Height = 600
    4. Me.Width = 800
    5. Me.Text = "HI!!"
    6. Initialize()
    7. Kamera()
    8. End Sub
    9. Public yhigh As Integer = 31
    10. Public richtung As Boolean = True
    11. Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    12. If richtung = True Then
    13. yhigh = yhigh + 1
    14. Else
    15. yhigh = yhigh - 1
    16. End If
    17. If yhigh > 300 Then
    18. richtung = False
    19. End If
    20. If yhigh < 1 Then
    21. richtung = True
    22. End If
    23. Dim vertices1 As CustomVertex.PositionColored() = New CustomVertex.PositionColored(0 To 2) {} 'create an array of vertices
    24. vertices1(0).Position = New Vector3(150, 100, 50)
    25. vertices1(0).Color = Color.Red.ToArgb 'encode color in Argb
    26. vertices1(1).Position = New Vector3(Me.Width / 2 + 100, 100, 0)
    27. vertices1(1).Color = Color.Green.ToArgb
    28. vertices1(2).Position = New Vector3(250, 300, 50)
    29. vertices1(2).Color = Color.Yellow.ToArgb
    30. device.Clear(ClearFlags.Target, Color.Aqua, 1.0, 0)
    31. device.BeginScene() 'all drawings after this line
    32. device.VertexFormat = CustomVertex.PositionColored.Format
    33. device.DrawUserPrimitives(PrimitiveType.TriangleList, 1, vertices1)
    34. device.EndScene() 'all drawings before this line
    35. device.Present()
    36. Me.Invalidate() 'redraw
    37. End Sub

    VB.NET-Quellcode

    1. 'kamera
    2. Public Shared view As Matrix
    3. Public Sub Kamera()
    4. Dim posi As New Vector3(1000, 10, 10) ' Da ist die Position der Kamera...
    5. Dim target As New Vector3(250, 300, 50) ' dahin guckt die Kamera
    6. Dim up As New Vector3(0, -1, 0)
    7. Dim projection As Matrix = Matrix.PerspectiveFovRH(Math.PI / 4,Me.ClientSize.Width /me.ClientSize.Height, 1, 8000)
    8. view = Matrix.LookAtRH(posi, target, up)
    9. device.Transform.View = view
    10. device.Transform.Projection = projection
    11. End Sub
    12. '
    13. End Class