Kamera - Hilfe!!



  • Ich schreibe gerade eine Kameraklasse für meinen Raytracer.
    Jetzt mein Problem:
    Ich habe bei der Kamera ihren Ort als Punkt, Die Richtung als Vektor, und auch einen Up-Vektor und die Entfernung zum Viewport.

    Jetzt muss ich durch geschickte Drehungen und Translationen die Strahlenvektoren in den Viewport der Kamera in das Weltkoordinatensystem umrechnen: aber wie.

    Mein Ansatz war, die Winkel zu den Achsen zu berechnen und um diese zu drehen. Geht aber nicht, da die Winkel sich auf die Ebene beziehen, die Koordinatenachse und Vektor aufspannen.

    Dann habe ich einfach nur noch 2-dimensional gerechnet. Die erste Rotation hat geklappt, bei der zweiten gings dann nicht mehr.

    Kann hier mal jemand die richtigen Schritte erklären ... und vielleicht sogar die Matrizen angeben...

    Danke im voraus!



  • kannst Du mal den Quellcode posten??
    Ich hba mich vor Jahren mal an nem Raytracer probiert, dsa Ganze dann aber aufgegeben. allerdings hatte meine Rotation funktioniert. Nur leider ist der Code weg 😞



  • Original erstellt von DocJunioR:
    kannst Du mal den Quellcode posten??
    Ich hba mich vor Jahren mal an nem Raytracer probiert, dsa Ganze dann aber aufgegeben. allerdings hatte meine Rotation funktioniert. Nur leider ist der Code weg 😞

    Vom ganzen Projekt?

    Hier mal die Camera (Test)-Klasse:
    Edit by Headhunter : c++ Codetags reingemacht

    #ifndef CAMERA_H
    #define CAMERA_H
    #include <Util/P3D.h>
    #include <Util/Mat.h>
    #include <math.h>
    
    #define Perspective 0
    #define Parallel    1
    
    class Camera {
    public:
        Camera() {
        }
        Camera(const P3D eye, const P3D rayp, V3D top, V3D dir, int kind) {
            double Rot1 = -acos(dir.x() / sqrt( dir.x()*dir.x() + dir.y() * dir.y() )); // Rotation in xz-Ebene
            rotation2xz=new RotateMat3D(X,Rot1);
            V3D temp = (*rotation2xz)*dir;
            double Rot2 = -acos(temp.z() / sqrt( temp.x()*temp.x() + temp.z() * temp.z() )); // Rotation in z-Achse
            rotation2z=new RotateMat3D(Y,Rot2);
            Mat3D complrot=(*rotation2xz)*(*rotation2z);
            V3D test = complrot*dir;
            printf("%f %f %f",test.x(),test.y(),test.z());
        }
    
        //V3D getVpn() const;
        //P3D getEye() const;
    
        //V3D toWorld(int x, int y);  // Vektor von Kamera auf Viewport(x,y) in den Weltraum
    
        //V3D& getRayFromEye(double x, double y);
        //void setViewport(double m, int ViewportX, int ViewportY);
        //int isPerspective() const;
        //double getFocalLength() const;
        //int getViewportWidth() const;
        //int getViewportHeight() const;
    
    private:
        RotateMat3D*    rotation2xz;  // Rotation in xz-Ebene
        RotateMat3D*    rotation2z;   // Rotation in z-Achse
        TranslateMat3D* translation2root; // Translation in den Ursprung
        P3D    p_eye;
        V3D    v_direction;
        V3D    v_top;
    
    };
    
    #endif
    

    Wie gesagt da ist nichts fertig, da ich die Drehungen nicht hinkriege! Nicht lachen! 😃

    [ Dieser Beitrag wurde am 15.01.2003 um 16:06 Uhr von Headhunter editiert. ]



  • Na MagicCreator? Oder kann mir jemand anders helfen?



  • Ich versteh eigentlich nicht so ganz, was du jetzt transformieren willst. Du solltest doch eigentlich wissen, wie deine Strahlen verlaufen sollen, z.b. alle Paralell oder starten alle in einen Punkt und schneiden einen Kreis, Zylinder oder Ebene in äquidistanten Punkten o.ä. Dann kannst du doch ganz simpel aus Kamerapunkt, Blickrichtung, UpVektor und Sichtwinkel alles berechnen?!



  • Ich habe mein Kamerakoordinatensystem, in diesem liegt mein Viewport als Ebene parallel zur xy-Ebene im negativen z-Bereich. In diesen Viewport schiesse ich nun Strahlen hinein. Das ergibt einen Vektor. Den muß ich aber nun ins Weltkoordinatensystem drehen!
    Ich hoffe ich konnte mich deutlicher ausdrücken!



  • Original erstellt von ºgrimmsenº®:
    Ich habe mein Kamerakoordinatensystem, in diesem liegt mein Viewport als Ebene parallel zur xy-Ebene im negativen z-Bereich. In diesen Viewport schiesse ich nun Strahlen hinein. Das ergibt einen Vektor. Den muß ich aber nun ins Weltkoordinatensystem drehen!
    Ich hoffe ich konnte mich deutlicher ausdrücken!

    Dieses drehen, das du vorhast, ist nicht eindeutig möglich, aber IMHO auch völlig unnötig. Du brauchst keinen Viewpot im "Kamerakoordinatensystem", du brauchst nichtmal ein Kamerakoordinatensystem. Berechne einfach aus den oben genannten Daten die vier Vektoren, die dein Sichtfeld begrenzen, und schneide sie mit einer Ebene die senkrecht zur Blickrichtung liegt. Du erhälst vier Punkte, du kannst zwischen denen linear interpolieren und erhälst die Punkte, durch die die Strahlen geschossen werden.


Anmelden zum Antworten