⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 demoview.cpp

📁 显示地震剖面对地震专业的学生来说显示地震剖面特别重要本程序实现了地震剖面的绘制
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	glMultMatrixf(Transform.M);//旋转

	//自由旋转
	if(ENABLEANIMATE)
	{
		float x,y,z;
		x=rot[0]*3.1416/180;
		y=rot[1]*3.1416/180;
		z=rot[2]*3.1416/180;
		glRotatef(rot[0], 0.0f, 1.0f,0.0f);//X
		glRotatef(rot[1], 1.0f, 0.0f, 0.0f);//Y
		glRotatef(rot[2], 0.0f, 0.0f, 1.0f);//Z
	}

	if(SHOWPOINTS==TRUE)
		DrawPoints(mode);
    if(SHOWTRIMESH==TRUE)
		DrawTriMesh(mode);
	if(ENABLELIGHT==TRUE)
		ShowLight();
    if(TEXTURE==TRUE)
	    GlTexture();//贴纹理

	if(SHOWAXIS==TRUE)
		DrawAxis();
	if(SHOWINDEX==TRUE)
		DrawIndex();
	
	glPopMatrix();

	//在状态栏显示旋转角度
	CMainFrame* pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd;
	CStatusBar* PStatus=&pFrame->m_wndStatusBar;
	CString statusmessage;
	statusmessage.Format("X: %d ;Y: %d ;Z: %d",(int)rot[0]%(360),(int)rot[1]%(360),(int)rot[2]%(360));
//	statusmessage.Format("X: %f ;Y: %f ;Z: %f",positionx,positiony,positionz);
//	statusmessage.Format("X: %f ;Y: %f ;Z: %d",rot[0],rot[1],rot[2]);
	PStatus->SetPaneText(1,statusmessage);

	glFinish();
	SwapBuffers(wglGetCurrentDC());
}

