glutSolidSphere 用例

简介:

glutSolidSphere是GLUT工具包中的一个函数,该函数用于渲染一个球体。球体球心位于

原点。在OpenGL中默认的原点就是窗口客户区的中心。


1 怎么将球体进行移动?

可以使用glPushMatrix,glPopMatrix保存一个移位矩阵,就可以移动球体

    glPushMatrix();

    glTranslatef(1.0, 0.0, 0.0);


    GLfloat mat_ambient[] = { 0.021500, 0.174500, 0.021500, 0.550000};

    GLfloat mat_diffuse[] = { 0.075680, 0.614240, 0.075680, 0.550000};

    GLfloat mat_specular[] = { 0.633000, 0.727811, 0.633000, 0.550000 };

    GLfloat mat_shininess[] = { 76.800003}; //材质RGBA镜面指数,数值在0~128范围内

    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, mat_shininess);


    glutSolidSphere (1.0, 40, 50);    //半径为 1,40 条纬线,50 条经线

    glPopMatrix();

    glFlush (); 


2 已经设置材质,光照,球体还是黑色的平面图?

必须设置投影矩阵,建立裁剪的矩阵区域,才能够看到立体,这时候需要调用glOrtho

/* 定义 GLUT 的 reshape 函数,w、h 分别是输出图形的窗口的宽和高*/ 

void reshape (int w, int h) 

  glViewport (0, 0, (GLsizei) w, (GLsizei) h); 

  glMatrixMode (GL_PROJECTION); 

  glLoadIdentity ( ); 

  if (w <= h) 

    glOrtho (-1.5, 1.5, -1.5 * ( GLfloat ) h / ( GLfloat ) w, 

    1.5* ( GLfloat ) h / ( GLfloat ) w, -10.0, 10.0 ); //创建平行视景体

  else 

    glOrtho (-1.5 * ( GLfloat ) w / ( GLfloat ) h,1.5 * ( GLfloat ) 

    w/( GLfloat ) h, -1.5, 1.5, -10.0, 10.0); 

  glMatrixMode ( GL_MODELVIEW ); 

  glLoadIdentity ( ) ; 


代码

# include < GL/glut.h > 

/* 初始化材料属性、光源属性、光照模型,打开深度缓冲区等 */ 

void init(void) 

  GLfloat light_position [ ] = { 0., 1.5, 1.5, 0.0 }; 

  glClearColor ( 0.0, 0.0, 1.0, 0.0 ); //设置背景色为蓝色

  glShadeModel ( GL_SMOOTH ); 

  glLightfv ( GL_LIGHT0, GL_POSITION, light_position); 



  glEnable (GL_LIGHTING); 

  glEnable (GL_LIGHT0); 

  glEnable (GL_DEPTH_TEST); 

/*调用 GLUT 函数,绘制一个球*/ 

void display ( void ) 

  glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

  {

    glPushMatrix();

    glTranslatef(1.0, 0.0, 0.0);


    GLfloat mat_ambient[] = { 0.021500, 0.174500, 0.021500, 0.550000};

    GLfloat mat_diffuse[] = { 0.075680, 0.614240, 0.075680, 0.550000};

    GLfloat mat_specular[] = { 0.633000, 0.727811, 0.633000, 0.550000 };

    GLfloat mat_shininess[] = { 76.800003}; //材质RGBA镜面指数,数值在0~128范


围内

    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, mat_shininess);


    glutSolidSphere (1.0, 40, 50);    //半径为 1,40 条纬线,50 条经线

    glPopMatrix();

    glFlush (); 

  }


  {

    glPushMatrix();

    glTranslatef(-1.0, 0.0, 0.0);


    GLfloat mat_ambient[] = {  0.247250, 0.199500, 0.074500, 1.000000};

    GLfloat mat_diffuse[] = { 0.751640, 0.606480, 0.226480, 1.000000};

    GLfloat mat_specular[] = { 0.628281, 0.555802, 0.366065, 1.000000 };

    GLfloat mat_shininess[] = { 51.200001}; //材质RGBA镜面指数,数值在0~128范


围内

    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, mat_shininess);


    glutSolidSphere (1.0, 40, 50);    //半径为 1,40 条纬线,50 条经线

    glPopMatrix();

  }


  glFlush (); 

/* 定义 GLUT 的 reshape 函数,w、h 分别是输出图形的窗口的宽和高*/ 

