Front,Up and Right -> yaw,pitch,roll



  • Hallo zusammen, wie aus yaw,pitch and roll, die 3 Vektoren Front,Up and Right berechne weiss ich, doch wie funktioniert das ganze umgekehrt?? Also wenn ich die Vektoren Front,Up and Right kenne und nun yaw,pitch and roll berechnen muss???

    Gruss Ishildur



  • wie unterscheiden sich die Basen der beiden Vektorräume? hast du mal ne Skizze oder sowas parat?

    für mich sind yaw, pitch, roll nur andere bezeichnungen für front, up, right



  • Nun ja, yaw, pitch and roll sind in diesem fall je einen float wert, der den Rotationswinkel um die jeweilige Achse definiert, während front,up and right die normalisierten Richtungsvektoren angeben.



  • Front,Up and Right -> yaw, roll, pitch

    mmh... konstruktiv betrachtet würde ich einfach Front, Up und Right drehen so dass wieder auf (1, 0, 0), (0, 1, 0), (0, 0, 1) landen und mir dabei merken wie weit ich die entsprechenden Vektoren gedreht habe

    zunächst würde ich mir das ganze mal in 2D Anschauen:

    http://www.fh-landshut.de/~jamann/vektor.GIF

    wie du siehst kann man alles einfach ausrechnen - einfach mal nachdenken welche zusammenhänge zwischen an- und gegenkatete bestehen

    mit welchen Koordinatensystem arbeitest du - links - oder rechtshändig?
    was ist yaw? Drehung um welche Achse?
    was ist roll? ------ "" ------?
    was ist pitch? -------""-------?

    was ist ein Front Vektor? was ist ein Up was ein Right Vektor - beschreiben die das Modelkoordinatensystem? - bzw. bilden diese Vektoren die Basis der Modelkoordinaten? - ich nenne sowas halt immer Modelkoordinatensystem und das andere Weltkoordinatensystem - die Achsen heißen bei mir immer x, y, z - dabei unterscheide ich dann immer die Achsen des Modelkoordinatensystems und des Weltkoordinatensystems - vielleicht ist es ja geschickter die Achsen des Modelkoordinatensystems anders zu bennenen, damit keine verwechslungsgefahr bestetht



  • Folgender Code wandelt allgemein Kartesische Koordinaten in Polarkoordinaten um und umgekehrt - das war doch genau was du gesucht hast
    das Beispiel zeigt wie man den Vektor (-5,5|-1) in Polarkoordinaten umwandelt.

    #include <iostream>
    #include <math.h>
    using namespace std;
    
    #define PI 3.14159265f
    
    // a)
    struct kart
    {
    	float x;	// x-Koordinate
    	float y;	// y-Koordinate
    };
    
    struct polar
    {
    	float r;	// Radius
    	float phi;	// Winkel
    };
    
    void mk_cart(kart &tmp, float x, float y)
    {
    	tmp.x = x;
    	tmp.y = y;
    }
    
    void mk_polar(polar &tmp, float r, float phi)	
    {
    	if(r < 0)				// Die Laenge kann nur positive Werte annehmen
    		r *= -1;
    
    	tmp.r   = r;
    
    	int n = int(phi/360.0f);		// Wieviele Vollkreise beschreibt phi?
    	phi = phi - n * 360;	// Vollkreise abziehen
    
    	if(phi < 0)
    	{	
    		phi = 360 + phi;	// Komplement bilden
    	}
    
    	tmp.phi = phi;
    }
    
    // b)
    void print_kart(const kart &tmp)
    {
    	cout<<"x: "<<tmp.x<<endl;
    	cout<<"y: "<<tmp.y<<endl;
    }
    
    void print_polar(const polar &tmp)
    {
    	cout<<"Radius: "<<tmp.r<<endl;
    	cout<<"Winkel: "<<tmp.phi<<" Grad"<<endl;
    }
    
    // c)
    float deg2rad(float degree)
    {
    	return degree/180.0f*PI;
    }
    
    float rad2deg(float rad)
    {
    	return rad*180.0f/PI;
    }
    
    float betrag(float value)
    {
    	if(value < 1)
    		return value * -1.0f;
    	else
    		return value;
    }
    kart polar2kart(const polar &tmp)
    {
    	kart result;
    	result.x = tmp.r*cos(deg2rad(tmp.phi));
    	result.y = tmp.r*sin(deg2rad(tmp.phi));
    	return result;
    }
    
    polar kart2polar(const kart &tmp)
    {
    	polar result;
    	result.r   = sqrt(tmp.x * tmp.x + tmp.y * tmp.y);
    	result.phi = rad2deg(tan(betrag(tmp.y)/betrag(tmp.x)));
    
    	if(tmp.x < 0 && tmp.y > 0)
    		result.phi = 180 - result.phi;
    
    	if(tmp.x < 0 && tmp.y < 0)
    		result.phi += 180;
    
    	if(tmp.x > 0 && tmp.y < 0)
    		result.phi = 360 - result.phi;
    
    	return result;
    }
    
    int main()
    {
    	polar x;
    
    	kart y;
    	mk_cart(y, -5.5, -1);
    	print_kart(y);
    
    	x = kart2polar(y);
    	print_polar(x);
    
    	int dummy;
    	cin>>dummy;
    }
    



Anmelden zum Antworten