用OpenGL 的接口直接创出对应的实心球,圆锥体,圆环。效果如下:

头文件

需要导入相应的GL 库:

可以根据“+” 增加  slices 以Z轴上线段为直径分布的圆周线的条数(将Z轴看成地球的地轴,类似于经线)stacks  围绕在Z轴周围的线的条数(类似于地球上纬线)

增加效果:

减少效果:

完整代码:

#include "stdafx.h"
#include "Windows.h"
#include "math.h"
#include "stdlib.h"
#include "gl/GL.h"
#include "gl/GLU.h"
#include "gl/glut.h"static int slices = 16;
static int stacks = 16;static void resize(int width, int height)
{const float ar = (float)width / (float)height;glViewport(0, 0, width, height);glMatrixMode(GL_PROJECTION);glLoadIdentity();glFrustum(-ar, ar, -1.0, 1.0, 2.0, 100.0);glMatrixMode(GL_MODELVIEW);glLoadIdentity();
}static void display()
{const double t = glutGet(GLUT_ELAPSED_TIME) / 1000.0;const double a = t*90.0;glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glColor3d(0, 1, 0);glPushMatrix();glTranslated(-2.4, 1.2, -6);glRotated(60, 1, 0, 0);glRotated(a, 0, 0, 1);glutSolidSphere(1, slices, stacks);//实心球glPopMatrix();glPushMatrix();glTranslated(0, 1.2, -6);glRotated(60, 1, 0, 0);glRotated(a, 0, 0, 1);glutSolidCone(1, 1, slices, stacks);//实心圆锥体glPopMatrix();glPushMatrix();glTranslated(2.4, 1.2, -6);glRotated(60, 1, 0, 0);glRotated(a, 0, 0, 1);glutSolidTorus(0.2, 0.8, slices, stacks);//实心圆环环glPopMatrix();glPushMatrix();glTranslated(-2.4, -1.2, -6);glRotated(60, 1, 0, 0);glRotated(a, 0, 0, 1);glutWireSphere(1, slices, stacks);//网格球体glPopMatrix();glPushMatrix();glTranslated(0, -1.2, -6);glRotated(60, 1, 0, 0);glRotated(a, 0, 0, 1);glutWireCone(1, 1, slices, stacks);//网格圆锥体glPopMatrix();glPushMatrix();glTranslated(2.4, -1.2, -6);glRotated(60, 1, 0, 0);glRotated(a, 0, 0, 1);glutWireTorus(0.2, 0.8, slices, stacks);//网格圆环glPopMatrix();glutSwapBuffers();
}static void key(unsigned char key, int x, int y)
{switch (key){case 27:case 'q':exit(0);break;case '+':slices++;stacks++;break;case '-':if (slices>3 && stacks>3){slices--;stacks--;}break;}glutPostRedisplay();
}static void idle()
{glutPostRedisplay();
}const GLfloat light_ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f };
const GLfloat light_diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_position[] = { 2.0f, 5.0f, 5.0f, 0.0f };const GLfloat mat_ambient[] = { 0.7f, 0.7f, 0.7f, 1.0f };
const GLfloat mat_diffuse[] = { 0.8f, 0.8f, 0.8f, 1.0f };
const GLfloat mat_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat high_shininess[] = { 100.0f };/**//* Program entry point */int main(int argc, char *argv[])
{glutInit(&argc, argv);glutInitWindowSize(640, 480);glutInitWindowPosition(10, 10);glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);glutCreateWindow("FreeGLUT Shapes");glutReshapeFunc(resize);glutDisplayFunc(display);glutKeyboardFunc(key);glutIdleFunc(idle);glClearColor(1, 1, 1, 1);glEnable(GL_CULL_FACE);glCullFace(GL_BACK);glEnable(GL_DEPTH_TEST);glDepthFunc(GL_LESS);glEnable(GL_LIGHT0);glEnable(GL_NORMALIZE);glEnable(GL_COLOR_MATERIAL);glEnable(GL_LIGHTING);glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);glLightfv(GL_LIGHT0, GL_POSITION, light_position);glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);glutMainLoop();return EXIT_SUCCESS;
}

OpenGL---实例 球体 画圆锥相关推荐

  1. OpenGL绘制球体

    OpenGL绘制球体 于(0,0,0) 绘制一个半径R=1 的球体函数: sphere_entry void sphere_entry(int du, int dv){float gu = 3.141 ...

  2. OpenGL学习-球体和phong光照模型

    OpenGL学习-球体和phong光照模型 开发环境搭建参考:https://lexiaoyuan.blog.csdn.net/article/details/120059213 通用配置步骤 Vis ...

  3. 初学画素描如何把球体画好

    本文由"学美术上美术集网校"原创,图片素材来自网络,仅供学习分享 初学画素描如何把球体画好?球体是我们从平面意识过渡到三维立体意识中最基础的形体也是典型的形体.我们生活中任何事物都 ...

  4. matlab三维显示圆锥,matlab画圆锥曲面

    应用 MATLAB 绘制二次曲面图 1.用 surf 工 mesh 函数绘图 Surf 函数绘制的是三维表面图,mesh 函数绘制的是三维网格图,当二次曲面方程是标准方 程时,原方程式...... 利 ...

  5. 手把手教你画圆锥渐变

    前言 昨天公司培训canvas相关内容,然后培训完还留下一道homework,觉得挺有意思的,特来与大家分享分享.大家可以先不看我的实现,自己尝试试试,还是可以学到不少知识的. 题目内容 初看题目内容 ...

  6. matlab中如何画圆锥,使用Matlab画出圆台圆锥圆柱

    用Matlab画圆柱圆台圆锥 自己建一个M文件,命名任意,如tu.m 在命令窗口输入:tu %以下为tu.m文件 clc clear all %圆柱 [X,Y,Z]=cylinder(15.7,20) ...

  7. 用java编写圆锥_用java中的graphics画圆锥的代码

    展开全部 圆锥就32313133353236313431303231363533e4b893e5b19e31333337616564是一个三角形+一个椭圆.只要算好三角形和椭圆 的坐标就可以了impo ...

  8. 用python画圆锥_用python画一幅美瞳,今日份来自程序员的浪漫

    如果说,眼睛是心灵的窗户,那么,美瞳就是心灵的彩窗,就像下图中这样. 而我们今天所要挑战的,就是用python画美瞳,而且是五分钟之内画三百副争奇斗艳.各领风骚.绝不重样的美瞳.作为这颗地球上最纯情的 ...

  9. OpenGL绘制球体模拟自由落体运动(基于Qt)

    自由落体的物理公式想必大家都清楚(y=vt+0.5gt^2). 但是用程序如何模拟这个过程呢? 1.其中比较关键的是设定一个计时器,在一个视觉暂留时间段(dt=0.02s)内根据小球的位置坐标绘制小球 ...

最新文章

  1. 哈工大pyltp包安装过程
  2. C语言指针函数MFC版Demo
  3. 页面上显示的带有乱码名称的js文件是怎么回事?
  4. oracle 分组后取每组第一条数据
  5. Vue 组件间通信六种方式
  6. 【转载保存】Lucene 实战教程第六章 Lucene 的精确、包含、集合查询 Query 的简单使用
  7. 通过历史控制文件恢复Oracle数据库,只需这10步
  8. c++ dll返回容器_Windows x86 Shellcode开发:寻找Kernel32.dll地址
  9. python字符串比较大小_Python 比较两个字符串大小
  10. 汇编语言和C语言单片机哪个更好用?
  11. ASP.NET程序中常用的三十一种代码
  12. 【Love2d从青铜到王者】第十二篇:Love2d之碰撞检测(Detecting collision)
  13. 防止 rm -rf / 删根跑路——使用 safe-rm 替代 rm
  14. 【Nginx】关于二级域名配置https
  15. 微信支付二维码上添加logo
  16. Exception类
  17. 矩阵导数(Matrix Differentia)
  18. http statusCode(状态码) 200、300、400、500序列
  19. C# 后台发送Post Get请求 Json数据或表单数据
  20. POI读写超大数据量Excel,解决超过几万行而导致内存溢出的问题(附源码)

热门文章

  1. 正则表达式re.S与re.M的区别
  2. 路演活动平台,怎么报名参加创业路演?
  3. 移动端、PC端 网页特效
  4. crc16的c语言函数 计算ccitt_CRC16-CCITT 的算法
  5. 微信为什么使用 SQLite 保存聊天记录
  6. 网络攻防--网络防御技术(一)
  7. log4j2 2.14.0之前的版本出现重大漏洞
  8. vue 实现评论回复功能
  9. 《像三国》3D动效制作经验分享
  10. Redis(1)入门指令