b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

蓝宝书opengl_opengl编程指南 pdf_opengl超级宝典

电脑杂谈  发布时间:2017-02-05 11:30:41  来源:网络整理

opengl超级宝典_opengl编程指南 pdf_蓝宝书opengl

有时我们不仅仅是渲染场景,而且还要与渲染的场景进行交互。大多数情况下是使用鼠标进行交互。注:viewing volume(可视区域,视景体)

选择

OpenGL的选择模式允许你通过鼠标点击屏幕,来选择鼠标下面的物体。使用OpenGL的选择特性,当你点击屏幕时就指定了一个可视区域,决定了哪些物体在这个可视区域中。基于你的屏幕坐标和你指定的像素大小,glu库提供了一个有用的函数gluPickMatrix来产生一个矩阵,使用这个矩阵可以在你当前鼠标的位置产生更小的可视区域。然后你使用选择模式来测试这个可视区域,看哪些物体被包含在里面了。

在选择模式下,图像并不会被复制到帧缓冲区中(即帧缓冲区不会被修改)。反之,在可视区域中绘制的图元会在选择缓冲区中产生点击记录。这个缓冲区和其他的OpenGL缓冲区不同,它是个整型数组。

首先我们需要设置选择缓冲区,并为你的图元进行命名,这样才能在选择缓冲区中被标识。opengl超级宝典然后解析选择缓冲区得到哪些对象与可视区域相交。在可视区域外的物体将不会被绘制。为了挑选,我们会指定一个位于鼠标点下面一段小空间的可视区域,然后测试有哪些被命名的物体在这个区域内被绘制。

命名你的图元

图元的名称就像显示列表的名称一样是整型数组。图元的名称列表被存在名称栈中。在你初始化名称栈之后,你就可以往这个栈存放名称。你可以往栈顶压如新的名称,或者用当前的名称替换掉栈顶的名称。如果需要单个点击可以返回多个名称。命名图元的代码示例如下:

#defineSUN1

#defineEARTH2

#defineMOON3

voidRenderSphere()

{

glPushMatrix();

glTranslatef(0.0f,0.0f,-10.0f);

//初始化名称栈

glInitNames();

//往栈顶压栈,压如一个名称

glPushName(0);

glColor3f(1.0f,0.0f,0.0f);

//用当前名称SUN替换掉栈顶名称

glLoadName(SUN);

glutSolidSphere(1.0,26,26);

glRotatef(yRot,0.0f,1.0f,0.0f);

glTranslatef(2.0f,0.0f,0.0f);

glColor3f(0.0f,0.0f,1.0f);

//用EARTH替换掉栈顶名称

glLoadName(EARTH);

glutSolidSphere(0.3,26,26);

glTranslatef(1.0f,0.0f,0.0f);

glColor3f(0.25f,0.25f,0.75f);

//用当前名称MOON替换掉栈顶名称

glLoadName(MOON);

glutSolidSphere(0.1,26,26);

glPopMatrix();

}

注意只有在选择模式下glInitNames,glLoadName,glPushName才有效,

在GL_RENDER正常渲染模式下这些函数调用将被忽略

使用选择模式

OpenGL有三种不同的渲染模式,默认的GL_RENDER模式,还有GL_SELECTION模式和GL_FEEDBACK模式。在使用选择模式之前,我们需要切换到选择模式。调用如下:

glRenderMode(GL_SELECTION);

在选择模式渲染完物体之后,调用glRenderMode(GL_RENDER)返回点击记录。注意当调用glRenderMode(GL_RENDER)时只有在之前的模式选择模式GL_SELECTI和反馈模式下才会有返回值。返回值是点击记录,即在当前可视区域内被命名的物体的个数。


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-30673-1.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...