绘制圆锥暂时没有找到一个模型完整绘制,暂时使用两个物体拼接: 圆和锥面。

缺点:这需要绘制两次才能将圆锥体绘制成功。

#include "cone.h"
#include <QTimer>
#include <QDateTime>
#include <QImage>
#include <glm-master/glm/gtc/matrix_transform.hpp>
#include <glm-master/glm/gtc/type_ptr.hpp>
#include <QtMath>#define POINT_COUNT (362)static float circleVertices[POINT_COUNT*3];static float coneVertices[POINT_COUNT*3];Cone::Cone(QWidget* parent)
{QTimer * timer = new QTimer(this);connect(timer, SIGNAL(timeout()), this, SLOT(update()));timer->start(17);mProjectionMatrix = glm::mat4(1.0f);mViewMatrix = glm::mat4(1.0f);mModelMatrix = glm::mat4(1.0f);//centercircleVertices[0] = 0;circleVertices[1] = 0;circleVertices[2] = 0;coneVertices[0] = 0;coneVertices[1] = 0;coneVertices[2] = 1.0;float r = 0.5f;for(int i = 1; i <= POINT_COUNT - 1; i++) {int index = i*3;circleVertices[index] = r * sin(i * M_PI/ 180.0f);circleVertices[index+1] = r * cos(i * M_PI/ 180.0f);circleVertices[index+2] = 0;coneVertices[index] = r * sin(i * M_PI/ 180.0f);coneVertices[index+1] = r * cos(i * M_PI/ 180.0f);coneVertices[index+2] = 0;}
}void Cone::initializeGL()
{bool enabled = initializeOpenGLFunctions();qDebug() << "initializeGL" << enabled;glGenVertexArrays(1, &mCircleVAO);glGenBuffers(1, &mCircleVBO);glBindVertexArray(mCircleVAO);glBindBuffer(GL_ARRAY_BUFFER, mCircleVBO);glBufferData(GL_ARRAY_BUFFER, sizeof(circleVertices), circleVertices, GL_STATIC_DRAW);glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);glEnableVertexAttribArray(0);glBindBuffer(GL_ARRAY_BUFFER, 0);glGenVertexArrays(1, &mConeVAO);glGenBuffers(1, &mConeVBO);glBindVertexArray(mConeVAO);glBindBuffer(GL_ARRAY_BUFFER, mConeVBO);glBufferData(GL_ARRAY_BUFFER, sizeof(coneVertices), coneVertices, GL_STATIC_DRAW);glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);glEnableVertexAttribArray(0);glBindBuffer(GL_ARRAY_BUFFER, 0);mConeProgram.addShaderFromSourceFile(QOpenGLShader::Vertex, ":/shaders/cone.vsh");mConeProgram.addShaderFromSourceFile(QOpenGLShader::Fragment, ":/shaders/cone.fsh");bool success = mConeProgram.link();if(!success){qDebug() << "ERR: " << mConeProgram.log();}mCircleProgram.addShaderFromSourceFile(QOpenGLShader::Vertex, ":/shaders/circle.vsh");mCircleProgram.addShaderFromSourceFile(QOpenGLShader::Fragment, ":/shaders/circle.fsh");success = mCircleProgram.link();if(!success){qDebug() << "ERR: " << mCircleProgram.log();}mConeProjectionLoc = mConeProgram.uniformLocation("projection");mConeViewLoc = mConeProgram.uniformLocation("view");mConeModelLoc = mConeProgram.uniformLocation("model");mCircleProjectionLoc = mCircleProgram.uniformLocation("projection");mCircleViewLoc = mCircleProgram.uniformLocation("view");mCircleModelLoc = mCircleProgram.uniformLocation("model");
}void Cone::resizeGL(int w, int h)
{mViewMatrix  = glm::translate(mViewMatrix, glm::vec3(0.0f, 0.0f, -3.0f));mProjectionMatrix = glm::perspective(glm::radians(45.0f), (float)w / (float)h, 0.1f, 100.0f);glEnable(GL_DEPTH_TEST);
}void Cone::paintGL()
{mModelMatrix = glm::rotate(mModelMatrix, 0.01f, glm::vec3(1.0f, 0.0f, 0.0f));glClearColor(0.0f, 0.0f, 0.0f, 1.0f);glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);mCircleProgram.bind();glBindVertexArray(mCircleVAO);glUniformMatrix4fv(mCircleProjectionLoc, 1, GL_FALSE, glm::value_ptr(mProjectionMatrix));glUniformMatrix4fv(mCircleViewLoc, 1, GL_FALSE, glm::value_ptr(mViewMatrix));glUniformMatrix4fv(mCircleModelLoc, 1, GL_FALSE, glm::value_ptr(mModelMatrix));glDrawArrays(GL_TRIANGLE_FAN, 0, POINT_COUNT);mConeProgram.bind();glBindVertexArray(mConeVAO);glUniformMatrix4fv(mConeProjectionLoc, 1, GL_FALSE, glm::value_ptr(mProjectionMatrix));glUniformMatrix4fv(mConeViewLoc, 1, GL_FALSE, glm::value_ptr(mViewMatrix));glUniformMatrix4fv(mConeModelLoc, 1, GL_FALSE, glm::value_ptr(mModelMatrix));glDrawArrays(GL_TRIANGLE_FAN, 0, POINT_COUNT);
}

