opengl绘制齿轮

article/2025/8/29 11:51:59

1. 概述

高级计算机三维建模第二次小实习,利用opengl在提供的基础代码上绘制完整的齿轮。绘制思路如下图:
在这里插入图片描述

2. 注意事项

  1. p 0 , p 7 , p 6 , p 3 p_0,p_7,p_6,p_3 p0,p7,p6,p3这四点所组成的平面采取了三角形绘制的方式,绘制顺序为 p 7 → p 0 → p 6 → p 3 p_7\rightarrow p_0\rightarrow p_6\rightarrow p_3 p7p0p6p3,每一次循环中一次顺序绘制面,到下一次循环中的第一个点则为 p 5 → p 4 → p i p_5\rightarrow p_4\rightarrow p_i p5p4pi,这样,使用GL_TRIANGLE_STRIP进行绘制,即可连续绘制出齿轮一个面;
  2. 当使用glEnable(GL_CULL_FACE)时,绘制齿轮的反面时,重点需要注意,绘制点的顺序要由原来的逆时针变为顺时针(注:opengl绘制时,默认逆时针为正面),即顺序变为 p 0 → p 7 → p 3 → p 6 p_0\rightarrow p_7\rightarrow p_3\rightarrow p_6 p0p7p3p6,这样,当翻转齿轮时,才能够看见齿轮背面;或者不使用glEnable((GL_CULL_FACE);
  3. 记得添加法线,否则由于默认正面的原因,齿轮背面看起来是黑的,法线信息根据z轴(垂直于屏幕)来决定,齿轮正面朝外(即为+),背面朝内(即为-);
  4. 齿轮齿的法线比较麻烦,因为是旋转一周的,无法指定固定朝向。

3. 绘制结果与代码

3.1 齿轮结果图

在这里插入图片描述

3.2 完整代码

#include <GL/freeglut.h>
#include <stdlib.h>
#include <math.h>const double PI=3.14159265;GLfloat g_rotx = 20.0, g_roty = 30.0, g_rotz = 0.0, g_angle=0.0;
GLfloat g_modelPos[3] = {0, 0, -20};
GLfloat g_lightPos[4] = {15.0, 15.0, 10.0, 0.0};
GLfloat g_color1[4] =  {0.8, 0.1, 0.0, 1.0};
GLfloat g_color2[4] =  {0.0, 0.8, 0.2, 1.0};
GLfloat g_color3[4] =  {0.2, 0.2, 1.0, 1.0};bool g_bStartAnim = true;static void resize(int w, int h)
{glViewport(0,0,(GLsizei)w,(GLsizei)h);glMatrixMode(GL_PROJECTION) ;glLoadIdentity() ;gluPerspective(45.0,(GLfloat)w/(GLfloat)h,0.2,100.0) ;glMatrixMode(GL_MODELVIEW) ;glLoadIdentity() ;
}void init(void)
{glLightfv(GL_LIGHT0, GL_POSITION, g_lightPos);//glEnable(GL_CULL_FACE);glEnable(GL_LIGHTING);glEnable(GL_LIGHT0);glEnable(GL_DEPTH_TEST);
}/*Input:  inner_radius - radius of hole at centerouter_radius - radius at center of teethwidth - width of gearteeth - number of teethtooth_depth - depth of tooth */
void DrawGear(GLfloat inner_radius, GLfloat outer_radius, GLfloat width, GLint teeth, GLfloat tooth_depth)
{GLint i;GLfloat r0, r1, r2;GLfloat angle, da;GLfloat u, v, len;r0 = inner_radius;r1 = outer_radius - tooth_depth / 2.0;r2 = outer_radius + tooth_depth / 2.0;da = 2.0 * PI / teeth / 4.0;glShadeModel(GL_FLAT);glNormal3f(0.0, 0.0, 1.0);//Draw front faceglBegin(GL_TRIANGLE_STRIP);for (i = 0; i <= teeth; i++){angle = i * 2.0 * PI / teeth;glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5);glNormal3f(0,0,1);glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5);glNormal3f(0,0,1);glVertex3f(r0 * cos(angle + 3 * da), r0 * sin(angle + 3 * da), width * 0.5);glNormal3f(0,0,1);glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), width * 0.5);glNormal3f(0,0,1);}glEnd();//Draw front sides of teethglBegin(GL_QUADS);da = 2.0 * PI / teeth / 4.0;for (i = 0; i < teeth; i++){angle = i * 2.0 * PI / teeth;glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5);glNormal3f(0,0,1);glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), width * 0.5);glNormal3f(0,0,1);glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), width * 0.5);glNormal3f(0,0,1);glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), width * 0.5);glNormal3f(0,0,1);}glEnd();//Draw back faceglBegin(GL_TRIANGLE_STRIP);for (i = 0; i <= teeth; i++){angle = i * 2.0 * PI / teeth;/*glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0);glNormal3f(0,0,-1);glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0);glNormal3f(0,0,-1);glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), width * 0);glNormal3f(0,0,-1);glVertex3f(r0 * cos(angle + 3 * da), r0 * sin(angle + 3 * da), width * 0);glNormal3f(0,0,-1);*/glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0);glNormal3f(0,0,-1);glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0);glNormal3f(0,0,-1);glVertex3f(r0 * cos(angle + 3 * da), r0 * sin(angle + 3 * da), width * 0);glNormal3f(0,0,-1);glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), width * 0);glNormal3f(0,0,-1);}glEnd();//Draw back sides of teethglBegin(GL_QUADS);da = 2.0 * PI / teeth / 4.0;for (i = 0; i < teeth; i++){angle = i * 2.0 * PI / teeth;glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), width * 0);glNormal3f(0,0,-1);glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0);glNormal3f(0,0,-1);glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), width * 0);glNormal3f(0,0,-1);glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), width * 0);glNormal3f(0,0,-1);}glEnd();//xiaoyuanglBegin(GL_QUAD_STRIP);for(i = 0; i <= teeth; i++){angle = i * 2.0 * PI / teeth;glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0);glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5);glVertex3f(r0 * cos(angle+3*da), r0 * sin(angle+3*da), width * 0);glVertex3f(r0 * cos(angle+3*da), r0 * sin(angle+3*da), width * 0.5);}glEnd();//dayuanglBegin(GL_QUAD_STRIP);for(i = 0; i <= teeth; i++){angle = i * 2.0 * PI / teeth;glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5);glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0);glVertex3f(r1 * cos(angle+3*da), r1 * sin(angle+3*da), width * 0.5);glVertex3f(r1* cos(angle+3*da), r1 * sin(angle+3*da), width * 0);}glEnd();//shangchiglBegin(GL_QUADS);for(i = 0; i < teeth; i++){angle = i * 2.0 * PI / teeth;glVertex3f(r2 * cos(angle+da), r2 * sin(angle+da), width * 0.5);glNormal3f(1,0,0);glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5);glNormal3f(1,0,0);glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0);glNormal3f(1,0,0);glVertex3f(r2* cos(angle+da), r2 * sin(angle+da), width * 0);glNormal3f(1,0,0);}glEnd();//xiachiglBegin(GL_QUADS);for(i = 0; i < teeth; i++){angle = i * 2.0 * PI / teeth;glVertex3f(r2* cos(angle+2*da), r2 * sin(angle+2*da), width * 0);glVertex3f(r1 * cos(angle+3*da), r1 * sin(angle+3*da), width * 0);glVertex3f(r1 * cos(angle+3*da), r1 * sin(angle+3*da), width * 0.5);glVertex3f(r2 * cos(angle+2*da), r2 * sin(angle+2*da), width * 0.5);}glEnd();//zuiwaimianglBegin(GL_QUADS);for(i = 0; i < teeth; i++){angle = i * 2.0 * PI / teeth;glVertex3f(r2 * cos(angle+2*da), r2 * sin(angle+2*da), width * 0.5);glVertex3f(r2 * cos(angle+1*da), r2 * sin(angle+1*da), width * 0.5);glVertex3f(r2* cos(angle+1*da), r2 * sin(angle+1*da), width * 0);glVertex3f(r2 * cos(angle+2*da), r2 * sin(angle+2*da), width * 0);}glEnd();}static void display(void)
{glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);if(g_bStartAnim)g_angle = 30*glutGet(GLUT_ELAPSED_TIME) / 1000.0;glLoadIdentity() ;glTranslatef(g_modelPos[0], g_modelPos[1], g_modelPos[2]);glPushMatrix();glRotatef(g_rotx, 1.0, 0.0, 0.0);glRotatef(g_roty, 0.0, 1.0, 0.0);glRotatef(g_rotz, 0.0, 0.0, 1.0);glPushMatrix();glTranslatef(-3.0, -2.0, 0.0);glRotatef(g_angle, 0.0, 0.0, 1.0);glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, g_color1);DrawGear(1.0, 4.0, 1.0, 20, 0.7);glPopMatrix();glPopMatrix();glutSwapBuffers();
}static void key(unsigned char key, int x, int y)
{switch (key){case 27 :exit(0);break;case 'w':g_rotx += 5;break;case 's':g_rotx -= 5;break;case 'a':g_roty += 5;break;case 'd':g_roty -= 5;break;case 'q':g_rotz += 5;break;case 'e':g_rotz -= 5;break;case 'z':g_modelPos[2] += 1;break;case 'x':g_modelPos[2] -= 1;break;case ' ':g_bStartAnim = !g_bStartAnim;break;}glutPostRedisplay();
}static void idle(void)
{glutPostRedisplay();
}int main(int argc, char *argv[])
{glutInit(&argc, argv);glutInitWindowSize(800, 600);glutInitWindowPosition(10,10);glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);glutCreateWindow("Shapes");glutReshapeFunc(resize);glutDisplayFunc(display);glutKeyboardFunc(key);glutIdleFunc(idle);glClearColor(1, 1, 1, 1);init();glutMainLoop();return 0;
}

