c++ - 围绕特定轴旋转 gluCylinder()?

标签 c++ opengl glut glu opengl-compat

我正在编写一个函数,使用 OpenGL 管道命令和 gluCylinder() 函数来绘制一个圆柱体,该圆柱体的每个底座的中心位于特定点上。

作为第一次尝试,我只是尝试绘制圆柱体,结果是一个圆柱体,下底面以 (0, 0, 0) 为中心,另一个底面以 (0, 0, 0) 为中心code>(0, 0, height),其中 height 已作为函数参数传递。

然后,我尝试将第一个基地集中在我选择的第一个点上,一切都很顺利。

现在,我正在努力寻找第二个点的正确位置:我已经计算了两点之间的距离并存储了沿每个轴的距离以获得 vector 差,所以我需要做的就是执行旋转,使得在任何坐标系,圆柱体的轴都位于两点的 vector 差上。

不过,我需要找到圆柱体轴的坐标并旋转它,但我不知道该怎么做。

这是我的代码,希望它有用:

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 管道命令方法,欧拉角会更好。不过,如果您有更好的方法来完成整个事情,我将很高兴学习新东西。

如何定义这种轮换?

最佳答案

我建议使用像 OpenGL Mathematics (GLM) 这样的数学库图书馆。

glm 库是一个模板库。对于以下操作,您只需包含以下文件:

#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>

计算从center2center1的 vector 。并定义一个引用 vector ,例如(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 的旋转矩阵。计算旋转角度-Dot product共 2 Unit vectors返回 2 个 vector 之间角度的余弦(单位 vector 的长度为 1,可以通过 glm::normalize 将 vector 转换为单位 vector )。旋转轴可以通过 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);

关于c++ - 围绕特定轴旋转 gluCylinder()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58117590/

相关文章:

C++逐行读取文件,有些行的列与其他行不同

c++ - 哪个 STL 容器最适合 std::sort? (这还重要吗?)

c++ - C++中的延迟构造函数

c++ - OpenGl 库不工作

c++ - OpenGL 使用着色器定义颜色

c++ - 多边形轮廓上的边并不总是正确的

linux - Emscripten 和空方 block

c++ - 模板中的运算符重载

opengl - Haskell OpenGl 和 GLUT 模棱两可的发生

c - 旋转肩膀和肘部的 OpenGL Arm