下利用构造自由型曲线曲面物业
对自由型曲线曲面的绘制
OpenGL的一个很大的优点就是在绘制构造三维实体的光滑曲线和曲面时只需少量控制点就完成了对其的精确描述,而不必靠大量的基本图元去拟合。NURBS就是我们熟悉的B样条的扩展,只不过引入了权因子并以有理分式表示其曲线。因此用OpenGL的NURBS编程接口绘制自由型曲线曲面只需预先对节点序列和控制点进行定义即可完成对NURBS样条的精确描述:
//节点序列
GLfloat Notes[8]={0.0f,0.0f,0.0f,0.0f,1.0f,1.0f,1.0f,1.0f};
//定义控制点
for(int i=0;i4;i++)
{
一边享受着篝火带来的海量经验。组队人数越多 for(int j=0;j4;j++)
{
LinchpinPt[i][j][0]=(GLfloat)(3.0f*(i-0.5f));
LinchpinPt[i][j][1]=(GLfloat)(3.0f*(j-0.5f));
if(0i i3 0j j3)
LinchpinPt[i][j][2]=4.0f;
else
LinchpinPt[i][j][2]=-4.0f;
}
}
使用OpenGL提供的NURBS编程接口进行编程比较简洁:首先创建一个NURBS曲面对象并根据需要对其属性进行设置,在调用了gluBeginSurface()或是gluBeginCurve()后就可以根据前面定义的控制点对其曲线曲面进行绘制了,绘制完毕后以gluEndSurface()或gluEndCurve()结束:
//创建NURBS曲面对象
Nurb=gluNewNurbsRenderer();
//设置NURBS曲面对象属性
gluNurbsProperty(Nurb,GLU_SAMPLING_TOLERANCE,30.0f);
gluNurbsProperty(Nurb,GLU_DISPLAY_MODE,GLU_FILL);
//开始NURB区间绘制
gluBeginSurface(Nurb);
//定义NURBS曲面的形状
gluNurbsSurface(Nurb,8,Notes,8,
Notes,4*3,3,
LinchpinPt[0][0][0],
4,4,GL_MAP2_VERTEX_3);
//结束曲面绘制
gluEndSurface(Nurb);
glPopMatrix();
//强制绘图,不驻留缓存
glFlush();
其中gluNurbsSurface()是定义NURBS曲线曲面的关键函数,其函数原型定义如下:
void gluNurbsSurface(
GLUnurbsObj * nobj, //NURBS曲面对象
GLint sknot_count, //u方向节点数目
GLfloat * sknot, //u方向节点数组指针
GLint tknot_count, //v方向节点数目
GLfloat * tknot, //v方向节点数组指针
GLint s_stride, //u方向控制点数据跨度
GLint t_stride, //v方向控制点数据跨度
GLfloat * ctlarray, //控制点数组指针
GLint sorder, //u方向上多项式阶数
GLint torder, //v方向上多项式阶数
GLenum type //确定求值器类型
);
另有一gluNurbsCurve()函数也可用于对NURBS曲线曲面的定义,具体使用方法与之类似。
光照和材质的渲染
为更真实地对实体进行三维建模,需要对已构造成型的自由型曲线曲面进行光照和材质上的渲染。OpenGL对此提供有一系列的用于建立光照模型的库函数,使用户可以很方便地在三维场景中建立所需的光照模型。OpenGL中的光照模型由环境光(Ambient Light)、漫射光(Diffuse Light)、镜面反射光(Specular Light)等组成,同时还可设置光线衰减因子来模拟真实的光源效果。下面这段代码定义了一个黄色光源:
GLfloat Light_position[]={1.0f,1.0f,1.0f,0.0f,};
GLfloat Light_diffuse[]={1.0f,1.0f,0.0f,1.0f,};
glLightfv(GL_LIGHT0,GL_POSITION,Light_position); //定义光源位置
glLightfv(GL_LIGHT0,GL_DIFFUSE,Light_diffuse); //定义光源漫射光
glEnable(GL_AUTO_NORMAL); //自动生成曲面法向量
glEnable(GL_LIGHTING); //启动光照模型;
glEnable(GL_LIGHT0); //使光源GL_LIGHT0有效
其中glEnable(GL_AUTO_NORMAL)函数可以自动生成曲面法向量来对光照进行处理。OpenGL里提供了GL_LIGHT0~GL_LIGHT7八个光源,在这里glEnable()使用的是GL_LIGHT0光源。虽然通过定义光源可以提高一定的真实度,但对三维实体的材质定义更可大幅提高程 序所绘制曲面的逼真程度。OpenGL中所指的材质均指构成三维实体的材料在光照模型中对于R、G、B三原色的反射率。与光源的定义类似,材质的定义分环境、漫射、 镜面反射等成分,另外还有镜面高光指数、辐射成分等等:
//设置材质的反射成分
GLfloat mat_ambient[]={0.8f,0.8f,0.8f,1.0f};
GLfloat mat_diffuse[]={0.8f,0.0f,0.0f,1.0f}; //紫色
GLfloat mat_specular[]={1.0f,0.0f,1.0f,1.0f}; //镜面高光亮紫色
GLfloat mat_shininess[]={100.0f}; //高光指数
glMaterialfv(GL_FRONT,GL_AMBIENT,mat_ambient); //定义环境光反射率
glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse); //定义漫射光反射率
glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular); //定义镜面光反射率
glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess); //定义高光指数
OpenGL中材质的颜色与光照模型中光源的颜色含义是不同的。对于在光源中的定义,R、G、B分别表示三原色在光源中所占的比率;而对于材质的定义,R、G、B则表示具有这种材质属性的物体对于三原色的反射率,场景中物体所呈现的颜色是光照模型、材质定义共同作用的结果。
结论
本文通过OpenGL辅助库提供的NURBS编程接口,在VC++下对自由型曲线曲面进行了绘制,并介绍了对其曲面的光照和材质的渲染方法。通过对本文的理解可以通过OpenGL绘制自由型曲线曲面来更好的对三维实体进行建模,并可进一步感受到OpenGL在三维图形计算机应用中的微妙之处。
查看本文来源
海口治疗男性功能障碍哪家好小孩脾虚便秘怎么调理
长春盆腔炎治疗哪家好
- 夏季这么热为什么还要做美缝?看剩这3点你就懂了!
- 中年男人有这些举动,无需再问,深爱你无疑
- 婆婆要求每月2千,儿媳给3千,看到家里多出的男人,儿媳收钱不给
- 兼顾安全与便利 多家银行大幅提高个人账户线上交易限额
- 为什么佩戴笔记本电脑后能听见声音却听不清?
- 最高检:1至3月批捕各类犯罪案件嫌疑人14.3万人,其中未成年4269人
- 工信部:按“一企一策”,积极稳妥有序推进信息化企业复工复产
- “空气香甜女”杨舒平:被美国逼迫遭韩国拒绝,回国更没企业接纳
- 政府机关里真正厉害的人不是会斗小人,而是会利用小人,句句戳心!
- 文献导读||方式有剂量去甲肾上腺素对腰麻后低血压的预防作用
- 曾经全球第一的诺基亚,连叫作都丢了!
- 太太爱上年轻女人不回家,妻子却穿着奇怪带婆婆看病,引路人心疼