//显示函数//////////////////////////////////////////////////////////////////
//显示点集
void CDemoView::DrawPoints(GLenum mode)
{
	glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

	if(mode!=GL_SELECT)
	{
	glPointSize(2.0f);
	glBegin(GL_POINTS);
	{
		for(int i=0;i<dlgload.n3dpoint;i++)
		{
			//if(mode==GL_SELECT) glLoadName(i);
			if(i==(int)selectindex)
			{
				glColor3f(0.0f,0.0f,1.0f);
				glVertex3f(dlgload.m_point3d[i][0],dlgload.m_point3d[i][1],dlgload.m_point3d[i][2]);
			}
			else
			{
				glColor3f(1.0f,0.0f,0.0f);
				glVertex3f(dlgload.m_point3d[i][0],dlgload.m_point3d[i][1],dlgload.m_point3d[i][2]);
			}
		}
	}
	glEnd();
	}
	//将点变换为球,因为点不是几何体不能工作在选择模式下
	if(mode==GL_SELECT)
	{
		GLfloat red[]={1.0,0.0,0.0,1.0};
		GLfloat white[]={1.0,1.0,1.0,1.0};
		glPolygonMode(GL_BACK,GL_FILL);
		glEnable(GL_LIGHTING);
		for(int i=0;i<dlgload.n3dpoint;i++)
		{
			if(mode==GL_SELECT) glLoadName(i);
			if(i==(int)selectindex)
			{
				glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,red);
				glTranslatef(dlgload.m_point3d[i][0],dlgload.m_point3d[i][1],dlgload.m_point3d[i][2]);
			//	glutSolidSphere(0.03,5,5);
				glTranslatef(-dlgload.m_point3d[i][0],-dlgload.m_point3d[i][1],-dlgload.m_point3d[i][2]);
			}
			else
			{
				glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,white);
				glTranslatef(dlgload.m_point3d[i][0],dlgload.m_point3d[i][1],dlgload.m_point3d[i][2]);
			//	glutSolidSphere(0.03,5,5);
				glTranslatef(-dlgload.m_point3d[i][0],-dlgload.m_point3d[i][1],-dlgload.m_point3d[i][2]);
			}
		}
		glDisable(GL_LIGHTING);
	}
}
//显示三角网格
void CDemoView::DrawTriMesh(GLenum mode)
{
	glLineWidth(1.0f);
    glColor3f(0.0f,0.0f,0.0f);
	for(int i=0;i<dlgload.ntri;i++)
	{
		glBegin(GL_LINE_LOOP);
	        glVertex3f((float)dlgload.m_point3d[dlgload.triangle[i][0]][0],(float)dlgload.m_point3d[dlgload.triangle[i][0]][1],(float)dlgload.m_point3d[dlgload.triangle[i][0]][2]);
		    glVertex3f((float)dlgload.m_point3d[dlgload.triangle[i][1]][0],(float)dlgload.m_point3d[dlgload.triangle[i][1]][1],(float)dlgload.m_point3d[dlgload.triangle[i][1]][2]);
		    glVertex3f((float)dlgload.m_point3d[dlgload.triangle[i][2]][0],(float)dlgload.m_point3d[dlgload.triangle[i][2]][1],(float)dlgload.m_point3d[dlgload.triangle[i][2]][2]);
		glEnd();
	}
}
//显示三角化贴纹理
void CDemoView::GlTexture()
{
	glPushMatrix();
	GLubyte *pTextureBits2=(GLubyte *)dlgload.mDib2.Buffer();
	glPixelStorei(GL_UNPACK_ALIGNMENT,1);

	//定义纹理
	glTexImage2D(GL_TEXTURE_2D,0,3,512,512,0,GL_BGR_EXT,GL_UNSIGNED_BYTE,pTextureBits2);

	//控制纹理
	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_LINEAR);
	glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);

	//说明纹理贴图方式
	glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL);

	//启动纹理贴图
	glEnable(GL_TEXTURE_2D);
	glShadeModel(GL_SMOOTH);

	//定义纹理坐标和物体几何坐标//三角化贴纹理
	for(int i=0;i<dlgload.ntri;i++)
	{
		float texcoord[3][2];
		texcoord[0][0]=(float)dlgload.m_point2d[dlgload.triangle[i][0]][0]/dlgload.ImageSize.cx;
		texcoord[0][1]=(dlgload.ImageSize.cy-(float)dlgload.m_point2d[dlgload.triangle[i][0]][1])/dlgload.ImageSize.cy;
		texcoord[1][0]=(float)dlgload.m_point2d[dlgload.triangle[i][1]][0]/dlgload.ImageSize.cx;
		texcoord[1][1]=(dlgload.ImageSize.cy-(float)dlgload.m_point2d[dlgload.triangle[i][1]][1])/dlgload.ImageSize.cy;
		texcoord[2][0]=(float)dlgload.m_point2d[dlgload.triangle[i][2]][0]/dlgload.ImageSize.cx;
		texcoord[2][1]=(dlgload.ImageSize.cy-(float)dlgload.m_point2d[dlgload.triangle[i][2]][1])/dlgload.ImageSize.cy;
	    glBegin(GL_TRIANGLES);
 		    glTexCoord2f(texcoord[0][0],texcoord[0][1]);
			glVertex3f((float)dlgload.m_point3d[dlgload.triangle[i][0]][0],(float)dlgload.m_point3d[dlgload.triangle[i][0]][1],(float)dlgload.m_point3d[dlgload.triangle[i][0]][2]);
 		    glTexCoord2f(texcoord[1][0],texcoord[1][1]);
			glVertex3f((float)dlgload.m_point3d[dlgload.triangle[i][1]][0],(float)dlgload.m_point3d[dlgload.triangle[i][1]][1],(float)dlgload.m_point3d[dlgload.triangle[i][1]][2]);
 		    glTexCoord2f(texcoord[2][0],texcoord[2][1]);
			glVertex3f((float)dlgload.m_point3d[dlgload.triangle[i][2]][0],(float)dlgload.m_point3d[dlgload.triangle[i][2]][1],(float)dlgload.m_point3d[dlgload.triangle[i][2]][2]);
	    glEnd();
	}
    glDisable(GL_TEXTURE_2D);
	glPopMatrix();
}
//启用光照
void CDemoView::ShowLight()
{
	glPushMatrix();

	//定义材质
	GLfloat mat_diffuse[]={0.8f,0.8f,0.5f,1.0f};
    //GLfloat mat_specular[]={0.0f,0.0f,0.0f,1.0f};
    //GLfloat mat_shininess[]={50.0f};
	glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,mat_diffuse);
    //glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);
    //glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess);

    glClearColor(0.0,0.0,0.0,0.0);
    glShadeModel(GL_SMOOTH);

    glPolygonMode(GL_FRONT,GL_FILL);
	glColor3f(1.0f,1.0f,1.0f);

	for(int i=0;i<dlgload.ntri;i++)
	{
		double dPoint1[3],dPoint2[3],dPoint3[3],dNormal[3];
		dPoint1[0]=dlgload.m_point3d[dlgload.triangle[i][0]][0];
		dPoint1[1]=dlgload.m_point3d[dlgload.triangle[i][0]][1];
		dPoint1[2]=dlgload.m_point3d[dlgload.triangle[i][0]][2];
		dPoint2[0]=dlgload.m_point3d[dlgload.triangle[i][1]][0];
		dPoint2[1]=dlgload.m_point3d[dlgload.triangle[i][1]][1];
		dPoint2[2]=dlgload.m_point3d[dlgload.triangle[i][1]][2];
		dPoint3[0]=dlgload.m_point3d[dlgload.triangle[i][2]][0];
		dPoint3[1]=dlgload.m_point3d[dlgload.triangle[i][2]][1];
		dPoint3[2]=dlgload.m_point3d[dlgload.triangle[i][2]][2];
		CaculateNormal(dPoint1,dPoint2,dPoint3,dNormal);
		glBegin(GL_POLYGON);
			glNormal3dv(dNormal);
			glVertex3f((float)dlgload.m_point3d[dlgload.triangle[i][0]][0],(float)dlgload.m_point3d[dlgload.triangle[i][0]][1],(float)dlgload.m_point3d[dlgload.triangle[i][0]][2]);
			glVertex3f((float)dlgload.m_point3d[dlgload.triangle[i][1]][0],(float)dlgload.m_point3d[dlgload.triangle[i][1]][1],(float)dlgload.m_point3d[dlgload.triangle[i][1]][2]);
			glVertex3f((float)dlgload.m_point3d[dlgload.triangle[i][2]][0],(float)dlgload.m_point3d[dlgload.triangle[i][2]][1],(float)dlgload.m_point3d[dlgload.triangle[i][2]][2]);
		glEnd();
	}
	glPopMatrix();
}
//显示坐标轴
void CDemoView::DrawAxis()
{
	glPushMatrix();

	glColor3f(1.0f,0.0f,0.0f);
	wglUseFontBitmaps(wglGetCurrentDC(),0,256,1000);
	glListBase(1000);
	glRasterPos3f(1.1f,0.0f,0.0f);
	glColor3f(0.0f,1.0f,0.0f);
	glCallLists(1,GL_UNSIGNED_BYTE,"X");
	glRasterPos3f(0.0f,1.1f,0.0f);
	glColor3f(0.0f,0.0f,1.0f);
	glCallLists(1,GL_UNSIGNED_BYTE,"Y");
	glRasterPos3f(0.0f,0.0f,1.1f);
	glColor3f(1.0f,0.0f,0.0f);
	glCallLists(1,GL_UNSIGNED_BYTE,"Z");

	glPointSize(5.0f);
	glBegin(GL_POINTS);
		glVertex3f(0.0f,0.0f,0.0f);
	glEnd();

	glLineWidth(2.0f);
	glBegin(GL_LINES);
		glColor3f(1.0f,0.0f,0.0f);
		glVertex3f(0.0f,0.0f,0.0f);
		glVertex3f(1.0f,0.0f,0.0f);
	glEnd();
	glBegin(GL_LINES);
		glColor3f(0.0f,1.0f,0.0f);
		glVertex3f(0.0f,0.0f,0.0f);
		glVertex3f(0.0f,1.0f,0.0f);
	glEnd();
	glBegin(GL_LINES);
		glColor3f(0.0f,0.0f,1.0f);
		glVertex3f(0.0f,0.0f,0.0f);
		glVertex3f(0.0f,0.0f,1.0f);
	glEnd();
		
	glPopMatrix();
}
//显示索引
void CDemoView::DrawIndex()
{
	glPushMatrix();
    glColor3f(1.0f,1.0f,1.0f);
	wglUseFontBitmaps(wglGetCurrentDC(),0,256,1000);
	glListBase(1000);

	for(int i=0;i<dlgload.n3dpoint;i++)
	{
		CString index;
		index.Format("%4d",i);
		glRasterPos3f(dlgload.m_point3d[i][0],dlgload.m_point3d[i][1],dlgload.m_point3d[i][2]);
		glCallLists(4,GL_UNSIGNED_BYTE,index);
	}
	glPopMatrix();
}
//控制函数///////////////////////////////////////////////////////////////
void CDemoView::OnLoad() 
{
	// TODO: Add your command handler code here
	//SelectDLG dlgload;
	if(dlgload.DoModal()==IDOK)
	{
	}
}
void CDemoView::OnShowPoints() 
{
	// TODO: Add your command handler code here
	SHOWPOINTS=!SHOWPOINTS;
	TEXTURE=FALSE;
	//SHOWTRIMESH=FALSE;
	ENABLELIGHT=FALSE;
	Invalidate(FALSE);		
}
void CDemoView::OnShowMesh() 
{
	// TODO: Add your command handler code here
	SHOWTRIMESH=!SHOWTRIMESH;
	TEXTURE=FALSE;
	//SHOWPOINTS=FALSE;
	ENABLELIGHT=FALSE;
	Invalidate(FALSE);	
}
void CDemoView::OnTextureMapping() 
{
	// TODO: Add your command handler code here
	TEXTURE=TRUE;
	SHOWPOINTS=FALSE;
	SHOWTRIMESH=FALSE;
	ENABLELIGHT=FALSE;
	Invalidate(FALSE);	
}
void CDemoView::OnLight() 
{
	// TODO: Add your command handler code here
	ENABLELIGHT=TRUE;
	SHOWPOINTS=FALSE;
	TEXTURE=FALSE;
	SHOWTRIMESH=FALSE;
	Invalidate(FALSE);
}
void CDemoView::OnXyrotate() 
{
	// TODO: Add your command handler code here	
	ENABLEXYROTATE=TRUE;
	ENABLEZROTATE=FALSE;
	ENABLEXYSHIFT=FALSE;
}
void CDemoView::OnZrotate() 
{
	// TODO: Add your command handler code here	
    ENABLEZROTATE=TRUE;
	ENABLEXYROTATE=FALSE;
	ENABLEXYSHIFT=FALSE;
}
void CDemoView::OnXyshift() 
{
	// TODO: Add your command handler code here
	ENABLEXYSHIFT=TRUE;	
	ENABLEXYROTATE=FALSE;
	ENABLEZROTATE=FALSE;
}
void CDemoView::OnResetcam() 
{
	// TODO: Add your command handler code here	
	rot[0]=0;
	rot[1]=0;
	rot[2]=0;
	zoom=-4.5f;
	xyshift[0]=0;
	xyshift[1]=0;
	//Arcball
	Matrix3fSetIdentity(&LastRot);	// Reset Rotation
	Matrix3fSetIdentity(&ThisRot);	// Reset Rotation
    Matrix4fSetRotationFromMatrix3f(&Transform, &ThisRot);// Reset Rotation

	Invalidate(FALSE);
}
void CDemoView::OnAnimate() 
{
	// TODO: Add your command handler code here
	if(ENABLEANIMATE==FALSE)
	{
	    ENABLEANIMATE=TRUE;
	    m_timer=SetTimer(1,15,NULL);
	}
	else
	{
		KillTimer(m_timer);
		ENABLEANIMATE=FALSE;
	}
}
void CDemoView::OnShowaxis() 
{
	// TODO: Add your command handler code here
	SHOWAXIS=!SHOWAXIS;
	Invalidate(FALSE);
}
void CDemoView::OnShowindex() 
{
	// TODO: Add your command handler code here
	SHOWINDEX=!SHOWINDEX;
	Invalidate(FALSE);
}
void CDemoView::OnShowback() 
{
	// TODO: Add your command handler code here
	SHOWBACK=!SHOWBACK;
	Invalidate(FALSE);
}
void CDemoView::OnEnableselect() 
{
	// TODO: Add your command handler code here
	ENABLESELECT=!ENABLESELECT;

	if(ENABLESELECT)
	{
		SetCapture();
		HCURSOR hCursor;
		hCursor=AfxGetApp()->LoadCursor(IDC_CURSOR3);
		SetCursor(hCursor);
	}
	else
		::ReleaseCapture();
}

//消息相应函数//////////////////////////////////////////////////////////////
void CDemoView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	
	//Arcball rotate control
	LastRot=ThisRot;// Set Last Static Rotation To Last Dynamic One
	MousePt.s.X=point.x;
	MousePt.s.Y=point.y;
	ArcBall.click(&MousePt);// Update Start Vector And Prepare For Dragging
	
	if(!ENABLESELECT)
	{
		SetCapture();
		HCURSOR hCursor;
		hCursor=AfxGetApp()->LoadCursor(IDC_CURSOR1);
		SetCursor(hCursor);
	}
	else if(!CTRLKEYDOWN)
	{
		::ReleaseCapture();

		SetCapture();
		HCURSOR hCursor;
		hCursor=AfxGetApp()->LoadCursor(IDC_CURSOR1);
		SetCursor(hCursor);
	}
	//删除选择的顶点
	if(ENABLESELECT&&CTRLKEYDOWN)
	{
		DeletePnt();
	}

	LButtonSta=TRUE;
	mouseX=point.x;
	mouseY=point.y;
	
	CView::OnLButtonDown(nFlags, point);
}
void CDemoView::OnMouseMove(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	if(ENABLESELECT)
	{
		//设定光标
		if(!CURSORINWND&&m_oldRect.PtInRect(point))
		{
			SetCapture();
			HCURSOR hCursor;
			hCursor=AfxGetApp()->LoadCursor(IDC_CURSOR3);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -