目录

球体

花托

圆柱

圆盘


球体

创建球体 void gltMakeSphere(GLTriangleBatch& sphereBatch, GLfloat fRadius, GLint iSlices, GLint iStacks);

输出sphereBatch, 输入参数半径fRaidus,  iSlices 是围绕球体排列的三角形对数(即列数),iStacks 是从球体底部堆叠到顶部的三角形带的数量(即行数)。

花托

void gltMakeTorus(GLTriangleBatch& torusBatch, GLfloat majorRadius, GLfloat minorRadius, GLint numMajor, GLint numMinor);

输出torusBatch,输入majorRadius是花托中心到外边缘的半径,minorRadius则是到内边缘的半径, numMajor和numMinor分别是列和行数(与iSlices和iStacks类似) 书上说是细分单元数量。

圆柱

void gltMakeCylinder(GLTriangleBatch& cylinderBatch, GLfloat baseRadius, GLfloat topRadius, GLfloat fLength, GLint numSlices, GLint numStacks);

输出cylinderBatch,输入baseRadius底部半径,topRadius顶部半径,numSlices列数,numStacks行数(注意列数和行数都是以三角对为整体的而言的),fLength是三角形长度?将一端的半径设置为0时,就变为圆锥。

圆盘

void gltMakeDisk(GLTriangleBatch& diskBatch, GLfloat innerRadius, GLfloat outerRadius, GLint nSlices, GLint nStacks);

输出diskBath,输入innerRadius内部半径和outerRadius外部半径,nSlidecs和nStacks分别是列数和行数。

// Objects.cpp
// OpenGL SuperBible, Chapter 4
// Demonstrates GLTools built-in objects
// Program by Richard S. Wright Jr.
#pragma comment(lib, "gltools.lib")#include <GLTools.h> // OpenGL toolkit
#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/
// An assortment of needed classes
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 };// Keep track of effects step
int nStep = 0;///
// This function does any needed initialization on the rendering context.
// This is the first opportunity to do any OpenGL related tasks.
void SetupRC()
{// Black backgroundglClearColor(0.7f, 0.7f, 0.7f, 1.0f);shaderManager.InitializeStockShaders();glEnable(GL_DEPTH_TEST);transformPipeline.SetMatrixStacks(modelViewMatrix, projectionMatrix);cameraFrame.MoveForward(-15.0f);// SpheregltMakeSphere(sphereBatch, 3.0, 10, 20);// TorusgltMakeTorus(torusBatch, 3.0f, 0.75f, 15, 15);// CylindergltMakeCylinder(cylinderBatch, 2.0f, 2.0f, 3.0f, 13, 2);// ConegltMakeCylinder(coneBatch, 2.0f, 0.0f, 3.0f, 13, 2);// DiskgltMakeDisk(diskBatch, 1.5f, 3.0f, 13, 3);
}/
void DrawWireFramedBatch(GLTriangleBatch* pBatch)
{shaderManager.UseStockShader(GLT_SHADER_FLAT, transformPipeline.GetModelViewProjectionMatrix(), vGreen);pBatch->Draw();// Draw black outlineglPolygonOffset(-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 testingglPolygonMode(GL_FRONT_AND_BACK, GL_FILL);glDisable(GL_POLYGON_OFFSET_LINE);glLineWidth(1.0f);glDisable(GL_BLEND);glDisable(GL_LINE_SMOOTH);
}///
// Called to draw scene
void RenderScene(void)
{// Clear the window with current clearing colorglClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);modelViewMatrix.PushMatrix();M3DMatrix44f mCamera;cameraFrame.GetCameraMatrix(mCamera);modelViewMatrix.MultMatrix(mCamera);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 commandsglutSwapBuffers();
}// 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();
}///
// A normal ASCII key has been pressed.
// In this case, advance the scene when the space bar is pressed
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();
}///
// Window has changed size, or has just been created. In either case, we need
// to use the window dimensions to set the viewport and the projection matrix.
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();
}///
// Main entry point for GLUT based programs
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;
}

