- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一个函数,使用 OpenGL 管道命令和 gluCylinder()
函数绘制一个圆柱体,该圆柱体的每个底面的中心都位于特定点上。
作为第一次尝试,我只是尝试绘制圆柱体,结果是一个圆柱体,底部以 (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>
计算从center2
到center1
的 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/
我正在编写一个函数,使用 OpenGL 管道命令和 gluCylinder() 函数绘制一个圆柱体,该圆柱体的每个底面的中心都位于特定点上。 作为第一次尝试,我只是尝试绘制圆柱体,结果是一个圆柱体,底
我想使用 gluQuadric 和 gluCylinder 绘制一个圆柱体。这个圆柱体应该有纹理。 我的绘制代码如下: pTexture->Enable(); pTexture->Bind(); gl
我想用 OpenGL build 一个板球场。我制作了几个多边形来表示球场、球场和保龄球线。但问题是,当我尝试使用 gluCylinder 制作树桩时,我制作了深度 glEnable(GL_DEPTH
如何为 gluCylinder() 和 gluDisk() 等函数设置纹理坐标偏移和乘数? 因此,如果正常情况下纹理会从点 0 开始,我想将其设置为从点 0.6 或 3.2 等开始。乘数意味着纹理会变
我遇到了一个问题,我用以下代码制作了一个圆柱体,我一直在尝试移动它(向后移动,以便它的中心位于灰色光束所在的位置)。 但是,输出根本没有移动圆柱体,我没能发现问题所在? GLfloat plane[]
我将 OpenGL 与 C++(但没有着色器和 GLSL)结合使用,并使用 glu 库函数绘制球体(台球)和圆柱体(球杆)。我正在使用 glBindTexture() 绑定(bind)纹理并使用 SO
我是一名优秀的程序员,十分优秀!