如何在opengl中旋转矢量?

时间:2018-05-04 04:31:17

标签: c++ opengl rotation glm-math 3d-model

当我使用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 :(得分:3)

OpenGL 在内部使用4x4 uniform transform matrices。但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或多或少相同)。如果不是,您仍然可以使用Rodrigues rotation formula自行完成。

现在你的例子对我来说毫无意义:

(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 中编码,因此可能会有一些差异。