围绕特定轴旋转gluCylinder()吗?

问题描述 投票:0回答:1

[我正在使用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管线命令方法,欧拉角会更好。不过,如果您有更好的方法来完成整件事,我将很高兴学习新的知识。

如何定义此轮换?

c++ opengl 3d glut glu
1个回答
0
投票

我建议使用类似OpenGL Mathematics (GLM)库的数学库。

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

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

计算从center2center1的向量。并定义参考向量(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返回两个矢量之间的角度的余弦值(单位矢量的长度为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将当前矩阵乘以旋转矩阵。 e.g:

glMultMatrixf
© www.soinside.com 2019 - 2024. All rights reserved.