Bewegung der Kamera Directx

  • VB.NET

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

    Bewegung der Kamera Directx

    Hi leute, ich möchte in genau die richtung mit der Kamera gehen in die ich sie rotiere...
    wie kann ich das machen?
    Erst habe ich versuch das mit grad-zahlen zu realisieren, aber ohne erfolg..:/

    DEG*0,02222222222222222=StepX
    2-Stepx=StepY
    :D

    Danke für jeden Tipp!

    Hier noch der Code:

    VB.NET-Quellcode

    1. Imports Microsoft
    2. Imports Microsoft.DirectX
    3. Imports Microsoft.DirectX.Direct3D
    4. Imports Microsoft.DirectX.Direct3D.LightsCollection
    5. Imports Microsoft.DirectX.DirectPlay
    6. Public Class Form
    7. Dim Camerax As Integer
    8. Dim Cameraposx As Integer
    9. Dim Cameraposy As Integer
    10. Dim Cameraposz As Integer
    11. Dim Cameray As Integer
    12. Dim Cameray2 As Integer
    13. Dim Cameraz As Integer
    14. Private player As Mesh
    15. Private player_Textures() As Texture
    16. Private player_Materials() As Material
    17. Private m As Mesh
    18. Private m_Textures() As Texture
    19. Private m_Materials() As Material
    20. Dim Frames As Integer = 0
    21. Public Mouse As DirectInput.Device
    22. Public MouseState As DirectInput.MouseState
    23. Public KeyBoard As DirectInput.Device
    24. Public KeyBoardState As DirectInput.KeyboardState
    25. Public Camera As Camera
    26. Private VertexBuf As VertexBuffer
    27. Public Dev As Device 'Variable für DX Device
    28. Public Parameter As PresentParameters 'Parameter für das DX Device
    29. Sub Loadxfile(ByVal filename As String)
    30. Dim extMat() As ExtendedMaterial = Nothing
    31. m = Mesh.FromFile(filename, MeshFlags.Managed, Dev, extMat)
    32. ReDim m_Materials(extMat.Length - 1)
    33. ReDim m_Textures(extMat.Length - 1)
    34. For x As Integer = 0 To extMat.Length - 1
    35. m_Materials(x) = extMat(x).Material3D
    36. Dim exists As Integer = 1
    37. If exists = 1 Then
    38. m_Textures(x) = TextureLoader.FromFile(Dev, "C:\bild1.bmp")
    39. End If
    40. Next
    41. End Sub
    42. Public Sub initialsieren()
    43. Label2.Text = "Parameter der Engine"
    44. Parameter = New PresentParameters
    45. Parameter.Windowed = True ' Fenstermodus wird genutzt
    46. Parameter.SwapEffect = SwapEffect.Discard ' SwapEffect
    47. Parameter.EnableAutoDepthStencil = True ' Autotiefe
    48. Parameter.AutoDepthStencilFormat = DepthFormat.D16 ' Format der Autotiefe
    49. Label2.Text = "Starten der Device mit den Parametern"
    50. Dev = New Device(0, DeviceType.Hardware, Me.Handle, _
    51. CreateFlags.SoftwareVertexProcessing, Parameter)
    52. Label2.Text = "Camera"
    53. 'Ist noch in Arbeit
    54. Label2.Text = "Tastartur"
    55. KeyBoard = New DirectInput.Device(DirectInput.SystemGuid.Keyboard)
    56. KeyBoard.SetCooperativeLevel(Me, DirectInput.CooperativeLevelFlags.Background Or _
    57. DirectInput.CooperativeLevelFlags.NonExclusive)
    58. KeyBoard.Acquire()
    59. Label2.Text = "Maus"
    60. Mouse = New DirectInput.Device(DirectInput.SystemGuid.Mouse)
    61. Mouse.SetCooperativeLevel(Me, DirectInput.CooperativeLevelFlags.Background Or _
    62. DirectInput.CooperativeLevelFlags.NonExclusive)
    63. Mouse.Acquire()
    64. Label2.Text = "READY and OK"
    65. 'Lights
    66. Dev.RenderState.Lighting = True
    67. Dev.Lights(0).Type = LightType.Directional
    68. Dev.Lights(0).Diffuse = Color.WhiteSmoke
    69. Dev.Lights(0).Direction = New Vector3(0.8F, 0, -5)
    70. Dev.Lights(0).Enabled = True
    71. Cursor.Hide()
    72. End Sub
    73. Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
    74. Handles Me.Load
    75. initialsieren()
    76. load_xfiles()
    77. Timer1.Start()
    78. End Sub
    79. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) _
    80. Handles Timer1.Tick
    81. Frames += 1
    82. Label5.Text = Frames
    83. Dev.Clear(ClearFlags.Target Or ClearFlags.ZBuffer, Color.CornflowerBlue, 1, 0)
    84. Dev.RenderState.CullMode = Cull.Clockwise & Cull.CounterClockwise
    85. VertexBuf = New VertexBuffer(GetType(CustomVertex.PositionColored), 3, _
    86. Dev, Usage.None, _
    87. CustomVertex.PositionColored.Format, Pool.Default)
    88. Motion_Mouse()
    89. Motion_Keyboard()
    90. Keyboard_Events()
    91. updating()
    92. Dev.VertexFormat = CustomVertex.PositionColored.Format
    93. Dev.BeginScene()
    94. rendern()
    95. Dev.DrawPrimitives(PrimitiveType.TriangleList, 0, 1)
    96. Dev.EndScene()
    97. Dev.Present()
    98. End Sub
    99. Public Sub updating()
    100. Camera = New Camera(Dev, Me, 1, 50, _
    101. New Vector3(0, 0, 5), _
    102. New Vector3(Val(Camerax) / 80, Val(Cameray) / 80, Val(Cameraz) / 80))
    103. End Sub
    104. Public Sub Motion_Mouse()
    105. 'Maus auslesen mit Direct Input:
    106. MouseState = Mouse.CurrentMouseState
    107. Label10.Text = MouseState.X
    108. Label11.Text = MouseState.Y
    109. Label12.Text = MouseState.Z
    110. 'Neu Rendern der Camera Vektoren
    111. Label11.Text = Label11.Text * -1
    112. Camerax += Val(Label10.Text)
    113. Cameray += Val(Label11.Text)
    114. Cameraz += Val(Label12.Text)
    115. TextBox2.Text = Camerax
    116. TextBox3.Text = Cameray
    117. TextBox4.Text = Cameraz
    118. End Sub
    119. Public Sub Motion_Keyboard()
    120. KeyBoardState = KeyBoard.GetCurrentKeyboardState
    121. If KeyBoardState(DirectInput.Key.Left) Then
    122. Cameraposx += 1
    123. ElseIf KeyBoardState(DirectInput.Key.Right) Then
    124. End If
    125. End Sub
    126. Public Sub load_xfiles()
    127. 'Die Objeckte der Reihe nach laden
    128. For i As Integer = 0 To RichTextBox1.Lines.Count - 1 Step 1
    129. Loadxfile("C:\town.x")
    130. Next
    131. End Sub
    132. Public Sub rendern()
    133. For x As Integer = 0 To m_Materials.Length - 1
    134. Dev.SetTexture(0, m_Textures(x))
    135. Dev.Material = m_Materials(x)
    136. m.DrawSubset(x)
    137. Next
    138. End Sub
    139. Public Sub Keyboard_Events()
    140. If Timer1.Enabled = False Then
    141. Else
    142. If KeyBoardState(DirectInput.Key.Escape) Then
    143. Timer1.Stop()
    144. Cursor.Show()
    145. Timer2.Start()
    146. End If
    147. End If
    148. If KeyBoardState(DirectInput.Key.F1) Then
    149. Timer2.Stop()
    150. Cursor.Hide()
    151. Timer1.Start()
    152. End If
    153. End Sub
    154. Private Sub Timer2_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer2.Tick
    155. KeyBoardState = KeyBoard.GetCurrentKeyboardState
    156. Keyboard_Events()
    157. End Sub
    158. End Class
    Also 1. Maximal ein Timer verwenden, dann vor dem Rendern jedes mal Updaten(DirectInput prüfen Matrizen verändern usw...)
    Statt Timer kann man hier auch sehr gut eine While Schleife verwenden, da du außer dem Formular keinerlei Windows-Controls benötigst...
    Für die Kamerabewegung machst du follgendes:
    Du hast eine Kameraposition sowie eine Position, an welche die Kamera schaut(LookAt), die differenz aus diesen beiden bildet einen Richtungsvektor, welchen du bei der Bewegung nach vorne nur noch zur KameraPosition addieren musst(aufpassen, dass der LookAt Vektor sich auch in diese Richtung bewegt, sonst könnte es sein, dass sich die Kamera plötzlich um 180° dreht und du in die andere Richtung guckst und läufst...)

    Außerdem solltest du diesen Richtungsvektor noch normalisieren, dass er bei jeder Differenz immer dieselben Werte addiert(dass du immer gleich schnell läufst), diesen für den Fall, dass er zu klein ist(immer Werte zwischen -1 und 1) einfach mit einem Konstanten Wert multiplizieren...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    danke!
    LookAt habe ich nicht gefunden aber target.
    Wie soll ich das jetzt auf addieren ??

    VB.NET-Quellcode

    1. Camera = New Camera(Dev, Me, 1, 50, _
    2. New Vector3((Camera._pos.X - Camera._target.X), 0, 5), _
    3. New Vector3(Val(Camerax) / 80, Val(Cameray) / 80, Val(Cameraz) / 80))


    edit: muss ich die Werte in einer Variable zwischenspeichern um dann mit ihr zu addieren??

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „stefan15“ ()

    tut mir Leid, aber ich kenne deine Camera Klasse nicht, diese wird aber ziemlich sicher über LookAtLH/RH der Matrix-Klasse arbeiten und eben dort steht LookAt als Bezeichnung für den Parameter, aber ich denke Target wird wohl so ziemlich das gleich sein...
    Also bei einer Bewegung dürfte das so, oder so ähnlich aussehen:

    VB.NET-Quellcode

    1. dim richtungsvektor As Vector3 = Target - CameraPos
    2. richtungsvektor.Normalize()
    3. richtungsvektor.Multiply(speed)
    4. CameraPos += richtungsvektor
    5. 'Am besten Target auch noch vorschieben, da du sonst ab einer bestimmten Stelle einen unschönen Fehler bekommst(keine Fehlermeldung):
    6. Target += richtungsvektor

    Die Subtraktion der Beiden Vektoren bewirkt, dass die Position der Kamera sozusagen als Nullpunkt gilt, sodass Target uns nicht den Richtungsvektor zum ursprünglichen Nullpunkt gibt, sondern zur Kamera als Nullpunkt. Somit haben wir eine Richtung vorgegeben, in welche die Kamera sich anschließend auch bewegt...
    Normalize bewirkt, dass der Abstand zwischen Kamera und dem Zielpunkt egal sind, dadurch werden die Werte alle Normalisiert und sind zwischen -1 und 1.Insgesamt ergibt die Länge des Erhaltenen Vektors eine Länge von 1.

    speed gibt die Geschwindigkeit der Kamera an je größer, deste schneller...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    okay ich werde es noch mal so versuchen!

    hier noch meine Camera-Klasse

    VB.NET-Quellcode

    1. Imports Microsoft
    2. Imports Microsoft.DirectX
    3. Imports Microsoft.DirectX.Direct3D
    4. Public Class Camera
    5. Public _pos As Vector3
    6. Public _target As Vector3
    7. Public _DestCtrl As Object
    8. Public _NearPlane As Single
    9. Public _FarPlane As Single
    10. Public _dev As Device
    11. Protected up As New Vector3(0, 1, 0)
    12. Public view As Matrix
    13. Public projection As Matrix
    14. Sub New(ByVal dev As Device, ByVal destctrl As Control, ByVal NearPlane As Single, _
    15. ByVal FarPlane As Single, ByVal pos As Vector3, ByVal target As Vector3)
    16. view = Matrix.LookAtRH(pos, target, up)
    17. projection = Matrix.PerspectiveFovRH(Math.PI / 4, _
    18. destctrl.ClientSize.Width / _
    19. destctrl.ClientSize.Height, _
    20. NearPlane, FarPlane)
    21. dev.Transform.View = view
    22. dev.Transform.Projection = projection
    23. _pos = pos
    24. _target = target
    25. _DestCtrl = destctrl
    26. _NearPlane = NearPlane
    27. _FarPlane = FarPlane
    28. _dev = dev
    29. End Sub
    30. Public Property Position() As Vector3
    31. Get
    32. Return _pos
    33. End Get
    34. Set(ByVal value As Vector3)
    35. _pos = value
    36. update()
    37. End Set
    38. End Property
    39. Public Property Target() As Vector3
    40. Get
    41. Return _target
    42. End Get
    43. Set(ByVal value As Vector3)
    44. _target = value
    45. update()
    46. End Set
    47. End Property
    48. Public Sub update()
    49. view = Matrix.LookAtRH(_pos, _target, up)
    50. projection = Matrix.PerspectiveFovRH(Math.PI / 4, _
    51. _DestCtrl.ClientSize.Width / _
    52. _DestCtrl.ClientSize.Height, _
    53. _NearPlane, _FarPlane)
    54. _dev.Transform.View = view
    55. _dev.Transform.Projection = projection
    56. End Sub
    57. End Class