opengl polygon 三角剖分

2024-03-21 11:28
文章标签 polygon 剖分 opengl 三角

本文主要是介绍opengl polygon 三角剖分,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        固定管线时代的openGL可以使用GL_POLYGON来描画简单的凸多边形。但是无法直接描画凹的,带孔的或者自交的多边形。

        而非固定管线时代openGL3.*,openGL4.*,直接就没有了GL_POLYGON。

        不管是那种情况,都需要将多边形转化为三角形(三角形,三角带,三角扇)。我们很容易在网络上搜索到gluNewTess这个系列的函数,用来分割多边形。但是所有的例子都是在旧版本openGL下进行的,其实在这个系列函数在新版本openGL中仍然可以使用。现在开始正文,内容比较简单。

1.gluNewTess 创建一个tess对象

2.gluTessProperty 设置下环绕方向

3.gluTessCallback 设置回调函数(GLU_TESS_BEGIN,GLU_TESS_END,GLU_TESS_VERTEX等)

4.gluTessBeginPolygon,gluTessBeginContour,gluTessVertex等函数

以上部分参考网络上的例子。这里只说一下注意的地方。

多边形会被分割为多个面片,每个面片的BeginMode类型是不一样的,有可能是GL_TRIANGLE_STRIP或者GL_TRIANGLE_FAN。比如一个18个点的多边形,可能会被分割成3个面片:6个点组成的GL_TRIANGLE_STRIP,9个点组成的GL_TRIANGLE_FAN,9个点组成的GL_TRIANGLE_STRIP。(数组是我编的,但是a.分割不会创建新点,b.因为存在不同三角形共用点的情况,分割后的点数量大于分割前的。)

基于上面的讨论,我们需要获取每面片的BeginMode和点序列。相关代码如下:

1.

GLenum g_Type;
void CALLBACK beginCallback(GLenum which) 
{//glBegin(which);g_Type = which;
}

