关于网格化tessellation的理解和问题
2011-10-15 14:03
417 查看
首先网格化的步骤为(代码示意)
GLUtesselator *pTessLator;
pTessLator=gluNewTess(); //创建网格化对象
gluTessCallback(pTessLator,GLU_TESS_BEGIN,(void (__stdcall *)())glBegin);//设置回调函数
gluTessCallback(pTessLator,GLU_TESS_END,(void (__stdcall *)())glEnd);
gluTessCallback(pTessLator,GLU_VERTEX,(void (__stdcall *)())glVertex3dv);
gluTessCallback(pTessLator,GLU_TESS_ERROR,(void (__stdcall *)())TessError);
gluTessBeginPolygon(pTessLator,NULL);//开始一条曲线,后面逐一指定顶点,所以第二参数为空
gluTessBeginContour(pTessLator);
group=&(tess.groups[0]);
vector<VertexPoint>::iterator it;
GLdouble vertex[10][3];
int i=0;
for (it=group->vertexsArray.begin();it!=group->vertexsArray.end() ;it++)
{
VertexPoint vp=*it;
vertex[i][0]=vp.xyz[0];
vertex[i][1]=vp.xyz[1];
vertex[i][2]=vp.xyz[2];
gluTessVertex(pTessLator,vertex[i],vertex[i]);
}
gluTessEndContour(pTessLator);
gluTessEndPolygon(pTessLator);
gluDeleteTess(pTessLator);
上面代码正确执行了网格化
但是,上述代码中的红色代码片段。有以下五点:
1. 就是如果只有一个环绕,环绕上各个顶点在三维空间上应尽量处于同一个平面,否则可能看不到网格化结果(这里不解释网格化原理);如果存在多个环绕,相邻环绕可以处在同一平面,也可以不处在同一平面,但是他们之间的深度不能超过他们之间的平面宽度,否则也看不到多环绕的网格化结果。
2. 个就是顶点数组变量vertex,如果vertex的定义放在for循环里面,而且改成一维数组的形式,如下面代码所示
for (it=group->vertexsArray.begin();it!=group->vertexsArray.end() ;it++)
{
VertexPoint vp=*it;
GLdouble vertex[3]={vp.xyz[0],vp.xyz[1],vp.xyz[2]};
gluTessVertex(pTessLator,vertex,vertex);
}
顶点vertex就成了for循环里的局部变量,这时候不能进行网格化,运行看不到结果。原因就是gluTessVertex(pTessLator,vertex,vertex)的第三个参数是void* data类型的,它就是顶点数据来源,必须提供一个跟网格化对象pTessLator同作用域或者更大作用域的数据来源指针,以便回调传给glVertex函数绘制顶点,否则无法找到顶点渲染。
3. 在上面正确运行结果的代码里面,gluTessVertex(pTessLator,vertex[i],vertex[i])的第三个参数vertex[i]指定了顶点的数据来源,不一定要跟第二个参数一致,可以是vertex[(i+a)%N],其中a为任一正整数,N为分隔化曲线的顶点个数。如可以改为
gluTessVertex(pTessLator,vertex[i],vertex[(i+5)%10]);//加入顶点总数为10
程序运行结果正确
4.如果是多个环绕的网格化,相邻环绕各自环绕曲线上的顶点数可以不相等,如下图示,外环绕有是个控制顶点,内部则有五个
5.如果是多环绕,相邻环绕线不能有交叉,否则看不到结果
如下环绕线就不能网格化
相关文章推荐
- 关于网格化tessellation的理解和问题
- 关于文件(软件)签名问题的理解
- 关于dll及跨语言调用的问题的一些理解
- 关于SOA几个问题的理解
- 关于“-128的补码补码问题”理解
- 关于服务器响应,浏览器请求的理解以及javaWeb项目的编码问题
- 关于caffe与深入理解计算机系统的一个问题
- 关于大家对SOA理解的问题(刘立恒)
- 关于问题warning: passing arg 2 of `bind' from incompatible pointer type理解
- 关于C语言基本元素的相关问题自己的理解
- java 关于对“是否可以从一个static方法内部发出对非static方法的调用”问题的理解
- ssh中难理解的问题总结(一)-关于hibernate中的sessionFactory与http中的session
- 关于dp01背包问题的几点理解(二维数组,java实现)
- 关于背包问题的一些理解和应用
- java:关于short s1=1;s1=s1+1;short s1=1;s1+=1;short s3=s1+s2;中存在的简单数据类型转换问题的理解
- 关于两个栈的共享空间问题理解。
- 关于编码问题的理解
- 关于String和StringBuffer的理解问题:指针、变量的声明、变量的值的变化
- VUE 关于理解$nextTick()的问题
- 关于Android 6.0二维码生成和识别的简单理解和常见问题