测投影图,X轴正方向向右,Y轴正方向向下,X、Y、Z三个轴正方成右手坐标系.曲面显示在Z轴负坐标的位置上。图2-4中所示为轮船船艏,首柱线与设计水线交于曲面的右上角;最大横剖线与设计水线交于曲面左上角:曲面右下角为首柱线与龙骨线的切点或交点:曲面左下角为最大横剖线与底部龙骨起跑线的交点。
图2-4 运行结果
2.5 主程序
#include \
#include \ /添加头文件名/ #include
#define PI ((double)3.1415926)
#define RADIANS(fAngle) ((double)(fAngle)*PI/180.0)
COpenGL::COpenGL(void):type(MESH) /类型网格/ { //GLfloat points[4][4][3]= // GLfloat points[4*4*3]= // {
//{{-0.8f,-0.6f,0.8f},{-0.2f,-0.6f,1.6f},{0.2f,-0.6f,-0.4f},{0.6f,-0.6f,0.8f}}, //{{-0.6f,-0.2f,0.8f},{-0.2f,-0.2f,1.6f},{0.2f,-0.2f,-0.4f},{0.6f,-0.2f,0.8f}}, // {{-0.6f,0.2f,0.8f},{-0.2f,0.2f,0.4f},{0.2f,0.2f,0.0f},{0.3f,0.2f,-0.4f}}, // {{-0.6f,0.6f,0.8f},{-0.2f,0.6f,0.4f},{-0.8f,0.6f,0.0f},{0.8f,0.6f,-0.4f}} // }; / 输入各点坐标 / // for(int i=0;i<4;i++){ // for (int j=0;j<4;j++){ // for (int m=0;m<3;m++){ // controlPoints[i][j][m]=points[i*4*3+j*3+m]; // } // } // } }
COpenGL::~COpenGL(void) /添加函数类型为void/ { wglMakeCurrent(hDC, NULL); wglDeleteContext(hRC); }
void COpenGL::Init(void) { glClearColor(1.0,1.0,1.0,1.0);
glClearDepth(1.0); glEnable(GL_DEPTH_TEST); glShadeModel(GL_SMOOTH); glDepthFunc(GL_LEQUAL); glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); }
bool COpenGL::SetupPixelFormat(HDC hDC0) { int nPixelFormat; hDC=hDC0; PIXELFORMATDESCRIPTOR pfd = { sizeof(PIXELFORMATDESCRIPTOR), 1, PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER, PFD_TYPE_RGBA, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, PFD_MAIN_PLANE, 0, 0, 0, 0 }; if (!(nPixelFormat = ChoosePixelFormat(hDC, &pfd))) { MessageBox(NULL,\not find proper mode\TION); /若错误则显示can not find proper mode error/ return FALSE; /返回FLASH/ } SetPixelFormat(hDC,nPixelFormat,&pfd); hRC = wglCreateContext(hDC); wglMakeCurrent(hDC, hRC); return TRUE; /返回TURE/ }
void COpenGL::Reshape(int width,int height) {
// glViewport(0,0,width,height);
// glMatrixMode(GL_PROJECTION); // glLoadIdentity();
// gluPerspective(60,(GLfloat)width/(GLfloat)height,0.1,3000.0);
// glMatrixMode(GL_MODELVIEW); glViewport(0,0,width,height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(60,(GLfloat)width/(GLfloat)height,0.1,3000.0); glMatrixMode(GL_MODELVIEW); //glMatrixMode(GL_MODELVIEW); }
enum Aspect{FRONT,BACK,LEFT,RIGHT,UP,DOWN};
enum Color{BLUE,GREEN,RED,ORANGE,WHITE,YELLOW}; /代表颜色索引值/ const GLubyte colorTable[6][3]={ {0,0,255},{0,255,0},{255,0,0},{255,102,0},{255,255,255},{255,255,0} };
void COpenGL::Render() { glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glLoadIdentity(); gluLookAt(0,0,3,0,0,0,0,1,0); switch(type){ case MESH: DrawMesh(); /绘制网格/ break; case FILL: DrawFill(); /绘制填充曲面/ break; case TEXTURE: DrawTexture(); /绘制贴图曲面/ break; default: break; } //draw stuff // draw cube // GLint vertices[8][3]={ // {-1,-1,-1},{1,-1,-1},{-1,-1,1},{1,-1,1}, // {-1,1,-1},{1,1,-1},{-1,1,1},{1,1,1} // }; // //in order: front ,back ,left ,right,top,bottom // GLubyte vertIndex[6][4]={ // 6,2,3,7, // 5,1,0,4, // 4,0,2,6, // 7,3,1,5, // 7,5,4,6, // 2,0,1,3 // };
// for (int i=0;i<6;i++){ // glColor3ubv(colorTable[i]); // glBegin(GL_QUADS); // for (int j=0;j<4;j++){ // glVertex3iv(vertices[vertIndex[i][j]]); // } // glEnd(); // } glFlush(); SwapBuffers(hDC); }
void COpenGL::DrawMesh() { GLfloat controlPoints[4][4][3]= { {{-0.8f,-0.6f,0.8f},{-0.2f,-0.6f,1.6f},{0.2f,-0.6f,-0.4f},{0.6f,-0.6f,0.8f}}, {{-0.6f,-0.2f,0.8f},{-0.2f,-0.2f,1.6f},{0.2f,-0.2f,-0.4f},{0.6f,-0.2f,0.8f}}, {{-0.6f,0.2f,0.8f},{-0.2f,0.2f,0.4f},{0.2f,0.2f,0.0f},{0.3f,0.2f,-0.4f}}, {{-0.6f,0.6f,0.8f},{-0.2f,0.6f,0.4f},{-0.8f,0.6f,0.0f},{0.8f,0.6f,-0.4f}} }; /定义控制点/ int i,j; glMap2f(GL_MAP2_VERTEX_3,0,1,3,4,0,1,12,4,(float*)controlPoints); /二维评价器/ glEnable(GL_MAP2_VERTEX_3); glColor3f(0,0,1); /激活/ glPushMatrix(); glRotated(45,1,1,1); for (j=0;j<8;j++){ glBegin(GL_LINE_STRIP); for (i=0;i<30;i++){ glEvalCoord2f((float)i/30,(float)j/8); } glEnd(); glBegin(GL_LINE_STRIP); for (i=0;i<30;i++){ glEvalCoord2f((float)j/8,(float)i/30); } glEnd(); } glPopMatrix(); /绘制/ glDisable(GL_MAP2_VERTEX_3); /挂起/ } /该函数将绘制一个网格曲面/
void COpenGL::DrawFill() /绘制填充曲面/ { GLfloat controlPoints[4][4][3]= {
{{-0.8f,-0.6f,0.8f},{-0.2f,-0.6f,1.6f},{0.2f,-0.6f,-0.4f},{0.6f,-0.6f,0.8f}}, {{-0.6f,-0.2f,0.8f},{-0.2f,-0.2f,1.6f},{0.2f,-0.2f,-0.4f},{0.6f,-0.2f,0.8f}}, {{-0.6f,0.2f,0.8f},{-0.2f,0.2f,0.4f},{0.2f,0.2f,0.0f},{0.3f,0.2f,-0.4f}}, {{-0.6f,0.6f,0.8f},{-0.2f,0.6f,0.4f},{-0.8f,0.6f,0.0f},{0.8f,0.6f,-0.4f}} /输入控制点/ }; Lighting(); /增加光照函保护成员数/ glEnable(GL_AUTO_NORMAL); glEnable(GL_NORMALIZE); /光照函数/ glMap2f(GL_MAP2_VERTEX_3,0,1,3,4,0,1,12,4,(float*)controlPoints); /二维评价器/ glMapGrid2f(30,0,1,30,0,1); /自动网格/ glEnable(GL_MAP2_VERTEX_3); /激活/ glPushMatrix(); glRotated(45,1,1,1); glEvalMesh2(GL_FILL,0,30,0,30); glPopMatrix(); /绘制/ glDisable(GL_MAP2_VERTEX_3); glDisable(GL_AUTO_NORMAL); glDisable(GL_NORMALIZE); glDisable(GL_LIGHTING); } /挂起/
void COpenGL::DrawTexture() /绘制贴图曲面/ {
GLfloat controlPoints[4][4][3]= { {{-0.8f,-0.6f,0.8f},{-0.2f,-0.6f,1.6f},{0.2f,-0.6f,-0.4f},{0.6f,-0.6f,0.8f}}, {{-0.6f,-0.2f,0.8f},{-0.2f,-0.2f,1.6f},{0.2f,-0.2f,-0.4f},{0.6f,-0.2f,0.8f}}, {{-0.6f,0.2f,0.8f},{-0.2f,0.2f,0.4f},{0.2f,0.2f,0.0f},{0.3f,0.2f,-0.4f}}, {{-0.6f,0.6f,0.8f},{-0.2f,0.6f,0.4f},{-0.8f,0.6f,0.0f},{0.8f,0.6f,-0.4f}} }; /几何控制点/ GLfloat textureCntrlPnt[2][2][2]={0,0,0,1,1,0,1,1 }; /纹理控制点/
AUX_RGBImageRec *textureImage=LoadBMP(\ /载入song.bmp图片/ // Load The Bitmap, Check For Errors, If Bitmap's Not Found Quit if (textureImage){ glPixelStoref(GL_UNPACK_ALIGNMENT,1); glTexImage2D(GL_TEXTURE_2D,0,3,textureImage->sizeX,textureImage->sizeY,0,GL_BGR_EXT,GL_UNSIGNED_BYTE,textureImage->data);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP); glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP); glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST); glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST); glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL); /构造纹理/
glMap2f(GL_MAP2_VERTEX_3,0,1,3,4,0,1,12,4,(float*)controlPoints); glMap2f(GL_MAP2_TEXTURE_COORD_2,0,1,2,2,0,1,4,2,(float*)controlPoints);