http://chatgpt.dhexx.cn/article/Y4JUuKMO.shtml

相关文章

c语言编程齿轮模数选择,如何画齿轮,一看就懂

马上注册&#xff0c;结交更多好友&#xff0c;享用更多功能&#xff01; 您需要 登录 才可以下载或查看&#xff0c;没有帐号&#xff1f;立即注册 x 在网上找到的&#xff0c;昨天看了一下&#xff0c;就画出来了 齿轮的画法 一、预备知识&#xff1a; 画一个M4&#xff0c;Z…

齿轮-机械原理基础

斜齿轮比直齿轮&#xff1a;传动能力强&#xff08;接触范围大&#xff09;&#xff0c;噪音小&#xff0c;转动平稳&#xff0c;制造成本相当&#xff0c;会产生轴向力。 1.斜齿圆柱齿轮在啮合时&#xff0c;啮合接触线是由短到长再到短&#xff1b;直齿轮是整体进入啮合整体…

用SW绘制渐开线直齿圆柱齿轮

用Solidworks绘制齿轮可以使用SW里面提供的标准库&#xff0c;经过笔者实测&#xff0c;发现并不是很好用&#xff1a;&#xff09;绘制齿轮大家可能仅仅是随手画一下&#xff0c;看着像齿轮就行了&#xff0c;但是如何正确规范的绘制一个渐开线圆柱齿轮&#xff0c;并能实现3D…

使用SOLIDWORKS方程式绘制渐开线齿轮

在SOLIDWORKS中&#xff0c;有时需要在参数之间建立关联&#xff0c;但这种关联却无法通过使用几何关系或常规的建模技术来实现。这时我们就可以使用方程式来建立模型中尺寸之间的数学关系。在方程式驱动的曲线中最经典的就是渐开线了&#xff0c;这也是绘制齿轮时不可或缺的线…

简单齿轮步骤

1.首先画个圆&#xff0c;填充颜色&#xff0c;然后选择移动工具&#xff0c;选择图层&#xff0c;如果没有变换控件&#xff0c;就在左上角打开显示变换控件&#xff0c;CTRLR&#xff0c;拉辅助线&#xff0c;拉到圆的中心点&#xff0c; 2.然后用矩形工具画个矩形&#xff0…

SOLIDWORKS Simulation齿轮啮合分析

齿轮的工况如下&#xff1a;一组齿轮进行咬合&#xff0c;模拟大齿轮卡死状态&#xff0c;小齿轮轴心扭矩5N.M,材料为合金钢&#xff0c;计算此状态下&#xff0c;齿轮整体的应力分布及变形分析。使用的仿真软件为SOLIDWORKS Simulation&#xff08;此次分析为设置方法指导&…

齿轮的基本知识

齿轮是应用非常广泛的传动件,用以传递动力和运动,并具有改变转速和转向的作用。依据两齿合齿轮轴线在空间的相对位置不同,常见的齿轮传动可分为下列三种形式(图9-43): (1) 圆柱齿轮传动——有于两平行之间的传动。 (2) 圆锥齿轮传动——用于两相之间的传动。 (3) 蜗杆蜗…

工程制图-齿轮

认识齿轮 轮泵工作原理很简单&#xff0c;就是一个主动轮一个从动轮&#xff0c;两个齿轮参数相同&#xff0c;在一个泵体内做旋转运动。在这个壳体内部形成类似一个“8”字形的工作区&#xff0c;齿轮的外径和两侧都与壳体紧密配合&#xff0c;传送介质从进油口进入&#xff…

手把手教你solidworks中的齿轮配合

