Да 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 , поэтому могут быть небольшие отличия.