【OpenGL】运用GLTriangleBatch三角形批次类创建球体、花托、圆柱圆锥体、圆盘相关推荐

  1. android 使用OPENGL ES实现三角形纹理贴图效果-纹理映射基础

    效果图:...... 编写Dad.java *在Dad构造器中创建和设置场景渲染器为主动渲染,并设置重写触屏时间回调方法以记录触控笔坐标,改变三角形坐标系的位置,使三角形能够在场景中转动 *为声明场景 ...

  2. OpenGL绘制Triangle三角形

    OpenGL绘制Triangle三角形 前期知识准备 顶点输入 顶点着色器 编译着色器 片段着色器 着色器程序 链接顶点属性 顶点数组对象 我们一直期待的三角形 索引缓冲对象 前期知识准备 在Open ...

  3. ad2019--LED灯按键类创建元件库

    摘自凡亿教育 一.LED灯按键类创建元件库 1.绘制LED灯的原理图库 鼠标右击箭头所指的,然后选择倒数第三个,多边形 在画的时候可以按住,shift+空格,来调整角度. 但是,一般的LED灯都是蓝色 ...

  4. 【OpenGL】绘制三角形

    [OpenGL]绘制三角形 效果展示 准备条件 图形渲染管线的各个阶段概览 创建着色器程序与绘制OpenGL图元 参考资料 效果展示 准备条件 首先已经通过[OpenGL]使用OpenGL创建窗口使用 ...

  5. Java中创建线程需要使用的类_如何通过使用Java中的匿名类创建线程?

    甲线程是可以同时与该程序的其他部分被执行的功能.所有Java程序都有至少一个称为主线程的线程,该线程由Java虚拟机(JVM)在程序启动时由主线程调用main()方法创建. 在Java中,我们可以通过 ...

  6. 关于Java里面File类创建txt文件重复???

    private JButton getOpenButton() {if (openButton == null) {openButton = new JButton();openButton.setT ...

  7. php 匿名方法,PHP基于Closure类创建匿名函数的方法详解

    本文实例讲述了PHP基于Closure类创建匿名函数的方法.分享给大家供大家参考,具体如下: Closure 类 用于代表匿名函数的类. 匿名函数(在 PHP 5.3 中被引入)会产生这个类型的对象. ...

  8. 【Groovy】MOP 元对象协议与元编程 ( Expando 动态类 | 创建动态类 | 为动态类增加字段和方法 )

    文章目录 一.Expando 动态类简介 二.动态类创建 三.为动态类增加字段和方法 四.完整代码示例 一.Expando 动态类简介 Groovy 运行时 , 可以动态地创建一个类 , 该类称为 & ...

  9. Java继承Thread类创建多线程

    Java继承Thread类创建多线程 单线程示例 示例,Example01.java public class Example01{public static void main(String[] a ...

最新文章

  1. Analysis Services基础知识——深入SQL Server 2008
  2. 手把手教你学Vue-3(路由)
  3. flask_socketio 用法:
  4. 起名与选择器~(总结类、持续更新系列)
  5. 【HDU - 5014】Number Sequence(贪心构造)
  6. HttpClient连接池的连接保持、超时和失效机制
  7. 【数据结构笔记42】哈希表应用:文件中单词词频统计
  8. 远程机器上无法用Assembly.Load(path).CreateInstance(ClassName)?
  9. 正轴等角割圆锥投影综述
  10. 安装IAR ewarm
  11. 航班网站php项目,php的实时航班api调用代码实例
  12. 华为DHCP故障常用排查命令
  13. 计算机woyd打不开,word打不开怎么办?word文档打不开的几种解决方法
  14. 零基础学摄影nbsp;跟老邮差一步一…
  15. 假期抱病上班 货车司机买彩票中2.98亿美元大奖
  16. 推荐模型-上下文感知-2016:FNN模型【FM家族】【FM+MLP=FNN】
  17. css3 实现十字光标和光标外圆圈环绕
  18. Android输入框下拉列表
  19. vcruntime140.dll丢失的解决方法
  20. 前端常见图片格式整理

热门文章

  1. Failed to execute script ‘xxx‘ due to unhandled exception:No module named ‘ctypes‘
  2. matlab中fcn模块函数怎么写,matlabfcn
  3. Python标准库之turtle库——基础函数详解
  4. 【kvm】更改内存大小
  5. 16进制怎么转换潘通_使用此免费应用程序查找Pantone颜色十六进制代码
  6. MathType Commands for Microsoft Word ErrorXThe MathType commands could not communicate with MathType
  7. Android 10 (Android Q)中的屏幕刷新率(display refresh rate)切换方法和策略
  8. scrollTop失效问题
  9. 华为交换机配置命令总结
  10. springboot心跳检测_springboot结合netty+心跳机制