OpenGL 超级宝典学习,制作 圆柱,球体,花托,圆盘等多边体

#include <GLTools.h>

#include <GLMatrixStack.h>

#include <GLFrame.h>

#include <GLFrustum.h>

#include <GLBatch.h>

#include <GLGeometryTransform.h>

#include <math.h>

#ifdef __APPLE__

#include <glut/glut.h>

#else

#define FREEGLUT_STATIC

#include <gl/glut.h>

#endif

GLShaderManager shaderManager; //着色管理器

GLMatrixStack   modelViewMatrix;

GLMatrixStack   projectionMatrix;

GLFrame         cameraFrame;

GLFrame         objectFrame;

GLFrustum       viewFrustum;

GLTriangleBatch sphereBatch;

GLTriangleBatch torusBatch;

GLTriangleBatch cylinderBatch;

GLTriangleBatch coneBatch;

GLTriangleBatch diskBatch;

GLGeometryTransform transformPipeline;

M3DMatrix44f    shadowMatrix;

GLfloat vGreen[] = { 0.0f, 1.0f, 0.0f, 1.0f };

GLfloat vBlack[] = { 0.0f, 0.0f, 0.0f, 1.0f };

int nStep = 0;

void SetupRC()

{

glClearColor(0.7f, 0.7f, 0.7f, 1.0f);

shaderManager.InitializeStockShaders(); 初始化

glEnable(GL_DEPTH_TEST); // 开启深度测试

transformPipeline.SetMatrixStacks(modelViewMatrix, projectionMatrix);

cameraFrame.MoveForward(-15.0f);

gltMakeSphere(sphereBatch, 3.0, 10, 20);// 球体

gltMakeTorus(torusBatch, 3.0f, 0.75f, 15, 15); // 花托

gltMakeCylinder(cylinderBatch, 2.0f, 2.0f, 3.0f, 13, 2);//圆柱

gltMakeCylinder(coneBatch, 2.0f, 0.0f, 3.0f, 13, 2);

gltMakeDisk(diskBatch, 1.5f, 3.0f, 13, 3);//圆盘

}

void DrawWireFramedBatch(GLTriangleBatch* pBatch)

{

shaderManager.UseStockShader(GLT_SHADER_FLAT, transformPipeline.GetModelViewProjectionMatrix(), vGreen);

pBatch->Draw();

// Draw black outline

glPolygonOffset(-1.0f, -1.0f);

glEnable(GL_LINE_SMOOTH);

glEnable(GL_BLEND);

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

glEnable(GL_POLYGON_OFFSET_LINE);

glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);

glLineWidth(2.5f);

shaderManager.UseStockShader(GLT_SHADER_FLAT, transformPipeline.GetModelViewProjectionMatrix(), vBlack);

pBatch->Draw();

// Restore polygon mode and depht testing

glPolygonMode(GL_FRONT, GL_FILL);

glDisable(GL_POLYGON_OFFSET_LINE);

glLineWidth(1.0f);

glDisable(GL_BLEND);

glDisable(GL_LINE_SMOOTH);

}

void RenderScene(void)

{

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

modelViewMatrix.PushMatrix();

M3DMatrix44f mCamara;

cameraFrame.GetCameraMatrix(mCamara);

modelViewMatrix.MultMatrix(mCamara);

M3DMatrix44f mObjectFrame;

objectFrame.GetMatrix(mObjectFrame);

modelViewMatrix.MultMatrix(mObjectFrame);

shaderManager.UseStockShader(GLT_SHADER_FLAT, transformPipeline.GetModelViewProjectionMatrix(), vBlack);

switch (nStep) {

case 0:

DrawWireFramedBatch(&sphereBatch);

break;

case 1:

DrawWireFramedBatch(&torusBatch);

break;

case 2:

DrawWireFramedBatch(&cylinderBatch);

break;

case 3:

DrawWireFramedBatch(&coneBatch);

break;

case 4:

DrawWireFramedBatch(&diskBatch);

break;

}

modelViewMatrix.PopMatrix();

// Flush drawing commands

glutSwapBuffers();

}

// Respond to arrow keys by moving the camera frame of reference

void SpecialKeys(int key, int x, int y)

{

if (key == GLUT_KEY_UP)

objectFrame.RotateWorld(m3dDegToRad(-5.0f), 1.0f, 0.0f, 0.0f);

if (key == GLUT_KEY_DOWN)

objectFrame.RotateWorld(m3dDegToRad(5.0f), 1.0f, 0.0f, 0.0f);

if (key == GLUT_KEY_LEFT)

objectFrame.RotateWorld(m3dDegToRad(-5.0f), 0.0f, 1.0f, 0.0f);

if (key == GLUT_KEY_RIGHT)

objectFrame.RotateWorld(m3dDegToRad(5.0f), 0.0f, 1.0f, 0.0f);

glutPostRedisplay();

}

void KeyPressFunc(unsigned char key, int x, int y)

{

if (key == 32)

{

nStep++;

if (nStep > 4)

nStep = 0;

}

switch (nStep)

{

case 0:

glutSetWindowTitle("Sphere");

break;

case 1:

glutSetWindowTitle("Torus");

break;

case 2:

glutSetWindowTitle("Cylinder");

break;

case 3:

glutSetWindowTitle("Cone");

break;

case 4:

glutSetWindowTitle("Disk");

break;

}

glutPostRedisplay();

}

void ChangeSize(int w, int h)

{

glViewport(0, 0, w, h);

viewFrustum.SetPerspective(35.0f, float(w) / float(h), 1.0f, 500.0f);

projectionMatrix.LoadMatrix(viewFrustum.GetProjectionMatrix());

modelViewMatrix.LoadIdentity();

}

int main(int argc, char* argv[])

