当前位置: 首页 > news >正文

计算机图形学·13 构建模型

本文是记录专业课计算机图形学的部分笔记,参考教材为Angel的第八版交互式计算机图形学——基于WebGL 2.0的自顶向下方法。

1、Polygonal多边形网格是由多边形彼此相接构成的网格,其中多边形称为网格的面、顶点也称为 网格的顶点。一般要求两张相邻面的公共边完全相同 (满足manifold 流行要求),例如不能出现某一面的一个顶点在另一面的边中间的情况。这是图形学表示实体模型的标准方法之一,具有①容易表示(数据结构简单);②容易变换;③性质简单(每个面只有一个法向量、容易确定内/外侧);④容易绘制(多边形填充、纹理映射)的优势。
2、当然,还有许多其它的模型表示方法如曲面造型、特征模型。但多边形网格是OpenGL接受其它表示的中转站,当利用曲面造型方法生成任意复杂曲面的时候,该曲面需要被多边形网格逼近表示OpenGL才能显示该曲面(如球面)。示例:

3、多边形网格的类型有:①实体(一般指Solid包围盒实体),是由多边形网格形成的一个封闭空间区域;②表面,不形成空间封闭区域,表示一个无限薄的曲面。两者都称为多边形网格(polygonal mesh),有时简称为网格(mesh)。其感兴趣的性质有:①实体(如果网格形成一个封闭的有界的区域);②连通性(如果任意两个顶点间存在着由边构造的连续路径);③简单性(表示一个 实体,而且没有空洞,即可以连续变形到球面);④平面性:(如果所有面都是平面多边形,这里,因为有些算法对平面多边形更有效,因此三角形网格非常实用)。

有些性质比较容易检测,即存在简单算法进行判断。而另外有些性质则比较难以判断,如判断网格是否表示有效实体并不简单。表示对象的网格可以具有上述性质中的几个或全部,关键在于用网格做什么,如果用来表示用某些材料构成的物理模型,那么就需要它至少是连通和实体,如果出于艺术角度也完全可以表示非物理的实体(例如无限薄、非流行、非定向等)。


4、如何得到网格?可以对存在实体的进行扫描(IBR)得到实体上的点,然后采用一定的算法形成网格(直接对网格进行造型是非常困难的,需要逐点进行);几何造型软件也可以把曲面转化为近似的网格表示。这里,任何表面都可以用多边形网格逼近到任意平滑精度,即多边形网格的完备性 (细分subdivision)。
5、一般而言,多边形的各顶点不必共面,但对于简单网格(三角形自动保证共面),要求同一个多边形(例如四边形)的各顶点共面。最简单的网格表示就是用每个多边形的各顶点的几何位置定义多边形,比如:

glBegin(GL_POLYGON);glVertex3f(x1, y1, z1);glVertex3f(x6, y6, z6); glVertex3f(x8, y8, z8);glVertex3f(x7, y7, z7);
glEnd();

但这无效且无结构、分离、重复表示,考虑移动一个顶点时会导致何种复杂操作?我们可以转而引入多边形的内外面:

6、一般来说,在数据结构中把几何(顶点的位置)与拓朴(顶点和边的组织)分开是一个非常好的想法。例如,多边形就是顶点的有序列表,其中每条边以相邻的顶点为端点,同时最后一个顶点与第一个顶点连接,并且即使几何信息改变了、拓朴信息可以保持不变:

不过我们很容易发现,根据顶点列表可以正确地绘制多边形,但是如果只绘制多边形的边,那么公共边就会被画两次——也可以用边表存贮网格:

7、让我们为立方体旋转程序建立彩色立方体:

//首先定义8个顶点几何位置和颜色属性的全局数组
GLfloat vertices[][3] = {{-1.0,-1.0,-1.0},{1.0,-1.0,-1.0},
{1.0,1.0,-1.0}, {-1.0,1.0,-1.0}, {-1.0,-1.0,1.0},
{1.0,-1.0,1.0}, {1.0,1.0,1.0}, {-1.0,1.0,1.0}};
GLfloat colors[][3] = {{0.0,0.0,0.0},{1.0,0.0,0.0},
{1.0,1.0,0.0}, {0.0,1.0,0.0}, {0.0,0.0,1.0},
{1.0,0.0,1.0}, {1.0,1.0,1.0}, {0.0,1.0,1.0}};//根据在顶点数组中的一组索引绘制一个四边形,颜色对应于第一个索引
void polygon(int a, int b, int c , int d){glBegin(GL_POLYGON);glColor3fv(colors[a]);//颜色数组中第一个颜色glVertex3fv(vertices[a]);glVertex3fv(vertices[b]);glVertex3fv(vertices[c]);glVertex3fv(vertices[d]);glEnd();
}//……
void colorcube( )  //利用表面绘制立方体
{polygon(0,3,2,1);polygon(2,3,7,6);polygon(0,4,7,3);polygon(1,2,6,5);polygon(4,5,6,7);polygon(0,1,5,4);
}
//注意顶点的顺序保证表面的法向指向正确的方向,即立方体的外侧

