How to rotate a vector in 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吗?
是的,OpenGL内部使用4x4统一变换矩阵。但是
1 2 | glMatrixMode(GL_MODELVIEW); glRotatef(angle,x,y,z); |
它将围绕点
1 2 3 4 | glMatrixMode(GL_MODELVIEW); glTranslatef(+x0,+y0,+z0); glRotatef(angle,x,y,z); glTranslatef(-x0,-y0,-z0); |
这是旧的API,但是在使用现代GL时,由于不再有矩阵堆栈,您需要自己做矩阵工作(例如,通过使用GLM)。 GLM应该具有与
现在,您的示例对我而言毫无意义:
1 | (5,0,0) -> glm::rotate (0,1,0) -> (-5,0,0) |
暗示围绕
1 | (4,0,0) -> wanted API -> (3,0,0) |
向量在旋转后应该具有相同的大小,这显然不是这种情况(除非您要绕
显然,您忘记了重要信息,或者不知道轮换的工作方式。
现在,您想旋转
[Edit1]新示例
I want a API so I can rotate
vec3(0,4,0) by180 deg and result
will bevec3(3,0,0)
仅在谈论点而不是向量时才可行。因此,您需要旋转中心,旋转轴和角度。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | // 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编写代码,因此可能会有一些小的差异。