{

gltSetWorkingDirectory(argv[0]);

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_STENCIL);

glutInitWindowSize(800, 600);

glutCreateWindow("Sphere");

glutReshapeFunc(ChangeSize);

glutKeyboardFunc(KeyPressFunc);

glutSpecialFunc(SpecialKeys);

glutDisplayFunc(RenderScene);

GLenum err = glewInit();

if (GLEW_OK != err) {

fprintf(stderr, "GLEW Error: %s\n", glewGetErrorString(err));

return 1;

}

SetupRC();

glutMainLoop();

return 0;

}

时间: 2024-10-21 14:45:03

OpenGL 超级宝典学习,制作 圆柱,球体,花托,圆盘等多边体的相关文章

openGl超级宝典学习笔记 (1)第一个三角形

执行效果 代码及解析: // // Triangle.cpp // Triangle // // Created by fengsser on 15/6/20. // Copyright (c) 2015年 fengsser. All rights reserved. // #include <GLTools.h>//用作掩盖不同平台的差异,建立窗体等工作 #include <GLShaderManager.h> #ifdef __APPLE__ #include <glut

openGl超级宝典学习笔记 (2) 7个基本的几何图元

点(GL_POINTS): 点总是正方形的像素,默认情况下,点的大小不受透视除法影响.即不管与视点的距离如何,它的大小都不改变.为了获得圆点,必须在抗锯齿模式下绘制点. 可以用glPointSize改变点的大小. //点 //建立批次 GLBatch pointBatch; GLfloat vCoast[24][3] = {{2.80, 1.20, 0.0 }, {2.0, 1.20, 0.0 }, {2.0, 1.08, 0.0 }, {2.0, 1.08, 0.0 }, {0.0, 0.80

openGl超级宝典学习笔记 (2) 7个主要的几何图元

点(GL_POINTS): 点总是正方形的像素,默认情况下,点的大小不受透视除法影响. 即无论与视点的距离怎样,它的大小都不改变.为了获得圆点.必须在抗锯齿模式下绘制点. 能够用glPointSize改变点的大小. //点 //建立批次 GLBatch pointBatch; GLfloat vCoast[24][3] = {{2.80, 1.20, 0.0 }, {2.0, 1.20, 0.0 }, {2.0, 1.08, 0.0 }, {2.0, 1.08, 0.0 }, {0.0, 0.8

Ubuntu:Codeblocks编译OpenGL超级宝典(第5版)的实例

最近在看OpenGL超级宝典第五版,系统为Ubuntu,想通过Codeblocks运行书中的实例,途中遇到不少问题,均已解决,现分享一下操作步骤如下: 1. 建立基本编译环境 sudo apt-getinstall build-essential 2. 安装OpenGL Library sudo apt-getinstall libgl1-mesa-dev   3.安装OpenGL Utilities sudo apt-getinstall libglu1-mesa-dev 4.安装OpenGL

win8+VS2012搭建OpenGL超级宝典的环境

自从公司搬到腾讯附近,每天上班都迟到20分钟左右,迟到会扣钱,两不相欠,迟到就成了心安理得的事情了. 如果你光看我之前的blog,我现在告诉你目前从事游戏开发,你可能会感到惊讶.是啊,我之前从未写过一篇关于游戏的文章.或许因缘巧合吧,正在做手游项目啊,用的是cocos2dx引擎.说来话长,大学的毕业设计是用java写了个小游戏,后来工作了,进了一家做电子教育产品的公司,虽然不是游戏公司,产品里也包含些休闲小游戏,其中有个游戏是我经理开发的,在同行的产品中算是最大型的一款游戏吧,由c语言写成,未使

OpenGL超级宝典visual studio 2013开发环境配置,GLTools

做三维重建需要用到OpenGL,开始看<OpenGL超级宝典>,新手第一步配置环境就折腾了一天,记录下环境的配置过程. <超级宝典>中的例子使用了GLEW,freeglut以及作者自己开发的GLTools这三个库. 1.GLEW The OpenGL Extension Wrangler Library (GLEW) is a cross-platform open-source C/C++ extension loading library. GLEW provides effi

[转]OpenGL超级宝典 5e 环境配置

OpenGL超级宝典(第五版)环境配置 1.各种库的配置 (1)glew 下载:https://sourceforge.net/projects/glew/files/glew/1.7.0/glew-1.7.0.zip/download 将include文件夹下的.h文件拷贝到C:\Program Files\Microsoft Visual Studio 9.0\VC\include\GL目录中(没有GL目录就自己创建一个,这里的具体路径视电脑上VS2008安装的位置而定) 将lib文件夹下的

Mac OSX下搭建OpenGL超级宝典5(蓝宝书)开发环境(运行第一个三角形程序)

1.下载OpenGL超级宝典5(蓝宝书)的资源,链接如下:http://pan.baidu.com/s/1c02PtYC,解压得到SB5文件夹,里面有书籍的课程源码以及GLTools库. 2.依次点击Xcode-->Preferences-->Locations-->Sources Trees,再点“+”号按钮添加Name:  GLTOOLS_INCLUDE,  Display Name:  GLTools include Folder, Path: ~/Desktop/SB5/src/

【极简版】OpenGL 超级宝典(第五版)环境配置 VS2010

事先声明:该教程仅适用于VS2010环境下超级宝典第五版的配置 第一步:下载示例代码和环境包: 链接:https://pan.baidu.com/s/1llRRQ8ymBgMGuXp5M50pJw 提取码:7ujk 第二步:新建VS2010空工程一个 第三步:环境配置 在左侧边栏选择右键 源文件 -> 添加 -> 新建筛选器, 命名为 GLTools.再在GLTools上右键 添加->现有项 ,将 Env包 中的 src/GLTools/src 下的文件都添加进去. 在工程名上右击,选择