如何在现代opengl中绘制圆柱体

Posted

技术标签:

【中文标题】如何在现代opengl中绘制圆柱体【英文标题】:How to draw cylinder in modern opengl 【发布时间】:2015-10-01 09:06:07 【问题描述】:

我的问题很简单,如何在现代 OpenGL 中绘制圆柱体?我将 GLFW 与 OpenGL 3.x 一起使用。我最初的想法是创建一个函数,将底部和顶部的顶点位置计算为圆,然后在这些顶点之间画线。但我不知道如何实现这一点。有没有人有好的解决方案?

【问题讨论】:

这有帮助吗? gamedev.net/topic/629276-cylindrical-texture-mapping @Lorenzo Belli 谢谢我素未谋面的好朋友 :) 【参考方案1】:

您可以使用三角形条来执行此操作,并在底部生成一个顶点,然后在顶部生成一个。这应该很容易产生边。然后只需用三角扇生成帽子就可以了。为了简化事情,您可以使用模型视图矩阵将圆柱体移动到您想要的位置。这样,您只需要在 x/y 平面或类似平面上有一个圆,因此数学非常简单。

为了性能考虑使用预编译的对象和/或顶点数组。

【讨论】:

【参考方案2】:

我已经使用了一段时间了,希望它对未来的人们有所帮助。

struct 
   GLfloat x,z, y_start, y_end;
each_pole; // struct
std::vector<each_pole> each_pole_vector; // vector of structs

//Cylinder with y axis up
GLfloat cylinder_height = 1.0f,
        cylinder_radius = 0.5f,
        nr_of_points_cylinder = 360.f;

for (int i = 0; i < nr_of_points_cylinder; ++i)

    GLfloat u = i / (GLfloat)nr_of_points_cylinder;

    //Where the cylinder is in the x and z positions (3D space) 
    each_pole.x = center.x 
    + cylinder_radius*cos(2*M_PI*u); 
    each_pole.z = center.z 
    + cylinder_radius*sin(2*M_PI*u); 

    each_pole.y_start = 0.0f;
    each_pole.y_end = cylinder_height;

    each_pole_vector.push_back(each_pole);



return each_pole_vector;

【讨论】:

以上是关于如何在现代opengl中绘制圆柱体的主要内容,如果未能解决你的问题,请参考以下文章

如何提高自定义 OpenGL ES 2.0 深度纹理生成的性能?

C ++ OpenGL:如何在圆柱体上制作第二个圆圈?

从零开始openGL—— 基本图形绘制

为啥OpenGL图元中没有椭圆、椭球和圆柱

在现代 OpenGL 中画一条线

Modern OpenGL 3.x 及更高版本如何绘制图元?