Как повернуть вектор в opengl? - PullRequest
0 голосов
/ 04 мая 2018

Я хочу вращать свой объект, когда я использую glm :: rotate.

Может вращаться только на стрелках X, Y, Z.

Например, Model = vec3 (5,0,0)

если я использую Model = glm :: rotate (Model, glm :: radians (180), glm :: vec3 (0, 1, 0));

стало vec3 (-5,0,0)

Мне нужен API, чтобы я мог поворачиваться на vec3 (0,4,0) на 180 градусов, поэтому Модель переходит на vec3 (3,0,0)

Какой API я могу использовать?

1 Ответ

0 голосов
/ 04 мая 2018

Да OpenGL использует 4x4 матрицы равномерного преобразования для внутреннего использования. Но glRotate API использует 4 параметра вместо 3:

glMatrixMode(GL_MODELVIEW);
glRotatef(angle,x,y,z);

будет вращать выбранную матрицу вокруг точки (0,0,0) и оси [(0,0,0),(x,y,z)] на угол angle [deg]. Если вам нужно повернуть вокруг определенной точки (x0,y0,z0), вам также следует перевести:

glMatrixMode(GL_MODELVIEW);
glTranslatef(+x0,+y0,+z0);
glRotatef(angle,x,y,z);
glTranslatef(-x0,-y0,-z0);

Это старый API , однако, и при использовании современного GL вам нужно выполнить матрицу самостоятельно (например, используя GLM ), так как больше не матричный стек GLM должен иметь ту же функциональность, что и glRotate, просто найдите функцию, которая имитирует ее (похоже, glm :: rotate более или менее одинакова). Если нет, вы все равно можете сделать это самостоятельно, используя формула вращения Родригеса .

Теперь ваши примеры не имеют смысла для меня:

(5,0,0) -> glm::rotate (0,1,0) -> (-5,0,0)

подразумевает поворот вокруг оси y на 180 градусов? хорошо я вижу ось, но нигде не вижу угла. Второй (желаемый API) еще более сомнителен:

 (4,0,0) -> wanted API -> (3,0,0) 
Векторы

должны иметь одинаковую величину после вращения, что явно не так (если только вы не хотите вращаться вокруг какой-либо точки, отличной от (0,0,0), которая также нигде не упоминается. Кроме того, после вращения обычно вы пропускаете часть этой величины в другие оси все ваши y,z равны нулю, что верно только в особых случаях (при повороте на 90 градусов).

Очевидно, что вы забыли упомянуть важную информацию или не знаете, как работает ротация.

Теперь, что вы имеете в виду, когда хотите повернуть на X,Y,Z стрелки? Хотите инкрементные повороты по ключевым ударам? или у вас есть GUI как стрелки, отображаемые в вашей сцене, и вы хотите выбрать их и повернуть, если они перетаскиваются?

[Edit1] новый пример

Я хочу API , чтобы я мог повернуть vec3(0,4,0) на 180 deg и получить результат будет vec3(3,0,0)

Это выполнимо, только если вы говорите о точках, а не векторах. Таким образом, вам нужно центр вращения и оси вращения и угла.

// knowns
vec3 p0 = vec3(0,4,0);  // original point
vec3 p1 = vec3(3,0,0);  // wanted point
float angle = 180.0*(M_PI/180.0); // deg->rad
// needed for rotation
vec3 center = 0.5*(p0+p1); // vec3(1.5,2.0,0.0) mid point due to angle = 180 deg
vec3 axis = cross((p1-p0),vec3(0,0,1)); // any perpendicular vector to `p1-p0` if `p1-p0` is parallel to (0,0,1) then use `(0,1,0)` instead
// construct transform matrix
mat4 m =GLM::identity(); // unit matrix
m = GLM::translate(m,+center);
m = GLM::rotate(m,angle,axis);
m = GLM::translate(m,-center); // here m should be your rotation matrix
// use transform matrix
p1 = m*p0; // and finaly how to rotate any point p0 into p1 ... in OpenGL notation

Я не кодирую в GLM , поэтому могут быть небольшие отличия.

...