Alternative zu glRotate

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
adapto
Beiträge: 24
Registriert: 22.07.2012, 01:12
Alter Benutzername: adapto

Alternative zu glRotate

Beitrag von adapto »

Hallo *,

ich habe hier in meinem Projekt die Rotationsaxe und den Winkel. Ich benoetige jetzt den Punkt nach der Rotation ohne ihn zu rendern. Gibt es da eine OpenGL-Funktion oder muss man das selbst implementieren.
Funktion sollte also irgendwie so aussehen:
vec3 rotate(float winkel, vec3 achse, vec3 punkt);

Danke!
joggel

Re: Alternative zu glRotate

Beitrag von joggel »

Hi,

gehts dir darum, dass du das in den Shader machen willst? Weil vec3 rotate(float winkel, vec3 achse, vec3 punkt); sieht für mich so aus.

Aber im groben denke ich, du bräuchtest eine Matrix dafür. Selbst aus diesen Parametern musst du dir eine Matrix bauen, um den neuen Vektor zu berechnen. Es geht wohl auch über Quaternionen, aber da habe ich keine Ahnung.

Du könntest aber auch sowas, sowas machen:

Code: Alles auswählen

...
glMatrixMode(GL_MODELVIEW)
// irgendwelche glTranslate-/glScale oder glRotate-Aufrufe oder was auch immer
glPushMatrix();
glRotate(winkel,achse.x, achse.y, achse.z);
float matrixArray[16];
glGetFloatv(GL_MODELVIEW_MATRIX, matrixArray); // neue Matrix (inklusive dieser Rotation) in <matrixArray>
glPopMatrix();

// entweder selber eine Matrix-Klasse schreiben, oder eine Lib nehmen.
// Matrix mit den Werten aus <matrixArray> befüllen und dann damit mit <punkt> multiplizieren.

// sowas in der Art:
Matrix matrix(matrixArray);
Vektor newVec = punkt*matrix; // <newVec> ist gesuchter Punkt.
Fällt mir dazu ein...
waigie
Beiträge: 82
Registriert: 20.05.2009, 19:37

Re: Alternative zu glRotate

Beitrag von waigie »

Ja es gibt alternativen. In so gut wie jeder 3D Mathe Bibliothek findest du Funktionen die das können, da die Funktion glRotate und einige andere in OpenGL 3.3 und höher im Core Profil nicht mehr existieren. Ich selbst nutze GLM (http://glm.g-truc.net/), sie bietet die Funktion

Code: Alles auswählen

glm::mat4 glm::rotate(glm::mat4 const & m, float angle, glm::vec3 const & axis);
Damit kannst du dir die gewünschte Rotationsmatrix erzeugen, deine Position mit der Matrix multiplizieren und bekommst die rotierte Position.
adapto
Beiträge: 24
Registriert: 22.07.2012, 01:12
Alter Benutzername: adapto

Re: Alternative zu glRotate

Beitrag von adapto »

Danke, fuer eure Hilfe. Die Idee von joggel ist super, die werde jetzt erst einmal benutzen. Das die Funktionen entfallen ist natuerlich problematisch und ich werde mir dann wohl auf laengere Sicht etwas einfallen lassen muessen. Wahrscheinlich ist es wohl am sinnvollsten einfach alle Funktionen zu wrappen, aber das wollte ich meiner Engine eigentlich ersparen. Danke!
Antworten