opengl画圆锥和圆柱体

具体资源欢迎下载:https://download.csdn.net/download/qq_32563773/13077923

画圆锥

如要画出想画的立方体,必须计算出来顶点数组对象,并且根据顶点定义的位置,简历索引关系,进而使用CreateGLResources函数完成绘画。

第一步计算出顶点位置:

我们可以将底面的圆看成是一条直线绕一个顶点旋转,这样旋转一定的角度后,另一个定点的位置即所要求的顶点坐标。若我们分的够多,即旋转角度设立的越小,越相似于圆形。(类似于古代割圆术的思想)
即,问题可以转换为:
A点(x, y)按顺时针旋转 theta 角度后点的坐标为A1点(x1,y1) ,求x1 y1坐标用(x,y)和 theta 来表示。
解题方法:
设 OA 向量和x轴的角度为 alpha ,那么顺时针转过 theta后 ,OA1 向量和x轴的角度为 (alpha - theta) 。使用圆的参数方程来表示点坐标。A的坐标可以表示为:

A1的坐标可以表示为(带入A点坐标进行化简)

在代码中,我们设定一个函数,传入参数为底面圆的半径、割圆的线段个数、圆锥高度,之后通过上述的公式计算出顶点的坐标,我使用的是【原点+底面圆上顶点+圆锥上边的点】的顺序构建的。

第二步构建三角形索引

为了提升性能,因此要少使用循环。在计算顶点坐标的过程中即可以完成对顶点索引的构建。

即在计算所得圆上顶点数为1时,1与最后一个顶点,即输入的割圆最后一个点,这两个顶点和底面圆中心点构建一个三角形,和圆锥顶点构建第二个三角形;

顶点数超过2时,以此两个顶点,加上底面圆中心点构建第一个三角形,加上圆锥顶点构建第二个三角形,以此类推,没加一个顶点就加两个三角形的索引。最后完成索引构建。

具体代码如下:

void CMesh::CreateCone(float radius, int num_stacks, float height)
{double angle = 2 * M_PI / num_stacks;num_vertices = num_stacks + 2;num_indices = num_stacks * 2 * 3;CMeshVertex* vertices = new CMeshVertex[num_vertices];GLuint* indices = new GLuint[num_indices];vertices[0].pos = vec3{ 0,0,0 };vertices[0].color = { 1.0f,0.0f,0.0f,0.0f };vertices[1].color = { 0.0f,1.0f,0.0f,0.0f };vertices[num_vertices - 1].pos = vec3{ 0,0,height };int num_angle = 1;for (int i = 0; i < num_stacks; ++i) {vertices[i+1].pos.x = cos(angle * i)*radius;vertices[i+1].pos.y = -sin(angle * i)*radius;vertices[i+1].pos.z = 0;if (i > 0) {indices[i * 6] = 0;indices[i * 6 + 1] = i;indices[i * 6 + 2] = i + 1;indices[i * 6 + 3] = num_vertices - 1;indices[i * 6 + 4] = i;indices[i * 6 + 5] = i + 1;}else if(i == 0){indices[0] = 0;indices[1] = num_stacks;indices[2] = 1;indices[3] = num_vertices - 1;indices[4] = num_stacks;indices[5] = 1;}}CreateGLResources(vertices, indices);delete[] vertices;delete[] indices;
}

实现效果

在添加了右键响应菜单后,可看出实现效果如下:

实现时遇到的问题:
在实现的过程中,要注意索引的顺序,如果某一个三角形索引顺序出现问题,可能相出现如下的画不出的问题。

画圆柱

画圆柱和圆锥类似,只不过是添加了一组z方向为高度的顶点,并且以圆锥顶点为中心,和新加顶点画出三角,以此完成两个圆,之后再降上下圆的顶点联系起来,画出侧面。

实现原理

具体实现原理与圆锥类似,不同点为:在生成每个顶点时,依托此顶点要完成12条索引,即上下圆生成的三角形、侧面生成的两个三角形,共4个三角形12个顶点索引。

具体实现:

void CMesh::CreateCylinder(float radius, int num_stacks, float height)
{double angle = 2 * M_PI / num_stacks;num_vertices = num_stacks * 2 + 2;num_indices = num_stacks * 2 * 3 * 4;CMeshVertex* vertices = new CMeshVertex[num_vertices];GLuint* indices = new GLuint[num_indices];vertices[0].pos = vec3{ 0,0,0 };vertices[0].color = { 1.0f,0.0f,0.0f,0.0f };vertices[1].color = { 0.0f,1.0f,0.0f,0.0f };vertices[num_vertices - 1].pos = vec3{ 0,0,height };int num_angle = 1;for (int i = 0; i < num_stacks; ++i) {vertices[i + 1].pos.x = cos(angle * i)*radius;vertices[i + 1].pos.y = -sin(angle * i)*radius;vertices[i + 1].pos.z = 0;vertices[i + 1 + num_stacks].pos.x = vertices[i + 1].pos.x;vertices[i + 1 + num_stacks].pos.y = vertices[i + 1].pos.y;vertices[i + 1 + num_stacks].pos.z = height;if (i > 0) {indices[i * 12] = 0;indices[i * 12 + 1] = i;indices[i * 12 + 2] = i + 1;indices[i * 12 + 3] = num_vertices - 1;indices[i * 12 + 4] = i+num_stacks;indices[i * 12 + 5] = i + 1+num_stacks;indices[i * 12 + 6] = i;indices[i * 12 + 7] = i+1;indices[i * 12 + 8] = i + num_stacks;indices[i * 12 + 9] = i+1;indices[i * 12 + 10] = i +1+ num_stacks;indices[i * 12 + 11] = i+num_stacks;}else if (i == 0){indices[0] = 0;indices[1] = num_stacks;indices[2] = 1;indices[3] = num_vertices-1;indices[4] = num_stacks*2;indices[5] = num_stacks + 1;indices[6] = num_stacks;indices[7] = 1;indices[8] = 2 * num_stacks;indices[9] = 1;indices[10] = 1+num_stacks;indices[11] = 2 * num_stacks;}}CreateGLResources(vertices, indices);delete[] vertices;delete[] indices;
}

