bewegung: position aus 3d-vektor berechnen



  • so lange man sich nur in der horizontalen bewegt, ist es eigentlich ganz einfach. es verändert sich nur der y-winkel und in abhängigkeit von diesem wird bei einem schritt vorwärts die neue position so berechnet:

    PosZ-=StepWidthcos(AngleY);
    PosX-=StepWidth
    sin(AngleY);

    nur wie berechnet man das, wenn zusätzlich noch eine neigung über die x-achse hinzukommt? wenn also eine vorwärtsbewegung wie z.b. bei einem flugzeug berechnet werden soll?



  • vCameraDir = tbVector3(sinf(g_fCameraRotY) * cosf(g_fCameraRotX),
                           sinf(g_fCameraRotX),
                           cosf(g_fCameraRotY) * cosf(g_fCameraRotX));
    


  • vOldPos+= vCameraDir * sTimeStep;
    

    Bye, TGGC



  • TomasRiker schrieb:

    vCameraDir = tbVector3(sinf(g_fCameraRotY) * cosf(g_fCameraRotX),
                           sinf(g_fCameraRotX),
                           cosf(g_fCameraRotY) * cosf(g_fCameraRotX));
    

    das stimmt dann wohl leider nicht. auch wenn sich der winkel x ändert, bewirkt das bei dieser formel für die y-koordinate garnichts



  • Doch, da steht doch y= sin(x).

    Bye, TGGC



  • sorry, mein fehler. es ändert sich natürlich was an der höhe. das problem ist nur, wenn sich das objekt in seitlicher fluglage befindet, ändert diese formel nicht in richtung der position des objektes (in dem falle dann also seitlich) sondern absolut in richtung der welt - also immer noch nach oben/unten



  • kann doch nicht sein dass das keiner weiß hier!? im prinzip sieht mein problem so aus: wenn sich das flugobjekt durch einen kurve zur seite neigt, ändert sich auch dessen lokale x-achse mit. änderungen in der fluglage nach oben/unten sollen nun in bezug auf diese lokale x-achse stattfinden, d.h. je nach stärke der neigung muß eine änderung auf der lokalen x-achse unterschiedlich starke wirkungen auf die absoluten y- und z-achsen der welt haben. nur - wie berechnet man diese?



  • Hi,

    rotiere einfach die lokalen Achsen der Kamera mit. Erstelle dazu mit der allgemeinen Rota-Matrix Formel (nicht der drei Spezialfälle für die Weltachsen) eine Rotationsmatrix jeweils um eine Achsen der Kamera und rotiere die beiden anderen Achsen der Kamera mit dieser Matrix.

    Alle Bewegungen des Objektes lassen sich nun über die korrekt rotierten Achsen der Kamera erreichen.

    Ciao,
    Stefan



  • ich rotiere ja die achsen der kamera und das bringt das falsche ergebnis.

    es genügt ja eben nicht, wenn ich z.b. immer bei einer rechtskurve um die y-achse rotiere, wenn das flugobjekt nämlich gerade senkrecht nach oben fliegt, muss ich die z-achse nehmen. das wäre ja noch einfach zu lösen, aber wie rotiere ich um x- und z-achse, wenn das ovjekt nur leicht nach oben geneigt ist? und wie berechne ich diese rotation für alle achsen bei den möglichen anderen fluglagen?



  • Beeper schrieb:

    es genügt ja eben nicht, wenn ich z.b. immer bei einer rechtskurve um die y-achse rotiere

    Doch, Du musst um die y-Achse des Objekts drehen, nicht um die absolute y-Achse. Darum musst Du die Achsen bei jeder Drehung mit drehen.



  • es gibt kein objekt in dem sinne sondern nur die kamera - und die hat nur eine, absolute achse



  • Anscheinend willst Du es garnicht verstehen...
    Mach es so, dass Dein Objekt drei Achsen hat. Dann rotierst Du um diese Achsen, und rotierst die Achsen immer gleich mit. Ob das jetzt eine Kamera ist oder ein Objekt ist völlig egal.



  • Künstliche Dummheit? 😉



  • ist das hier der übliche umgangston wenn ihr auch nicht weiter wißt?

    wie soll ich die achsen rotieren??? die sind fest ausgerichtet, nämlich die absoluten weltachsen - da kann ich nichts rotieren!



  • ...und wenn ich um eine achse herum rotiert habe (wie ich es jetzt schon tue), dann ist eine rotation um eine andere achse eben nicht mehr um die absolute achse herum zu machen, sondern um einer relative achse (die ich nicht habe). also muß es eine möglichkeit geben, die gewünschte relative rotation auf die dafür nötige absolute rotation umzurechnen!?



  • Beeper schrieb:

    ist das hier der übliche umgangston wenn ihr auch nicht weiter wißt?

    Wir wissen weiter, aber Du willst die Vorschläge ja nicht annehmen! Wie soll man Dir da helfen? Wenn es mit Deinem System nicht klappt, musst Du vielleicht einsehen, dass Dein System Müll ist, und ein neues akzeptieren. Wenn Du das nicht willst, hast Du eben Pech gehabt.
    Sorry!

    Wenn ich hier frage, wie ich ein Maschinengewehr aus Strohhalmen bauen kann und mir alle sagen, dass ich dafür Metall brauche, ich jedoch auf der Strohhalmvariante beharre, wer ist dann der Doofe? 😉



  • "mein system" ist eine fertige 3d-engine die sicher kein müll ist. und bei "meinem system" kann ich beim view (der kamera) eben nur eine einzige matrix setzen. dass heißt ich habe nur EINMAL ein achsenset von x-, y- und z-achse. also muß ich die nötigen berechnungen (für die zusätzliche rotation der achsen) ja wohl manuell vornehmen

    vielleicht gibts hier im forum ja auch noch jemanden, der sich auskennt und nicht nur dampfplauderer?



  • Du hast es immer noch nicht verstanden... 😞
    Es reicht doch völlig, wenn man eine Matrix angeben kann. Das ist doch wohl bei jeder Engine so. Und diese Matrix baust Du Dir eben aus den Kameraachsen und der Position zusammen.

    Aber Du wirst mir ja doch nicht glauben.
    Vielleicht kann Dich das hier überzeugen (ist aber sehr schlampig, da schnell geschrieben):

    class Camera
    {
    public:
        VECTOR3 xAxis, yAxis, zAxis;
        VECTOR3 position;
    
        Camera() : xAxis(1.0f, 0.0f, 0.0f),
                   yAxis(0.0f, 1.0f, 0.0f),
                   zAxis(0.0f, 0.0f, 1.0f),
                   position(0.0f, 0.0f, 0.0f) {}
        ~Camera() {}
    
        void rotateX(float angle);
        void rotateY(float angle);
        void rotateZ(float angle);
        void move(const VECTOR3& movement);
        MATRIX44 getMatrix() const;
    };
    
    void Camera::rotateX(float angle)
    {
        // y- und z-Achse um die x-Achse rotieren lassen
        MATRIX44 rotation = rotationAxisMatrix(xAxis, angle);
        yAxis *= rotation;
        zAxis *= rotation;
    }
    
    void Camera::rotateY(float angle)
    {
        // x- und z-Achse um die y-Achse rotieren lassen
        MATRIX44 rotation = rotationAxisMatrix(yAxis, angle);
        xAxis *= rotation;
        zAxis *= rotation;
    }
    
    void Camera::rotateZ(float angle)
    {
        // x- und y-Achse um die z-Achse rotieren lassen
        MATRIX44 rotation = rotationAxisMatrix(zAxis, angle);
        xAxis *= rotation;
        yAxis *= rotation;
    }
    
    void Camera::move(const VECTOR3& movement)
    {
        // die Kamera bewegen
        position += movement.x * xAxis + movement.y * yAxis + movement.z * zAxis;
    }
    
    MATRIX44 Camera::getMatrix() const
    {
        // Kameramatrix erzeugen
        return translationMatrix(-position) *
               MATRIX44(xAxis.x, yAxis.x, zAxis.x, 0.0f,
                        xAxis.y, yAxis.y, zAxis.y, 0.0f,
                        xAxis.z, yAxis.z, zAxis.z, 0.0f,
                        0.0f,    0.0f,    0.0f,    1.0f);
    }
    

    Das ist für Direct3D. Bei OpenGL müsste man die Matrizen transponieren, soweit ich weiß.

    Viele Grüße vom Dampfplauderer, der sich überhaupt nicht auskennt, und der auch kein Buch über das Thema geschrieben hat, weil er ja absolut keine Ahnung hat.



  • TomasRiker schrieb:

    und der auch kein Buch über das Thema geschrieben hat

    troll oder angeber, das ist hier die frage.



  • Entschuldige bitte, aber ich lasse mich nicht als Dampfplauderer bezeichnen, der keine Ahnung von dem Thema hat. Wenn Du einem Diplomphysiker sagst, er habe doch keine Ahnung von Physik, darf er Dir dann nicht sein Diplom zeigen?


Log in to reply