显然,这种方法的缺陷在于需要进行很多次函数调用才能绘制立方体:6个面,每个面调用4次( 几何位置4次,颜色4次),8个点,每个点调用3次( 几何位置3次,颜色3次),如果应用纹理和光照的话还会更多。
8、OpenGLn提供了一种功能,称为顶点数组(vertex arrays),利用这种功能可以存贮数组数据(六种数据类型):Vertices顶点、Colors颜色、Color indices索引颜色、Normals法向、Texture coordinates纹理坐标、Edge flags边标志。不过我们目前只需要RGB颜色与顶点数组。

//为了利用颜色与顶点数据,首先激活相应功能
glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);
//标识数组的位置
glVertexPointer(3, GL_FLOAT, 0, vertices);
//3表示三维数组,GL_FLOAT存贮为浮点数,0表示数据是连接存放的,最后参数指定所在的数组
glColorPointer(3, GL_FLOAT, 0, colors);//每四个相邻的索引描述立方体一个表面
GLubyte cubeIndices[24] = {0,3,2,1,2,3,7,60,4,7,3,1,2,6,5,4,5,6,7,0,1,5,4};//利用glDrawElements取代在显示回调函数中所有的glVertex和glColor进行绘制
//方法一:
for(i=0; i<6; i++) glDrawElements(GL_POLYGON, 4, GL_UNSIGNED_BYTE, &cubeIndices[4*i]);
//参数分别绘制对象类型、索引的数目、索引数据的格式、索引数据的开始
//方法二:
glDrawElements(GL_QUADS, 24, GL_UNSIGNED_BYTE, cubeIndices);
//只需要一次函数调用就绘制出来立方体!!!

9、在提供多边形网格的顶点及其相连信息的同时,应当同时给出每个面的法向。在实际使用时,更有优势的方法是把法向与顶点关联在一起,即点法向(OpenGL采用的方式)。

那怎么算呢?顶点可以由用户输入,但是法向计算不是很直接,有时候法向可以来自于数学模型,例如曲面被网格逼近时可以用原来曲面的法向作为所需的法向。而如果需要把某一面显示为平坦的效果,那么只要得到该面所在平面的法向就可以了,如某面上连续三点为V1, V2, V3, 那么n = (V1 – V2)× (V3 – V2)就是所需要的法向,必要时可以进行单位化。
10、但是,上述简单算法存在一些问题:①如果所采用的两个向量几乎平行,会导致数值不稳定结果;②如果多边形不是完全共面,那么所采用的法向不具代表性。所以引入Martin Newell 马丁诺维尔方法:

11、多面体是由简单表面(平面)构造的连通网格,其形成一个有限体积的封闭实体,具有性质:①多面体的每边都有两个面共享;②每个顶点至少有三条边;③两个面之间要么无交,要么只在公共边或顶点处相交(流行要求);④环面为多面体,当且仅当各面为平面(例如四面体为多面体)。


12、如果多面体的所有面是全等的,而且每个都是正多边形,那么称之为正多面体。可以证明只有五种正多面体 ,称为Platonic体。

http://www.dtcms.com/a/598652.html

相关文章:

  • 营销型网站哪家做的好苏州网站优化找哪家
  • 嵌入式面试高频题:模拟电路+数字电路(含标准答案)
  • 长沙河东做网站深圳ui设计
  • 作业1111
  • 若依使用技巧
  • 高大上设计网站欣赏付费链接生成平台
  • 我是谁,我能干什么?
  • 加强医院网站建设网站的视频做gif
  • 简述网站建设的上海百度优化
  • 广州专业网站建设后台管理便捷o2o网站建设基本流程
  • Shell脚本定时备份数据库目录到远程服务器,并保留指定数量的备份
  • style wordpress 主题企业网站优化咨询
  • 做一个手机购物网站多少钱3合1网站建设价格
  • 导航网站帝国cms模版关于申请建设门户网站的
  • 构建AI智能体:九十一、大模型三大适应技术详解:有监督微调、提示学习与语境学习
  • Linux下如何使用git工具
  • 朋友给我做网站网站解封原因
  • Android 协程间通信
  • 网站建设速度如何解决沧州做网络推广的平台
  • 网站建设系统 网站自助建站系统平湖网站制作
  • asp伪静态网站如何做筛选网站如何做微信支付宝支付宝支付接口
  • 温州苍南网站建设上海十大猎头公司排名
  • 在家做的手工活哪里有网站郑州短视频拍摄制作
  • 做网站好做网站公司职员工资
  • 线程不是独立的!而是同步的!
  • 招商加盟网站推广方案济南做网站要多少钱
  • 做网站apache如何网站建设找超速云建站
  • 网站关联页面如何做大连网龙网络科技
  • 网站推广策划的思路包括哪些内容中国黄页
  • LeetCode hot100:234 回文链表:快慢指针巧判回文链表