实现效果
在添加了右键响应菜单后,可看出实现效果如下:

opengl画圆柱体、圆锥等并使用四元数旋转相关推荐

  1. OpenGL画圆柱体

    收获: 三维图案绘制后可能看不到,可能是因为观察点的位置问题导致图案在观察点的后方,可以将图案向远处移动之后再观察. 图案旋转时可能只显示一半,另一半不现实,当然如果不旋转或者由于特定的旋转角度可能什 ...

  2. OpenGL画三角形

    目录 OpenGL窗口 OpenGL三角形 OpenGL画圆 OpenGL窗口 [代码总览] glfw初始化.配置.创建窗口 glad初始化 渲染循环,检测输入并给窗口涂颜色 清理操作 // 渲染循环 ...

  3. 平移计算机图形学代码注释,求代码注释:计算机图形学的OpenGL画四面体。高手来吧。争取每句都注释下。谢谢...

    求代码注释:计算机图形学的OpenGL画四面体.高手来吧.争取每句都注释下.谢谢 答案:3  信息版本:手机版 解决时间 2018-12-20 05:00 已解决 2018-12-20 01:58 求 ...

  4. OpenGL 画出雷达动态扫描效果(二) 非底图

    OpenGL 画出雷达动态扫描效果(一)中给出了已一张图片作为底图的雷达扫面程序 如果有漂亮的雷达底图的话,效果应该非常不错的,另外也可以直接手绘雷达框架 效果如下 雷达主体代码 glLineWidt ...

  5. 使用OpenGL画出四边形不完整的解决

    记录一个使用OpenGL做实验时遇到的小坑. 问题描述: 想要使用OpenGL画一个正方体,效果如下: 其实现方式是通过三维坐标分别画出它的每个面 于是我们使用以下代码来画出一个正方形平面: glBe ...

  6. OpenGL画太阳系

    分享一个OpenGL画太阳系的代码. #include <GL/glut.h> #include <GL/SOIL.h> #include <stdio.h> #i ...

  7. OpenGL 画圆球

    OpenGL 画圆球 只需要两个点,然后使用GL_TRIANGLE_STRIP(按顺序依次组成三角形)方式画三角形就可以了 从上至下,一圈一圈往下计算 球面点计算公式 // x=x0+r sinθco ...

  8. OpenGL 画荷花

    本文参考 基于OpenGL的荷花开放过程模拟_刘金定 (这是百度文库的链接,读者可自己搜索) 我们在这里会实现简单的OpenGL画莲花过程,并实现简单的莲花绽放过程,对学习OpenGL和3D数学有着极 ...

  9. Opengl画衣服1

    学习自 http://www.linuxidc.com/Linux/2013-02/78959p3.htm OpenGL画衣服 左键右键功能可以 继续添加菜单功能 // Homework.cpp : ...

最新文章

  1. OpenCV(项目)车牌识别1 -- 车牌提取(形态学)
  2. 《混合云计算》——2.2 结合服务创建混合云环境
  3. 安卓TableLayout表格布局
  4. 【英语学习】【Level 08】U04 What I love L4 Take your sweet time
  5. 【Flink】Flink checkpoint expired before completing
  6. VS2010 asp.net web site项目使用log4net
  7. 高等数学 下册 第九章 多元函数的概念 笔记
  8. 计算机应用和轨道交通哪个好,轻轨学校对重庆和男生有什么好处
  9. C#编程总结(四)多线程应用(进度条的编程问题)——转自http://www.cnblogs.com/yank/p/3232955.html...
  10. Java笔记 - 黑马程序员_03(继承,修饰符,多态,抽象类,接口,内部类)
  11. 拆分单元格怎么弄?合并起来了怎么办?
  12. Vbox虚拟机无法启动错误Mark
  13. HTML(简介及常用标签)
  14. 学习Java应该关注哪些网站?
  15. windows防火墙是干什么的_请教个人防火墙是做什么用的,
  16. 强制退出当前ubuntu命令
  17. 2.2 华为-软件工程师-7.21笔试题
  18. 机器学习预测世界杯球队冠
  19. Real-Time High-Resolution Background Matting
  20. 什么错误是计算机检查不出来的,电脑开机检测不到硬盘,提示3F0,求助大神如何检测硬盘的问题. 求大佬指点...

热门文章

  1. nyoj-506-洗澡
  2. 单核CPU与多核CPU的区别
  3. 可ping通外网,浏览器却访问不了外部网络
  4. 联通假4G欺骗消费者!
  5. 尤菲·如月 与你有约 ぐりぐりキュートユフィ汉化补丁
  6. 同期群分析是什么?教你用 SQL 来搞定
  7. iOS 字体集(图文并茂)
  8. STC12系列单片机的AUXR辅助寄存器
  9. 修改broadcom 4322无线网卡ID教程,不再显示第三方无线网卡
  10. rhel6.6的内核源码安装与BCM4322无线网卡驱动的安装