在GLU_TESS_BEGIN的回调函数中,取得BeginMode(BeginMode就是glBegin的参数。在新版openGL中,我们不使用glBegin系列函数来描画图形。所以这里不调用 glBegin.

2.

std::vector<vec3 > g_vecPoint3D;
void CALLBACK vetexCallback(GLdouble * vertex)
{g_vecPoint3D.push_back(vec3(vertex[0], vertex[1], vertex[2]));
}

在GLU_TESS_VERTEX的回调函数中,取得分割后的坐标。

3.

std::vector<std::pair<GLenum, std::vector<vec3>>> g_vecvecPoint3D;
void CALLBACK endCallback(void)
{//glEnd(which);g_vecvecPoint3D.push_back(std::make_pair(g_Type, g_vecPoint3D));g_vecPoint3D.clear();
}

如果进入了GLU_TESS_END的回调函数,标志着一个分割后的面片已经结束了。此时,我们已获得的坐标点就是一个面片的所有坐标点。将beginMode和坐标一起存起来。(std::make_pair(g_Type, g_vecPoint3D))

4.重复1,2,3,得到每个面片的beginMode和坐标列。

这样一来,polygon就分割完成了。可以描画数据或者将数据存起来。

====================================

如果注册了GLU_TESS_ERROR回调函数,以下是错误码。

/* TessError */
#define GLU_TESS_ERROR1     100151
#define GLU_TESS_ERROR2     100152
#define GLU_TESS_ERROR3     100153
#define GLU_TESS_ERROR4     100154
#define GLU_TESS_ERROR5     100155
#define GLU_TESS_ERROR6     100156
#define GLU_TESS_ERROR7     100157
#define GLU_TESS_ERROR8     100158#define GLU_TESS_MISSING_BEGIN_POLYGON  GLU_TESS_ERROR1
#define GLU_TESS_MISSING_BEGIN_CONTOUR  GLU_TESS_ERROR2
#define GLU_TESS_MISSING_END_POLYGON    GLU_TESS_ERROR3
#define GLU_TESS_MISSING_END_CONTOUR    GLU_TESS_ERROR4
#define GLU_TESS_COORD_TOO_LARGE        GLU_TESS_ERROR5
#define GLU_TESS_NEED_COMBINE_CALLBACK  GLU_TESS_ERROR6

===============================

其他的分割方法:

1.earcut算法,https://github.com/mapbox/earcut.hpp

支持多种语言,按官方的描述就是快.只需要一个头文件。官网写着需要openGL SDK.

由于算法的原因,会产生很不"完美的三角形",比如2个角度很小的锐角和1个大钝角,这可能不是你想要的。只支持2d,3D场合需要先将图形拍扁。但是由于会产生不完美的三角形,转回3D后的效果,和你想的可能相差很大。

不过以上只是推测,不负任何责任。

2.CGAL 

打开网站,看一眼目录,你就能感觉到这个库很强大。

这篇关于opengl polygon 三角剖分的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/832530

相关文章

OPENGL顶点数组, glDrawArrays,glDrawElements

顶点数组, glDrawArrays,glDrawElements  前两天接触OpenGL ES的时候发现里面没有了熟悉的glBegin(), glEnd(),glVertex3f()函数,取而代之的是glDrawArrays()。有问题问google,终于找到答案:因为OpenGL ES是针对嵌入式设备这些对性能要求比较高的平台,因此把很多影响性能的函数都去掉了,上述的几个函数都被移除了。接

OpenGL ES学习总结:基础知识简介

什么是OpenGL ES? OpenGL ES (为OpenGL for Embedded System的缩写) 为适用于嵌入式系统的一个免费二维和三维图形库。 为桌面版本OpenGL 的一个子集。 OpenGL ES管道(Pipeline) OpenGL ES 1.x 的工序是固定的,称为Fix-Function Pipeline,可以想象一个带有很多控制开关的机器,尽管加工

OpenGL雾(fog)

使用fog步骤: 1. enable. glEnable(GL_FOG); // 使用雾气 2. 设置雾气颜色。glFogfv(GL_FOG_COLOR, fogColor); 3. 设置雾气的模式. glFogi(GL_FOG_MODE, GL_EXP); // 还可以选择GL_EXP2或GL_LINEAR 4. 设置雾的密度. glFogf(GL_FOG_DENSITY, 0

opengl纹理操作

我们在前一课中,学习了简单的像素操作,这意味着我们可以使用各种各样的BMP文件来丰富程序的显示效果,于是我们的OpenGL图形程序也不再像以前总是只显示几个多边形那样单调了。——但是这还不够。虽然我们可以将像素数据按照矩形进行缩小和放大,但是还不足以满足我们的要求。例如要将一幅世界地图绘制到一个球体表面,只使用glPixelZoom这样的函数来进行缩放显然是不够的。OpenGL纹理映射功能支持将

OpenGL ES 2.0渲染管线

http://codingnow.cn/opengles/1504.html Opengl es 2.0实现了可编程的图形管线,比起1.x的固定管线要复杂和灵活很多,由两部分规范组成:Opengl es 2.0 API规范和Opengl es着色语言规范。下图是Opengl es 2.0渲染管线,阴影部分是opengl es 2.0的可编程阶段。   1. 顶点着色器(Vert

OpenGL/GLUT实践:流体模拟——数值解法求解Navier-Stokes方程模拟二维流体(电子科技大学信软图形与动画Ⅱ实验)

源码见GitHub:A-UESTCer-s-Code 文章目录 1 实现效果2 实现过程2.1 流体模拟实现2.1.1 网格结构2.1.2 数据结构2.1.3 程序结构1) 更新速度场2) 更新密度值 2.1.4 实现效果 2.2 颜色设置2.2.1 颜色绘制2.2.2 颜色交互2.2.3 实现效果 2.3 障碍设置2.3.1 障碍定义2.3.2 障碍边界条件判定2.3.3 障碍实现2.3.

OpenGL——着色器画一个点

一、 绘制 在窗口中间画一个像素点: #include <GL/glew.h>#include <GLFW/glfw3.h>#include <iostream>using namespace std;#define numVAOs 1GLuint renderingProgram;GLuint vao[numVAOs];GLuintcreateShaderProgram (){c

试用GLFW并创建OpenGL和DX的环境

介绍GLFW GLFW官网:https://www.glfw.org/ GLFW is an Open Source, multi-platform library for OpenGL, OpenGL ES and Vulkan development on the desktop. It provides a simple API for creating windows, contex

鸿蒙(API 12 Beta6版)图形加速【OpenGL ES平台内插模式】超帧功能开发

超帧内插模式是利用相邻两个真实渲染帧进行超帧计算生成中间的预测帧,即利用第N-1帧和第N帧真实渲染帧预测第N-0.5帧预测帧,如下图所示。由于中间预测帧的像素点通常能在前后两帧中找到对应位置,因此内插模式的预测帧效果较外插模式更优。由于第N帧真实渲染帧需要等待第N-0.5帧预测帧生成并送显后才能最终送显,因此会新增1~2帧的响应时延。 OpenGL ES平台 业务流程 基于OpenGL

OpenGL DMA接口

Opengl的DMA版本接口主要作用是解决以前访问opengl对象, 必须先将对象绑定到当前状态机下才能访问的问题,这会导致驱动层需要去频繁的进行对象的引用查找。  比如以前非DMA版本的接口操作顶点数据  glGenBuffers(1, &vbo);glBindBuffer(GL_ARRAY_BUFFER, vbo);glBufferData(GL_ARRAY_BUFFER, sizeof