手把手教你solidworks中的齿轮配合 1.建立装配图&#xff0c;在装配体中导入两个齿轮。 2.把齿轮1固定改为浮动 3.如下图所示选中隐藏/显示主要基准面。 4.选中上视基准面和右视基准面&#xff0c;点击参考面之下的基准轴如下图所示。打上勾。建立基准轴后&#xff0c;点击…

Blender齿轮制作

1 齿的尺寸及间距 如图&#xff1a; 2 计算 2.1 齿的个数 个数 周长 / 1.5 。 例1&#xff1a;直径60&#xff0c;周长 188.5&#xff0c;个数 188.5 / 1.5 125个。 例2&#xff1a;直径80&#xff0c;周长 251.33&#xff0c;个数 251.33 / 1.5 167个。 2.2 齿的…

SolidWorks快速绘制齿轮模型

前言&#xff1a;齿轮的建模计算相对比较复杂&#xff0c;利用工具绘制基本图形后再建模相对较快。 该方法是大学期间的一位高手传授给我的&#xff0c;工作后没有机会用一直放置&#xff0c;偶然间需要用想起来&#xff0c;记录一下&#xff0c;感谢我的朋友。 一、绘图工具 …

手把手教你齿轮齿条配合

手把手教你齿轮齿条配合 1.首先将齿轮齿条导入装配体中。显示观阅基准面。 2.同时选中上视基准面和右视基准面插入基准轴。 3.点击观阅基准轴。 4.点击齿轮使其浮动。 5.点击齿轮和轴线同轴心。 6.点击齿轮正面和前视基准面重合。 7.点击齿轮测量它的直径为30mm 8.…

Solidworks制作齿轮传动过程

端面固定&#xff1a;配合到同一平面 齿轮啮合 2.1做平面&#xff0c;与齿条基准面距离为齿轮分度圆半径 2.2齿轮中心轴与新平面重合 2.3 机械配合—齿轮小齿条配合 3.建模后的装配体作为总装图的零件时&#xff0c;若想让他继续可以滚动 3.1 在齿轮装配图中&#xff0c…

solidworks绘制齿轮、机械爪(齿轮设计基础知识)

文章目录 前言齿轮相关参数齿轮参数整定Solidworks绘制齿轮Solidworks绘制机械爪Solidworks多齿轮转动配合设置 前言 本人非机械类学生&#xff0c;最近需要用Solidworks画一个机械爪子才开始走马观花的看一些齿轮设计相关的资料。所以本文有任何表述不严谨或错误的地方都欢迎…

ps齿轮制作

1.首先画个圆&#xff0c;填充颜色&#xff0c;然后选择移动工具&#xff0c;选择图层&#xff0c;如果没有变换控件&#xff0c;就在左上角打开显示变换控件&#xff0c;CTRLR&#xff0c;拉辅助线&#xff0c;拉到圆的中心点&#xff0c; 2.然后用矩形工具画个矩形&#xff0…

齿轮齿条平动模组的制作

1. 运动功能说明 齿轮齿条平动模组的主要运动方式为直流电机带动2个齿轮沿着齿条平行方向前进、后退。 2. 结构说明 本模组主要是由直流电机、齿轮、齿条、光轴、滑块、机架等组成。 3. 电子硬件 在这个示例中&#xff0c;我们采用了以下硬件&#xff0c;请大家参考&#xff1…

SolidWorks手工绘制齿轮

齿轮零件在SolidWorks中一般有两种方式可以制作&#xff0c;其一&#xff0c;是通过零件配置直接设置参数即可生成齿轮零件。其二&#xff0c;通过自己手动绘制也可以生成齿轮零件。本文将记录手动绘制齿轮零件的详细步骤。最终会附上作者学习来源链接&#xff0c;大家也可直接…

MATLAB中subplot函数的使用

subplot(m,n,p)函数 subplot函数是一个将多个图画到一个平面上的工具。其中m,n表示行和列的个数&#xff08;即图有m行n列&#xff09;&#xff0c;p表示图形所在的位置&#xff0c;p1表示从左至右从上之下第一个位置。 例如&#xff1a; 在下面的程序中&#xff0c;用subplot…

MATLAB中subplot函数的用法

分步骤讲解 第一步 在画布上创建4个图像&#xff0c;&#xff08;2行2列&#xff09;并现实第一个图像 命令 subplot(2,2,1); 结果 第二步 命令 在画布上创建4个图像&#xff0c;&#xff08;2行2列&#xff09;并现实第二个图像 subplot(2,2,2); 结果 第三步 在画布上创建4个…