Rotation um eine beliebige Achse [Ideen]



  • Ich habe jetzt ein Funktion um ein Objekt um eine Achse rotieren zu lassen.

    Wenn ich für Winkel 0 und die drei Koordinaten mit 0 angebe ist das Objekt nicht zu sehen.

    gxRotate(0,0,0,0); Nicht mit glRotatef() verwechseln

    Auch wenn ich erst rotiere und danach verschiebe.

    Hier mal etwas Code:

    m_matRot._11= (x*x) * (1.0f - fcos ) + fcos;
        m_matRot._12= (x*y) * (1.0f - fcos ) - (z*fsin);
        m_matRot._13= (x*z) * (1.0f - fcos ) + (y*fsin);
    
        m_matRot._21= (y*x) * (1.0f - fcos ) + (z*fsin);
        m_matRot._22= (y*y) * (1.0f - fcos ) + fcos;
        m_matRot._23= (y*z) * (1.0f - fcos ) - (x*fsin);
    
        m_matRot._31= (z*x) * (1.0f - fcos ) - (y*fsin);
        m_matRot._32= (z*y) * (1.0f - fcos ) + (x*fsin);
        m_matRot._33= (z*z) * (1.0f - fcos ) + fcos;
    
        m_matRot._14= m_matRot._24 = m_matRot._34 = 0.0f;
        m_matRot._41= m_matRot._42 = m_matRot._43 = 0.0f;
        m_matRot._44= 1.0f;
    

    Die Rotationsmatrix multipliziere ich mit der Weltmatrix

    Wenn nötig wird das ganze noch verschoben:

    m_matWorld._41 = x; 
        m_matWorld._42 = y; 
        m_matWorld._43 = z;
    

    Wenn ich die Funktion glRotatef() in OpenGL verwende und alle Werte mit 0 angebe ist das Objekt trotzdem zu sehen.

    Ich selber befinde mich 20 Einheiten vom Nullpüunkt entfernt.

    Weiss einer wie ich es trotdem machen könnte das man das Objekt trotdem sehen kann. Ist ja nicht auszuschließen das in einem Programm diese Werte alle mal auf 0 sind.

    [ Dieser Beitrag wurde am 16.04.2003 um 17:29 Uhr von Netzwerk-Latenz editiert. ]



  • Aus meiner Engine:

    // Rotationsmatrix für Rotation um eine beliebige Achse berechnen
    Matrix4x4 Matrix4x4::RotationAxis(Vector3D Axis,
                                      const float Angle)
    {
        // Sinus und Kosinus des Winkels berechnen
        const float Sin = sinf(-Angle);
        const float Cos = cosf(-Angle);
    
        // Achsenvektor normalisieren
        Axis.Normalize();
    
        // Matrix erstellen
        return Matrix4x4((Axis.x * Axis.x) * (1.0f - Cos) + Cos,
                         (Axis.x * Axis.y) * (1.0f - Cos) - (Axis.z * Sin),
                         (Axis.x * Axis.z) * (1.0f - Cos) + (Axis.y * Sin),
                         0.0f,
                         (Axis.y * Axis.x) * (1.0f - Cos) + (Axis.z * Sin),
                         (Axis.y * Axis.y) * (1.0f - Cos) + Cos,
                         (Axis.y * Axis.z) * (1.0f - Cos) - (Axis.x * Sin),
                         0.0f,
                         (Axis.z * Axis.x) * (1.0f - Cos) - (Axis.y * Sin),
                         (Axis.z * Axis.y) * (1.0f - Cos) + (Axis.x * Sin),
                         (Axis.z * Axis.z) * (1.0f - Cos) + Cos,
                         0.0f,
                         0.0f,
                         0.0f,
                         0.0f,
                         1.0f);
    }
    


  • Soweit ich das sehe ist es die gleiche Berechnung. Wie ist es bei deiner Engine?

    Wenn du

    Matrix4x4::RotationAxis(VECTOR3D(0,0,0),0);

    machst?

    Kann man das Objekt am Weltnullpunkt sehen. Bei mir ist er erst sichtbar wenn ich einen der Werte x,y oder z ändere. Dann ist das Objekt auf einmal sichtbar.



  • Klar, dass das Probleme gibt. Denn (0, 0, 0) ist ja keine Achse. Der Achsenvektor sollte normalisiert sein.


Anmelden zum Antworten