//#include <gl\glut.h>
#include <GL\glut.h>
#include <iostream>

using namespace std;

float rtri;
float rquad;

GLfloat points0[5][3] = { {0,1,0},{-1,-1,1},{1,-1,1},{1,-1,-1},{-1,-1,-1} };
GLfloat points1[8][3] = { {1,1,-1},{-1,1,-1},{-1,1,1},{1,1,1},{1,-1,1},{-1,-1,1},{-1,-1,-1},{1,-1,-1} };
//四棱锥颜色
GLfloat Colors0[4][3] = { {1,0,0},{0,1,0},{0,0,1},{1,1,0} };
//立方体颜色
GLfloat Colors1[6][3] = { {0,1,0},{1,0.5,0},{1,0,0},{1,1,0},{0,0,1},{1,0,1} };

//四棱锥顶点序列号
int vertice0[4][3] = { {0,1,2},{0,2,3},{0,3,4},{0,4,1} };
//立方体顶点序列号
int vertice1[6][4] = { {0,1,2,3},{4,5,6,7},{3,2,5,4},{7,6,1,0},{2,1,6,5},{0,3,4,7} };

void InitGl(GLvoid)
{
  glShadeModel(GL_SMOOTH);
  glClearColor(1.0f,1.0f,1.0f,1.0f);
  glClearDepth(1.0f);

  glEnable(GL_DEPTH_TEST);
  glDepthFunc(GL_LEQUAL);
  glEnable(GL_COLOR_MATERIAL);

  glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);
}

/*
创建棱锥体
*/
void CreatePyramid()
{
  glBegin(GL_TRIANGLES);
  for (int i=0;i<4;i++)
  {
    glColor3fv(Colors0[i]);
    for (int j=0;j<3;j++)
    {
      int VtxId = vertice0[i][j];
      glVertex3fv(points0[VtxId]);
    }
  }

glEnd();
  //构建底面
glBegin(GL_QUADS);
glColor3f(1.0f,1.0f,1.0f);

for (int k=0;k<4;k++)
  {
   glVertex3fv(points0[k]);
  }
glEnd();
}

/*
创建立方体
*/
void CreateCube()
{
glBegin(GL_QUADS);
for (int i=0;i<6;i++)
  {
   glColor3fv(Colors1[i]);
   for (int j=0;j<4;j++)
    {
     int VtxId = vertice1[i][j];
     glVertex3fv(points1[VtxId]);
    }
  }
  glEnd();
}

void display(void)
{
  glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  glLoadIdentity();
  glPushMatrix();

  glTranslatef(-1.5f,0.0f,-6.0f);//平移至左侧
  glRotatef(rtri,0.0f,1.0f,0.0f);//旋转一个角度
  CreatePyramid();//创建三棱锥

  glLoadIdentity();//将矩阵归一化回原样
  glTranslatef(1.5f,0.0f,-6.0f);//平移至右侧
  glRotatef(rquad,1.0f,0.0f,0.0f);//旋转一个角度

  CreateCube();//创建立方体
  glPopMatrix();//
  
  rtri += 0.02f;//修改三角塔旋转角度
  rquad -= 0.05f;//修改立方体旋转角度
  glutSwapBuffers();
}

void reshape(int width,int height)
{
  if (height == 0)
  {
    height = 1;
  }
  
  glViewport(0,0,width,height);
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();

  gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();
}

void main(int argc,char** argv)
{
  glutInit(&argc,argv);
  glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE);
  glutInitWindowSize(600,460);

  glutCreateWindow("椎体和立方体");
  InitGl();
  glutDisplayFunc(display);

  glutReshapeFunc(reshape);
  glutIdleFunc(display);
  glutMainLoop();
}

运行效果:

