如何在 opengl 中旋转矢量?
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 在内部使用 。但是 glRotate
API 使用 4 个参数而不是 3:
glMatrixMode(GL_MODELVIEW);
glRotatef(angle,x,y,z);
它将围绕点 (0,0,0)
和轴 [(0,0,0),(x,y,z)]
旋转 selected 矩阵 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 is more or less the same). If not you can still do it on your own using 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 像在你的场景中渲染的箭头,并且想要 select 它们并在它们被拖动时旋转?
[Edit1] 新例子
I want a API so I can rotate vec3(0,4,0)
by 180 deg
and result
will be 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 编写代码,因此可能存在一些小差异。
当我使用 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 在内部使用 glRotate
API 使用 4 个参数而不是 3:
glMatrixMode(GL_MODELVIEW);
glRotatef(angle,x,y,z);
它将围绕点 (0,0,0)
和轴 [(0,0,0),(x,y,z)]
旋转 selected 矩阵 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 is more or less the same). If not you can still do it on your own using 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 像在你的场景中渲染的箭头,并且想要 select 它们并在它们被拖动时旋转?
[Edit1] 新例子
I want a API so I can rotate
vec3(0,4,0)
by180 deg
and result will bevec3(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 编写代码,因此可能存在一些小差异。