Kamera auf Objekt fixieren (Berechnung)

  • VB.NET
  • .NET (FX) 1.0–2.0

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Kamera auf Objekt fixieren (Berechnung)

    Hallo,
    ich hoffe, dass Ihr mir bei diesem Problem weiterhelfen könnt! :)

    Was möchte ich?
    Ich möchte eine Anwendung programmieren, die mir in einer Simulation / einem Physiktest meine Kamera dauerhaft auf das ausgewählte Objekt fixiert, egal wo es sich im drei dimensionalen Raum befindet.

    (Das Objekt ist über der Kamera)



    (Das Objekt ist unter die Kamera gefallen)



    Was habe ich?
    Die Koordinaten meiner Kamera:

    CameraPosX
    CameraPosY
    CameraPosZ

    Die Sichtwinkel meiner Kamera:

    CameraViewAngleX (Hoch, Runter) (So angegeben: 1.48352 - Muss umgerechnet werden?)
    CameraViewAngleZ (Links, Rechts) (So angegeben: 5.84794 - Muss umgerechnet werden?)


    Die Koordinaten des Objekts:

    ObjectPosX
    ObjectPosY
    ObjectPosZ

    Hilfe!
    Es wäre wirklich toll, wenn Ihr mir Schritt-Für-Schritt erklären könntet, wie ich die neuen Sichtwinkel berechnen kann, um das Objekt mit meiner Kamera zu fixieren.

    Ich hoffe Ihr könnt mir weiterhelfen! :)
    "Denken ist die schwerste Arbeit, die es gibt. Das ist wahrscheinlich auch der Grund, warum sich so wenig Leute damit beschäftigen." - Henry Ford

    Vultrax schrieb:

    (So angegeben: 1.48352 - Muss umgerechnet werden?)
    wie sind den die Einheiten dazu? Grad (°) Millimeter (mm)?

    Wenn ich mich nicht irre müsse das ganze sich über den Pythagoras realisieren lassen.

    Deine Kamera ist ja ein festes Objekt(?)
    Also kannst du noch mit Hilfe des Pythagoras und den Koordinaten von deinem Objekt die Koordinaten ausrechnen wo die Kamera hinsehen soll.

    Vultrax schrieb:

    Es wäre wirklich toll, wenn Ihr mir Schritt-Für-Schritt erklären könntet,
    Etwas Eigeninitiative ist schon gefragt ;)
    @Vultrax Das ist zunächst elementare Vektorrechnung, Ortsvektor der Kamera und Richtungsvektor (Objekt MINUS Kamera).
    Die Richtungswinkel sind die Richtungskosinüsse des Ortsvektors.
    Gugst Du hier.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich danke Euch erstmal für Eure Antworten!

    @Kameo
    1). Die Einheit kenne ich nicht, ich weiß nur, wie man es umrechnet:

    VB.NET-Quellcode

    1. MessageBox.Show((5.84794 * 180 / Math.PI).ToString)

    Der größte Wert bis es wieder auf 0 gesetzt wird (in der horizontalen Drehung) ergibt 360 Grad wenn ich es so umrechne.

    2). Während des Tests kann die Kamera bewegt werden, bewegt sich aber sonst nicht von selbst.

    @RodFromGermany
    Mache ich das so richtig?

    VB.NET-Quellcode

    1. CalcPosX = ObjectPosX - CameraPosX
    2. CalcPosY = ObjectPosY - CameraPosY
    3. CalcPosZ = ObjectPosZ - CameraPosZ

    Diese Wikipedia-Seite überfordert mich etwas, wo muss ich dort genau schauen? Lässt sich das in .NET darstellen?
    "Denken ist die schwerste Arbeit, die es gibt. Das ist wahrscheinlich auch der Grund, warum sich so wenig Leute damit beschäftigen." - Henry Ford

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Vultrax“ ()

    Vultrax schrieb:

    Mache ich das so richtig?
    Ich würde mir zunächst eine Vektor-Klasse bauen, der Du dann auch die üblichen Operatoren überladen kannst, dann kannst Du das im Code hinscheiben wie auf dem Papier.
    Und unterscheide sorgfältig Ortsvektoren und Richtungsvektoren, das ist etwa äquivalent zu DateTime und TimeSpan.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany - Meinst Du so?

    VB.NET-Quellcode

    1. Private Sub BN_Fokusieren_Click(sender As Object, e As EventArgs) Handles BN_Fokusieren.Click
    2. Dim CV As New CameraVector
    3. End Sub
    4. Private Class CameraVector
    5. Public PosX As Double
    6. Public PosY As Double
    7. Public PosZ As Double
    8. End Class
    "Denken ist die schwerste Arbeit, die es gibt. Das ist wahrscheinlich auch der Grund, warum sich so wenig Leute damit beschäftigen." - Henry Ford
    @Vultrax Ja. Als allereersten Anfang.
    Und dann viel so was:

    C#-Quellcode

    1. public static Vektor operator +(Vektor v1, Vektor v2)
    2. // unäre Addition
    3. {
    4. return new Vektor(v1.X + v2.X, v1.Y + v2.Y, v1.Z + v2.Z);
    5. }
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich verstehe nicht ganz, wie ich das verwenden soll.
    Folgendes habe ich geschrieben, nachdem ich diese Seite gefunden habe: uni-ulm.de/fileadmin/website_u…xe_datentypen/Vektor.java

    VB.NET-Quellcode

    1. Public Class ObjectVector
    2. Public X As Double
    3. Public Y As Double
    4. Public Z As Double
    5. End Class
    6. Public Class CameraVector
    7. Private X As Double
    8. Private Y As Double
    9. Private Z As Double
    10. Public Sub New(X As Double, Y As Double, Z As Double)
    11. Me.X = X
    12. Me.Y = Y
    13. Me.Z = Z
    14. End Sub
    15. Public Shared Operator +(CV As CameraVector, OV As ObjectVector) As CameraVector
    16. Return New CameraVector(CV.X + OV.X, CV.Y + OV.Y, CV.Z + OV.Z)
    17. End Operator
    18. End Class
    "Denken ist die schwerste Arbeit, die es gibt. Das ist wahrscheinlich auch der Grund, warum sich so wenig Leute damit beschäftigen." - Henry Ford

    Vultrax schrieb:

    wie ich das verwenden soll.

    VB.NET-Quellcode

    1. Dim cam = New Vector(x1, y1, z1)
    2. Dim obj = New Vector(x2, y2, z2)
    3. Dim richtungsvektor = obj - cam
    4. For i = 1 to 10
    5. Dim achse = cam + i * richtungsvektor ' irgend Punkte auf der Verbindungsgeraden Kamera - Objekt
    6. Next

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!