void reshape (int w, int h) 

  glViewport (0, 0, (GLsizei) w, (GLsizei) h); 

  glMatrixMode (GL_PROJECTION); 

  glLoadIdentity ( ); 

  if (w <= h) 

    glOrtho (-1.5, 1.5, -1.5 * ( GLfloat ) h / ( GLfloat ) w, 

    1.5* ( GLfloat ) h / ( GLfloat ) w, -10.0, 10.0 ); //创建平行视景体

  else 

    glOrtho (-1.5 * ( GLfloat ) w / ( GLfloat ) h,1.5 * ( GLfloat ) 

    w/( GLfloat ) h, -1.5, 1.5, -10.0, 10.0); 

  glMatrixMode ( GL_MODELVIEW ); 

  glLoadIdentity ( ) ; 

int main(int argc, char** argv) 

  glutInit (&argc, argv);     // GLUT 环境初始化

  glutInitDisplayMode (GLUT_SINGLE |GLUT_RGB |GLUT_DEPTH); // 显示模式初始化

  glutInitWindowSize (300, 300);       // 定义窗口大小

  glutInitWindowPosition (100, 100);   // 定义窗口位置  

  glutCreateWindow ( argv [ 0 ] );   // 显示窗口,窗口标题为执行函数名

  init( );

  glutDisplayFunc ( display );  // 注册 OpenGL 绘图函数(一种特殊的调用方式,下


同) 

  glutReshapeFunc ( reshape );   // 注册窗口大小改变时的响应函数

  glutMainLoop( );      // 进入 GLUT 消息循环,开始执行程序

  return 0; 


    本文转自fengyuzaitu 51CTO博客,原文链接:http://blog.51cto.com/fengyuzaitu/1894968,如需转载请自行联系原作者




相关文章
|
3月前
|
自然语言处理 搜索推荐 测试技术
阿里云大模型的应用例
阿里云大模型在智能信息处理领域取得显著成果,以深言科技的“深言达意”产品为例。该平台基于阿里云PAI高效训练大规模模型,利用云端GPU集群实现资源最优利用,达到近100%的GPU计算使用率。产品通过自研大模型并针对词句检索任务微调,解决特定场景的信息处理需求。结合大语言模型与检索能力,“深言达意”支持自然语言交互,并能精准定位用户查询,避免知识性错误。深言科技还通过数据反馈循环不断优化模型,提升服务个性化与准确性。在阿里云的支持下,该平台展示了高效的信息处理与交互能力,为用户提供创新智能信息服务。
85 1
|
7月前
|
安全 测试技术 数据安全/隐私保护
设计测试用例
设计测试用例
49 0
|
算法 测试技术
需求不明确时,如何设计测试用例?
需求不明确时,如何设计测试用例?
136 0
mqc
|
jenkins 测试技术 持续交付
自动化测试 之 “好用例、坏用例”
自动化测试的重要性显而易见,但自动化测试又无法解决所有问题,所以说完全依赖自动化是不可能的,但完全没有自动化是万万不能。在软件开发项目中,重度依赖人力进行持续回归是一件非常枯燥的重复工作。企业需要花费大量的时间和金钱来维持这样一支队伍以保证产品质量,而队伍中的同学在每天重复劳动的工作之下,也丝毫得不到成长,看不到方向。
mqc
4296 0
|
测试技术
浅谈功能测试用例模板设计
实际项目中,一个测试用例有多个执行步骤,每个步骤可能有不同结果,如步骤 1 通过,步骤 2 失败,步骤 3 被步骤 2 中的失败所阻塞,那么该测试状态如何?单纯指出这个测试用例阻塞或失败都将遗漏重要的信息。
1499 0
功能测试用例的书写方式
简而言之,所有你能得到的项目文档,都尽量拿到。 从所得到的资料中,分解出若干小的“功能点”,理解“功能点”,编写相应的测试用例。
1563 0
|
测试技术
测试用例设计
一、为什么要使用测试用例 1、理清思路,避免遗漏 如果我们测试的项目大而复杂,我们可以把项目功能细分,根据每一个功能通过编写用例的方式来整理我们测试系统的思路,避免遗漏掉要测试的功能点。 2、跟踪测试进展 通过编写测试用例,执行测试用例,我们可以很清楚的知道我们的测试进度。
1412 0