Как повернуть вектор в opengl?

Я хочу вращать свой объект, когда я использую 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 я могу использовать?

-2

Решение

да OpenGL использования Матрицы равномерного преобразования 4×4 внутренне. Но 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 :: поворот более или менее то же самое). Если нет, вы все равно можете сделать это самостоятельно, используя Родригес формула вращения.

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

(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 стрелы? Хотите дополнительные повороты на ключевые хиты? или есть графический интерфейс пользователя как стрелки отображаются в вашей сцене и хотите выбрать их и вращать, если они перетаскиваются?

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

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]