为了方便理解,VAO, VBO, Program 分别各准备一套。

OpenGL绘制一个圆锥相关推荐

  1. OpenGL绘制一个三角形的实例

    OpenGL绘制一个橘黄色的三角形 先上图,再解答. 完整主要的源代码 源代码剖析 先上图,再解答. 完整主要的源代码 #include <glad/glad.h> #include &l ...

  2. OpenGL绘制一个三角形

    OpenGL绘制一个三角形 OpenGL绘制一个三角形简介 源代码剖析 主要源代码 OpenGL绘制一个三角形简介 在本课中,我们仍然不转换坐标,因此顶点仅在正方形内可见.从 Z 的反轴看,正方形如下 ...

  3. OpenGL(十八)——Qt OpenGL绘制一个3D世界

    OpenGL(十八)--Qt OpenGL绘制一个3D世界 一.说明 本篇介绍构建一个3D的世界. 二.简介 加载3D世界,并在其中漫游: 在这一课中,你将学会如何加载3D世界,并在3D世界中漫游. ...

  4. QT使用openGL绘制一个三角形

    对于opengl的学习来说,绘制一个三角形是学习一种计算机语言时的一个hello world级的入门程序,个人觉得相比主流语言的helloworld,openGL的入门确实是有一些劝退,虽然说有不错的 ...

  5. OpenGL绘制一个四边形

    学习自:https://learnopengl-cn.github.io/01%20Getting%20started/04%20Hello%20Triangle/ OpenGL没有直接绘制四边形的a ...

  6. opengl es3.0学习篇七:使用opengl绘制一个立方体

    2019独角兽企业重金招聘Python工程师标准>>> 这里简单运用之前所学的知识来实现一个对应的立方体: public class MainActivity extends App ...

  7. WIN32 opengl绘制一个点

    在Win32程序中,使用到gluPerspective,而这个函数需要glut.h.故需要配置相关环境. #include "stdafx.h" #include "Wi ...

  8. OpenGl 绘制一个立方体

    https://www.cnblogs.com/icmzn/p/5049768.html https://blog.csdn.net/auccy/article/details/82392921

  9. OpenGL绘制桥梁模型

    本文主要讲述如何使用现代OpenGL绘制一个完整的桥梁模型,包括箱梁.盖梁和桥墩,关于OpenGL方面,主要添加的shader,使用phong光照模型实现. 一.绘制箱梁 1.1 箱梁的的截面和坐标系 ...

最新文章

  1. linux服务器文件后缀名,linux服务器备份网站程序并下载到本地(自动)
  2. Notice : Soft open files now is 1024, We recommend greater than 10000
  3. 设计模式:命令模式(Command)
  4. 复旦大学女教授告诉你:朋友是什么?
  5. 476. 数字的补数
  6. 从没想过会有一个这样的机会|大疆招聘
  7. hdu2066一个人的旅行(多源点多汇点的最短路径问题)
  8. java xmpp消息推送_基于XMPP协议(openfire服务器)的消息推送实现
  9. 12 大热门事件背后,藏着你的 2020 年
  10. 【iOS】Swift3 报错:Value of type 'AppDelegate' has no member 'managedObjectContext',UIApplication has no
  11. 深度学习高速路上,PaddlePaddle正在弯道超车
  12. 电脑显示没有被指定在上运行_电脑显示“没有被指定在windows上运行,或者它包含错误”怎么解决?...
  13. 三角形周长最短问题_三角形周长最短的动点问题
  14. 【图像增强】基于gabor滤波器实现指纹增强含Matlab源码
  15. 自定义控件 仿微信朋友圈文字展开全文功能
  16. 计算机课拔线头检讨书,实验室检讨书.doc
  17. ssm文达学院学生社团招募系统的设计与实现毕业设计源码211633
  18. 内置函数 - getattr()函数
  19. Ldap集成Ranger应用服务
  20. Mac 学 c 语言用哪个软件呢

热门文章

  1. 元镜头——手机相机的下一场革命
  2. AUTOCAD——隔离
  3. python if多个条件并列_Python if有多个条件怎么办
  4. Java— AWT 绘图(一)
  5. 启动管理-启动流程-启动过程(有流程图)
  6. C#课程设计(购物平台)
  7. 示例-Luat示例-HTTP
  8. HTTP请求数据格式及响应数据格式
  9. hwd分别是长宽高_DS-2CD7A87HWD-XZS 海康威视800万AI人脸抓拍比对筒型网络摄像机
  10. python语言进行生日悖论分析--随机试验方法