围绕特定轴旋转 gluCylinder()?
Posted
技术标签:
【中文标题】围绕特定轴旋转 gluCylinder()?【英文标题】:Rotate a gluCylinder() around specific axis? 【发布时间】:2019-09-26 13:11:23 【问题描述】:我正在编写一个函数来使用 OpenGL 管道命令和 gluCylinder()
函数绘制一个圆柱体,该圆柱体的每个基点的中心位于特定点上。
作为第一次尝试,我只是尝试绘制圆柱体,结果是一个圆柱体,其底部底部以(0, 0, 0)
为中心,另一个底部以(0, 0, height)
为中心,其中height
已传递为一个函数参数。
然后,我尝试将第一个基地集中在我选择的第一个点上,一切都很顺利。
现在,我正在努力为第二个点找到正确的位置:我已经计算了两个点之间的距离并存储了沿每个轴的距离以获得矢量差,所以我需要做的就是执行旋转,以便在任何帧上圆柱体的轴都位于两点的矢量差上。
不过,我需要找到圆柱轴的坐标并旋转它,我不知道该怎么做。
这是我的代码,希望有用:
void drawCylinder(float pHeight, std::vector<float> center1, std::vector<float> center2)
const GLfloat* projection = glm::value_ptr(glm::perspective(glm::radians(fov), (float)WIN_WIDTH / (float)WIN_HEIGHT, 0.1f, 100.0f));
const GLfloat* view = glm::value_ptr(camera.GetViewMatrix());
glm::vec3 diff = glm::vec3(center2[0] - center1[0], center2[1] - center1[1], center2[2] - center1[2]);
float distance = sqrt(pow(center2[0] - center1[0], 2) + pow(center2[1] - center1[1], 2) + pow(center2[2] - center1[2], 2));
glUseProgram(0);
glPushMatrix();
glMatrixMode(GL_PROJECTION);
glLoadMatrixf(projection);
glPushMatrix();
glMatrixMode(GL_MODELVIEW);
glLoadMatrixf(view);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glColor3f(1.0f, 1.0f, 0.0f);
glTranslated(center1[0] - 12.25f, (center1[1]) + 0.0f, (center1[2]) - 12.25f);
// Here I should perform the rotation in order to draw the cylinder in the right position
gluCylinder(quadric, 0.1f, 0.1f, pHeight, 32, 32);
glPopMatrix();
glMatrixMode(GL_PROJECTION);
glPopMatrix();
我已经考虑过欧拉角和四元数方法,但我真的不知道如何使用它们中的任何一个。也许,鉴于我使用的是 OpenGL 管道命令方法,欧拉角会更好。不过,如果你有更好的方法来完成整个事情,我会很高兴学习新的东西。
如何定义这种旋转?
【问题讨论】:
不推荐使用 glMatrix... 之类的调用。建议您改用阴影。 我如何在着色器中使用 GLUT? 只是不要使用过剩。现代 OpenGL 拥有您需要的所有工具。 您需要熟悉现代OpenGL。我不确定您要达到的目标。例如,如果您想绕 x-y-z 轴旋转,只需在glTranslate
之后使用 glRotate
。或者你想围绕一个特定的向量旋转?此外,您的方向向量未标准化。
我要做的是旋转圆柱体的轴,使其通过center1
和center2
【参考方案1】:
我建议使用 OpenGL Mathematics (GLM) 库之类的数学库。
glm 库是一个模板库。对于以下操作,您只需包含以下文件:
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>
计算从center2
到center1
的向量。并定义一个参考向量,例如(0, 0, 1):
glm::vec3 ref = lm::vec3(0.0f, 0.0f, 1.0f);
glm::vec3 diff = glm::vec3(center2[0] - center1[0],
center2[1] - center1[1],
center2[2] - center1[2]);
您想定义一个从ref
旋转到diff
的旋转矩阵。计算旋转角度——2Unit vectors的Dot product返回2个向量之间角度的余弦(单位向量的长度为1,向量可以通过glm::normalize
转为单位向量)。旋转轴可以通过Cross product 计算。设置一个绕轴旋转角度的旋转矩阵:
float angle = acos(glm::dot(ref, glm::normalize(diff)));
glm::vec3 axis = glm::cross(b, a);
glm::mat4 rotmat = glm::rotate(glm::mat4(1.0f), angle, axis);
使用glMultMatrixf
将当前矩阵乘以旋转矩阵。例如:
glTranslated(center1[0] - 12.25f, (center1[1]) + 0.0f, (center1[2]) - 12.25f);
// multiply current matrix by the rotation matrix
glMultMatrixf(glm::value_ptr(rotmat))
gluCylinder(quadric, 0.1f, 0.1f, pHeight, 32, 32);
【讨论】:
再一次,这对我有用!非常感谢你。此外,glm 让一切变得更容易。以上是关于围绕特定轴旋转 gluCylinder()?的主要内容,如果未能解决你的问题,请参考以下文章