如何在 opengl 中旋转矢量?
How to rotate a vector in opengl?
我想旋转我的对象,当我使用 glm::rotate 时。
它只能在 X,Y,Z 箭头上旋转。
例如,模型 = 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均匀变换矩阵。但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在你的场景中渲染,并且想要选择它们并在拖动它们时旋转它们?
[编辑1] 新示例
我想要一个API,以便我可以按
180 deg
和结果轮换vec3(0,4,0)
将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中编码,所以可能会有一些小差异。
- 发布旋转矩阵(openGL/glm)
- 如何在OpenGL中正确旋转和缩放对象?
- 使用 C++在 OpenGL 中移动自动旋转的 3D 多边形
- 按时间自动旋转形状,同时在 OpenGL 中使用C++移动它们
- 如何在 openGL 中围绕全局轴旋转模型?
- 如何在 opengl 中仅旋转特定对象而不影响其他对象?
- 在OpenGL(GLM/C++)中使用四元数旋转时出现问题
- 鼠标单击 OpenGL 时无法围绕其自己的中心旋转对象
- OpenGL:在那个方向上旋转和移动
- 在 OpenGL 中旋转一个正方形
- 如何使用gluLookAt围绕OpenGL中的点旋转相机视图
- 如何在 opengl 中旋转矢量?
- 现代 OpenGL 多维数据集旋转未按预期工作
- 在使用PI上的OpenGL ES绘制之前,如何旋转纹理
- C++ OpenGL 如何从 quaterion 获取旋转 x,y,z
- Opengl 旋转不起作用
- 绕摄影机旋转opengl c++/设置旋转中心
- 使用 GLM 围绕点旋转 OpenGL
- 第一人称相机,旋转OPENGL
- 立方体旋转- OpenGL