📄 demoview.cpp
字号:
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 + -