📄 01_9_13_26.asp.html
字号:
</td></tr></table><table width=100% ><tr><td class=a14>
GLfloat ambientProperties[] ={0.15f,0.15f,0.15f,1.0f};//设置环境光分量;</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
GLfloat diffuseProperties[] ={0.7f,0.7f,0.7f,1.0f};//设置漫反射光分量;</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
GLfloat specularProperties[] ={0.7f,0.7f,0.7f,1.0f};//设置镜面反射光分量;</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
GLfloat position[] = {1.0,1.0,-5.0,0.0};//设置光源位置;</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
glClearDepth(1.0f);//设置深度缓冲的值为1;</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
//把各光分量的值赋给光源0;</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
glLightfv(GL_LIGHT0,GL_AMBIENT,ambientProperties);</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuseProperties);</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
glLightfv(GL_LIGHT0,GL_SPECULAR,specularProperties);</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
glLightfv(GL_LIGHT0,GL_POSITION,position);</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
glEnable(GL_LIGHTING);//使能照明效果;</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
glEnable(GL_LIGHT0);//使能灯光0;</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
}</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
5) 场景布置 </td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
为了将物体放置在场景中合适的位置,需要使用一些OpenGL的变换操作。OpenGL变换有基本变换和投影变换两种,基本变换是对三维物体进行平移、旋转、缩放等。投影变换则把物体从三维投影到二维。视区则决定物体的投影图像在显示设备中的尺寸和位置。OpenGL中的多数变换均对应于相应的变换矩阵,可以说就是实现将物体的各个顶点通过各种变换矩阵的作用映射到屏幕的过程。根据变化的类型,分为三种矩阵模式,GL_MODELVIEW对应于基本变换,GL_PROJECTION对应于投影变换,GL_TEXTURE对应于纹理矩阵类型。具体应用见小节1,小节2。 </td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
1. 对几何造型初始化 </td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
void CDisplayView::InitGeometry()</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
{//x,y,z方向的默认旋转角度;</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
m_xRotate = 0.0f;</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
m_yRotate = 0.0f;</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
m_zRotate = 0.0f;</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
//x,y,z方向默认的平移大小;</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
m_xTrans = 0.0f;</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
m_yTrans = -0.5f;</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
m_zTrans = -3.5f;</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
//x,y,z方向默认的缩放大小;</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
m_xScaling = 1.0f;</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
m_yScaling = 1.0f;</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
m_zScaling = 1.0f;</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
}</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
2. 设置透视投影变换和视区 </td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
void DisplayView::OnSize(UINT nType, int cx, int cy)</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
{</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
CView::OnSize(nType, cx, cy);</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
GLint w=cx;</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
GLint h=cy;</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
glViewport(0,0,w,h);//设置视区;</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
glMatrixMode(GL_PROJECTION);//表明下面的矩阵操作是关于投影变换矩阵的;</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
glLoadIdentity();//单位阵作为当前矩阵;</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
gluPerspective(60.0,h/w,1.0f,128.0);//设置透视投影矩阵;</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
glMatrixMode(GL_MODELVIEW);//表明下面的矩阵操作是关于模型-取景变换矩阵的</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
glLoadIdentity();//同上;</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
glPushMatrix();//把当前的变换矩阵压栈;</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
glTranslatef(m_xTrans,m_yTrans,m_zTrans);//x,y,z方向按给定实参值进行平移;</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
glRotatef(m_xRotate,1.0f,0.0f,0.0f);//x轴旋转m_xRotate度;</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
glRotatef(m_yRotate,0.0f,1.0f,0.0f); //y轴旋转m_yRotate度;</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
glRotatef(m_zRotate,0.0f,0.0f,1.0f); //z轴旋转m_zRotate度;</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
glScalef( m_xScaling,m_yScaling,m_zScaling ); //x,y,z方向按给定实参值进行缩放;</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
glPopMatrix();//原来的变换矩阵出栈;</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
glDrawBuffer(GL_BACK);//绘制操作在后台缓存; </td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
}</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr>
<td class=a14> <b>3.3 模型的绘制 </b></td>
</tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
由于侧重模型的编辑操作,在绘制时并未计算顶点的法向量,仅仅求出了各个面片的法向量。 </td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
void CDisplayView::OnPaint()</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
{</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
CPaintDC dc(this);</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
glClearColor(0.0f,0.5f,0.5f,1.0f);//将显示窗口颜色设置为蓝绿色;</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//用该色清除颜色,深度缓存;</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
……</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
DrawScene();//绘制模型,即调用显示列表;</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
……</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
SwapBuffers(dc.m_ps.hdc);//当前设备的前台缓存和后台缓存交换;</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
}</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
void CDisplayView::Drawscene()</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
{</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
for( int i = 0;i< TotalNum;i++ )</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
glCallList(i);//调用显示列表,该数据已在2.4.1节准备完毕;</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
}</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr>
<td class=a14> <b>3.4点和面的编辑 </b></td>
</tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
为了能够编辑点和面,必须首先在显示窗口中获取相关数据,即拾取到相应的点和面,然后才能对其进行正确的编辑操作。一般的绘图程序通常只是在屏幕上绘制场景中物体的二维或三维静态图像,用户不能对其中的图形进行有效的交互。为了方便人机交互,往往需要通过鼠标等设备来选定观察体积中的某个或某几个图元,以便对其进行进一步的操作。这种在选择模式下确定选中物体的操作称为拾取操作。选择模式下的拾取操作通过将一个特殊的拾取矩阵与投影矩阵相乘,从而将绘图操作限制在视口中鼠标附近的一个小区域内。通过鼠标点击来激活选择模式,这样鼠标附近绘制的物体就会被选中,即确定了鼠标附近所绘制的物体名称。 </td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
1) 拾取数据 </td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
实现如下:</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
void CDisplayView::OnLButtonDown(UINT nFlags, CPoint point)</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
{//拾取操作有鼠标的LBUTTONDOWN消息触发;</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
……</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
glGetIntegerv(GL_VIEWPORT,viewport);//得到当前的视口;</td></tr></table><table width=100% ><tr><td class=a14>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -