gpt4 book ai didi

c - OpenGL Glut C - 想要渲染弯曲的圆柱体

转载 作者:太空狗 更新时间:2023-10-29 15:05:14 25 4
gpt4 key购买 nike

以下代码以 OpenGL C 语言显示了一个直圆柱体/管道。

 #include <stdio.h>
#include <stdlib.h>
#include <GL/glut.h>
#include <math.h>
#define PI 3.1415927

void draw_cylinder(GLfloat radius, GLfloat height, GLubyte R, GLubyte G, GLubyte B)
{
GLfloat x = 0.0;
GLfloat y = 0.0;
GLfloat angle = 0.0;
GLfloat angle_stepsize = 0.1;

// Draw the tube
glColor3ub(R-40,G-40,B-40);
glBegin(GL_QUAD_STRIP);
angle = 0.0;
while( angle < 2*PI ) {
x = radius * cos(angle);
y = radius * sin(angle);
glVertex3f(x, y , height);
glVertex3f(x, y , 0.0);
angle = angle + angle_stepsize;
}
glVertex3f(radius, 0.0, height);
glVertex3f(radius, 0.0, 0.0);
glEnd();

// Draw the circle on top of cylinder
glColor3ub(R,G,B);
glBegin(GL_POLYGON);
angle = 0.0;
while( angle < 2*PI ) {
x = radius * cos(angle);
y = radius * sin(angle);
glVertex3f(x, y , height);
angle = angle + angle_stepsize;
}
glVertex3f(radius, 0.0, height);
glEnd();
}

void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();

glTranslatef(-0.5,0.0,-2.5);
glRotatef(100.0, 0.725, 1.0, 1.0);

draw_cylinder(0.15, 1.0, 255, 160, 100);

glFlush();
}

void reshape(int width, int height)
{
if (width == 0 || height == 0) return;

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(35.0, (GLdouble)width/(GLdouble)height,0.5, 20.0);

glMatrixMode(GL_MODELVIEW);
glViewport(0, 0, width, height);
}

int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(640,580);
glutCreateWindow("Create Cylinder");
glClearColor(0.0,0.0,0.0,0.0);
glutDisplayFunc(display);
glutReshapeFunc(reshape);

glutMainLoop();

return 0;
}

目前它绘制了一个直圆柱体/管道。我想把它弯曲成 this 的样子.

最佳答案

首先,我建议将圆柱体分割成片。下面的圆锥体将绘制完全相同的圆柱体,但它将圆柱体分成多个切片。切片具有不同的颜色以可视化效果。

GLfloat h0, h1, angle, x, y;
int i, j;

int slices = 8;

for ( i = 0; i < slices; i++ )
{
h0 = (float)i / (float)slices;
h1 = (float)(i+1) / (float)slices;

glColor3f( 1.0f-h0, 0.0, h1 );
glBegin(GL_QUAD_STRIP);
for ( j = 0; j <= 360; ++ j )
{
angle = PI * (float)j * PI / 180.0f;
x = radius * cos(angle);
y = radius * sin(angle);
glVertex3f( x, y, h0 );
glVertex3f( x, y, h1 );
}
glEnd();
}

然后您必须定义弯曲半径以及弯曲开始和结束角度。下面的代码绘制了一个从 bend_ang0bend_ang1 的弯管,半径为 bend_radius。可以根据弯曲半径和管道长度计算弯曲角度:

GLfloat w0, w1, ang0, ang1, angle, x, y, xb, yb, zb;
int i, j;

int slices = 8;
GLfloat bend_radius = 1.0f;

GLfloat bend_angle, bend_ang0, bend_ang1;

bend_angle = bend_radius * height;
bend_ang0 = -bend_angle/2.0f;
bend_ang1 = bend_angle/2.0f;

for ( i = 0; i < slices; i++ )
{
w0 = (float)i / (float)slices;
w1 = (float)(i+1) / (float)slices;

ang0 = bend_ang0 + (bend_ang1-bend_ang0) * w0;
ang1 = bend_ang0 + (bend_ang1-bend_ang0) * w1;

glColor3f( 1.0f-w0, 0.0, w1 );
glBegin(GL_QUAD_STRIP);

for ( j = 0; j <= 360; ++ j )
{
angle = PI * (float)j * PI / 180.0f;
x = radius * cos(angle) + bend_radius;
y = radius * sin(angle);

xb = sin( ang0 ) * x;
yb = y;
zb = cos( ang0 ) * x;
glVertex3f( xb, yb, zb );

xb = sin( ang1 ) * x;
yb = y;
zb = cos( ang1 ) * x;
glVertex3f( xb, yb, zb );
}
glEnd();
}

对于下图,我激活了深度测试并更改了模型 View 矩阵:

void display(void)
{
glEnable( GL_DEPTH_TEST );
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glLoadIdentity();
glTranslatef(0.0f, -0.5f, -4.0f);
glRotatef(-90.0f, 1.0f, 0.0, 0.0f);

draw_cylinder(0.15, 2.0, 255, 160, 100);

glFlush();
}

关于c - OpenGL Glut C - 想要渲染弯曲的圆柱体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52930454/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com