Opengl创建几何实体——四棱锥和立方体的更多相关文章

  1. Revit API创建几何实体Solid并找到与之相交的元素

    几何实体的创建方法之一:构成封闭底面,指定拉伸方向与拉伸高度.GeometryCreationUtilities ;         , pt.Y - dBoxLength / , pt.Z);    ...

  2. Java练习 SDUT-3337_计算长方体、四棱锥的表面积和体积

    计算长方体.四棱锥的表面积和体积 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 计算如下立体图形的表面积和体积. 从图 ...

  3. 使用Myeclipse为数据表创建hibernate实体对象

    hibernate是orm框架的一种,orm即Object Relational Mapping,对象映射关系,其主要作用是将数据库(mysql,mssql,oracle)的对象转换为具体编程语言(如 ...

  4. Civil 3D 二次开发 创建Civil 3D 对象—— 01 —— 创建几何空间点

    这一小节,我们创建派生于CivilCreateEntityDemo的类CivilCreateCogoPoint,来创建几何空间点. 1 创建类并添加字段及方法 首先在项目资源管理器中向本项目中添加类, ...

  5. Delphi中动态创建窗体有四种方式

    Delphi中动态创建窗体有四种方式,最好的方式如下: 比如在第一个窗体中调用每二个,主为第一个,第二个设为动态创建 Uses Unit2; //引用单元文件 procedure TForm1.But ...

  6. [Xcode 实际操作]七、文件与数据-(11)数据持久化存储框架CoreData的使用:创建CoreData实体并插入数据

    目录:[Swift]Xcode实际操作 本文将演示[CoreData]数据持久化存储框架的使用. 点击[Create a new Xcode project]创建一个新的项目 ->[Single ...

  7. linux创建文件的四种方式(其实是两种,强行4种)

    linux创建文件的四种方式: 1.vi newfilename->i->编辑文件->ESC->:wq! 2.touch newfilename 3.cp sourcePath ...

  8. Java创建线程的四种方式

    Java创建线程的四种方式 1.继承Thread类创建线程 定义Thread类的子类,并重写该类的run方法,run()方法的内容就是该线程执行的内容 创建Thread子类的实例,即创建了线程对象. ...

  9. ArcGIS 重新创建几何服务(GeometryService)

    #参考官方网址:http://enterprise.arcgis.com/zh-cn/server/10.4/administer/windows/re-creating-the-geometry-s ...

随机推荐

  1. 【VS2013生成DirectX Tutorials时遇到的错误】无法解析的外部符号 _D3D10CreateDeviceAndSwapChain@32

     本文为大便一箩筐的原创内容,转载请注明出处,谢谢:http://www.cnblogs.com/dbylk/p/3696472.html 今天尝试编译DirectX10中的一个Turorials时, ...

  2. iOS-文本转语音

    - 文本转语音 iOS提供了一个类AVSpeechSynthesizer来实现文本到语音的功能, 即读出文字 直接上代码: AVSpeechSynthesizer *synthesizer = [[A ...

  3. Hash Join 一定是选择小表作为驱动表吗

    原来自己也是一直认为oralce会选择小表作为驱动表,以前一直也没注意,今天看了落落大神的实验,才发现,oralce查询时不一定选择小表作为驱动表. 如果对大表增加了约束,大表也会作为驱动表. 实验见 ...

  4. Redis集群部署3.0

    我用的Mac的终端 ------------------------- 1.Redis简介 centos(5.4)  Redis是一个key-value存储系统.和Memcached类似,但是解决了断 ...

  5. CSS3 之 RGBa 可透明颜色

    在 CSS3 中,增加了一个 opacity 属性,允许开发者设置元素的透明度,现在 opacity 已被主流的现代浏览器支持,但 opacity 会把被设置的元素及其子元素同时设置为同一个透明度,这 ...

  6. 制作导航菜单分隔线的总结:用css3

    经过百度统计中国中使用谷歌浏览器比较多,我很奇怪,我身边的同事很少用谷歌,唯一我用谷歌的原因就是看上它调试能力和模拟手机. 下面是我个人制作的 预览用谷歌浏览器. <!doctype html& ...

  7. Scala极速入门

    摘要 当面向对象遇到函数式编程,这就是Scala.简练的语言描述与简单的例子相辅相成,希望能够对大家学习Scala有所帮助. scala 入门 定义 Scala语言是一种面向对象语言,同时又结合了命令 ...

  8. CANopenSocket CANopenCGI.c hacking

    /**************************************************************************************** * CANopenS ...

  9. redis实战之事务与持久化

    1. 事务描述 (1)什么是事务 事务,就是把一堆事情绑在一起,按顺序的执行,都成功了才算完成,否则恢复之前的样子 事务必须服从ACID原则,ACID原则分别是原子性(atomicity).一致性(c ...

  10. 通过Azure File Service搭建基于iscsi的共享盘

    在Azure上目前已经有基于Samba协议的共享存储了. 但目前在Azure上,还不能把Disk作为共享盘.而在实际的应用部署中,共享盘是做集群的重要组件之一.比如仲裁盘.Shared Disk等. ...