Hallo, noch ein Beitrag von mir, vielleicht interessiert sich ja doch jemand für die Programmierung von dreidimensionalen GUIs wie ich das gerade tue.
Ich habe jetzt eine primitive Tastatur-Steuerung eingebaut, mit der ich mich drehen und zumindest in der Ebene in jede Richtung gehen kann. Dazu errechne ich in einem Kreis eine beliebige Anzahl von Punkten, z.B. 120, und merke sie mir als Vektoren in einer Liste. Mit den Pfeiltasten rechts und links ändere ich die camera.LookDirection immer auf den nächstliegenden Vektor rechts oder links. So kann ich mich drehen.
Um den Blick nach oben oder unten zu schwenken ändere ich camera.LookDirection.Y in drei Stufen ab. Das ist natürlich gemogelt, eigentlich müsste man wohl mit einer Rotationsmatrix arbeiten, damit auch in der Y-Richtung ein ganzer Kreis von Punkten entsteht. Da traue ich mich aber nicht ran, ich bin kein Mathematiker.
Um mich fortzubewegen muss ich nur den Vektor im Kreis, auf den ich gerade gucke, zu meiner aktuellen Position hinzurechnen. Ich steuere das mit Shift+Pfeiltasten, wobei ich vorwärts, rückwärts und seitwärts gehen bzw. fliegen kann.
Das ganze funktioniert natürlich etwas ruckartig, wobei die Bewegungen bei gehaltener Pfeiltaste eigentlich ganz flüssig sind. Ich kann auf jeden Fall meine dreidimensionalen Objekte von allen Seiten umfliegen, wenn auch nicht in Kurven.
Ich würde mir jetzt noch wünschen das ganze auch mit der Maus bedienen zu können. Hat jemand eine Idee, wie ein sinnvolle Steuerung mit der Maus überhaupt funktionieren müsste? Ich kenne mich mit Spielen nicht aus, wie wird denn normalerweise eine Bewegung mit der Maus gesteuert?
Hier die Funktion, mit der ich die Punkte im Kreis berechne. Der Radius sollte der gewünschten Schrittweite entsprechen, dann kann man bei der Fortbewegung den ganzen Vektor zu der aktuellen Position dazurechnen.
Private ListOfLookDirections As New List(Of Vector3D) ' als Klassen-Variable
Private Sub CalculateLookDirections(ByVal noPoints As Integer, ByVal radius As Double)
Dim alpha As Double = 2 * System.Math.PI / noPoints ' Winkel zwischen den Vektoren
Dim actualVector As Vector3D
For i = 0 To noPoints - 1
actualVector.X = System.Math.Cos(i * alpha) * radius
actualVector.Y = 0
actualVector.Z = System.Math.Sin(i * alpha) * radius
ListOfLookDirections.Add(actualVector)
Next
End Sub