📄 demoview.cpp
字号:
SetCursor(hCursor);
CURSORINWND=true;
}
else if(CURSORINWND&&!m_oldRect.PtInRect(point))
{
::ReleaseCapture();
CURSORINWND=FALSE;
}
//进入选择\删除模式
else if(CURSORINWND&&m_oldRect.PtInRect(point)&&!LButtonSta&&!RButtonSta)
{
DoSelect(point);
}
}
if(LButtonSta==TRUE&&!CTRLKEYDOWN)//旋转+平移
{
// if(ENABLEXYROTATE==TRUE)
// {
// rot[0]+=(mouseX-point.x);//X
// rot[1]+=(mouseY-point.y);//Y
// }
// else if(ENABLEZROTATE==TRUE)
// {
// rot[2]+=(mouseX-point.x);//Z
// }
if(ENABLEXYSHIFT==TRUE)//平移
{
xyshift[0]-=(mouseX-point.x)/100.0f;
xyshift[1]+=(mouseY-point.y)/100.0f;
}
else//旋转
{
//Arcball rotate control
Quat4fT ThisQuat;
MousePt.s.X=point.x;
MousePt.s.Y=point.y;
ArcBall.drag(&MousePt,&ThisQuat);// Update End Vector And Get Rotation As Quaternion
Matrix3fSetRotationFromQuat4f(&ThisRot, &ThisQuat);// Convert Quaternion Into Matrix3fT
Matrix3fMulMatrix3f(&ThisRot, &LastRot);// Accumulate Last Rotation Into This One
Matrix4fSetRotationFromMatrix3f(&Transform, &ThisRot);
}
}
else if(RButtonSta==TRUE&&!CTRLKEYDOWN)//缩放
{
zoom-=(mouseY-point.y)/4.0f;
}
mouseX=point.x;
mouseY=point.y;
if(ENABLEANIMATE==FALSE)
Invalidate(FALSE);
CView::OnMouseMove(nFlags, point);
}
void CDemoView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if(!CTRLKEYDOWN)
{
::ReleaseCapture();
if(ENABLESELECT&&CURSORINWND)
{
SetCapture();
HCURSOR hCursor;
hCursor=AfxGetApp()->LoadCursor(IDC_CURSOR3);
SetCursor(hCursor);
}
}
LButtonSta=FALSE;
CView::OnLButtonUp(nFlags, point);
}
void CDemoView::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if(!ENABLESELECT)
{
SetCapture();
HCURSOR hCursor;
hCursor=AfxGetApp()->LoadCursor(IDC_CURSOR2);
SetCursor(hCursor);
}
else if(!CTRLKEYDOWN)
{
::ReleaseCapture();
SetCapture();
HCURSOR hCursor;
hCursor=AfxGetApp()->LoadCursor(IDC_CURSOR2);
SetCursor(hCursor);
}
RButtonSta=TRUE;
mouseX=point.x;
mouseY=point.y;
CView::OnRButtonDown(nFlags, point);
}
void CDemoView::OnRButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if(!CTRLKEYDOWN)
{
::ReleaseCapture();
if(ENABLESELECT&&CURSORINWND)
{
SetCapture();
HCURSOR hCursor;
hCursor=AfxGetApp()->LoadCursor(IDC_CURSOR3);
SetCursor(hCursor);
}
}
RButtonSta=FALSE;
CView::OnRButtonUp(nFlags, point);
}
void CDemoView::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
rot[0]+=1;
rot[1]+=1;
rot[2]+=2;
Invalidate(FALSE);
CView::OnTimer(nIDEvent);
}
void CDemoView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
if(nChar==0x11)//判断是否是CTRL键
CTRLKEYDOWN=TRUE;
CView::OnKeyDown(nChar, nRepCnt, nFlags);
}
void CDemoView::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
if(nChar==0x11)//判断是否是CTRL键
CTRLKEYDOWN=FALSE;
CView::OnKeyUp(nChar, nRepCnt, nFlags);
}
void CDemoView::OnBackward()
{
// TODO: Add your command handler code here
if(nindeleteindex>0)
{
//重组恢复删除点后的顶点数组
dlgload.m_point2d[deleteindex[nindeleteindex-1]][0]=deletecontent[nindeleteindex-1][0];
dlgload.m_point2d[deleteindex[nindeleteindex-1]][1]=deletecontent[nindeleteindex-1][1];
dlgload.n2dpoint++;
dlgload.m_point3d[deleteindex[nindeleteindex-1]][0]=deletecontent[nindeleteindex-1][2];
dlgload.m_point3d[deleteindex[nindeleteindex-1]][1]=deletecontent[nindeleteindex-1][3];
dlgload.m_point3d[deleteindex[nindeleteindex-1]][2]=deletecontent[nindeleteindex-1][4];
dlgload.n3dpoint++;
//对恢复后的点进行三角化
int kk=0;
int &numberoftriangle=kk;
int vertexindex[100000];
dlgload.triangulation(dlgload.m_point2d,dlgload.n2dpoint,vertexindex,numberoftriangle);
dlgload.ntri=numberoftriangle;
for(int i=0;i<dlgload.ntri;i++)
{
for(int j=0;j<3;j++)
dlgload.triangle[i][j]=vertexindex[i*3+j];
}
//为撤销恢复操作作准备
if(nindeleteindex>0)
{
nindeleteindex--;
}
else
nindeleteindex=0;
Invalidate(FALSE);
}
}
void CDemoView::OnSaveresult()
{
// TODO: Add your command handler code here
FILE* presult;
presult=fopen("3d_data_md.txt","w");
for(int i=0;i<dlgload.n3dpoint;i++)
{
fprintf(presult,"%f %f %f\n",dlgload.m_point3d[i][0],dlgload.m_point3d[i][1],dlgload.m_point3d[i][2]);
}
presult=fopen("matches_md.txt","w");
for(i=0;i<dlgload.n2dpoint;i++)
{
fprintf(presult,"%f %f\n",dlgload.m_point2d[i][0],dlgload.m_point2d[i][1]);
}
fclose(presult);
}
void CDemoView::OnSavetrindex()
{
// TODO: Add your command handler code here
FILE* presult;
presult=fopen("trindex.txt","w");
for(int i=0;i<dlgload.ntri;i++)
{
fprintf(presult,"%d %d %d\n",dlgload.triangle[i][0],dlgload.triangle[i][1],dlgload.triangle[i][2]);
}
fclose(presult);
}
//setcheckbox函数////////////////////////////////////////////////////////
void CDemoView::OnUpdateShowPoints(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(SHOWPOINTS);
}
void CDemoView::OnUpdateShowMesh(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(SHOWTRIMESH);
}
void CDemoView::OnUpdateTextureMapping(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(TEXTURE);
}
void CDemoView::OnUpdateXyrotate(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(ENABLEXYROTATE);
}
void CDemoView::OnUpdateZrotate(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(ENABLEZROTATE);
}
void CDemoView::OnUpdateXyshift(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(ENABLEXYSHIFT);
}
void CDemoView::OnUpdateAnimate(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(ENABLEANIMATE);
}
void CDemoView::OnUpdateShowback(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(!SHOWBACK);
}
void CDemoView::OnUpdateShowaxis(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(SHOWAXIS);
}
void CDemoView::OnUpdateShowindex(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(SHOWINDEX);
}
void CDemoView::OnUpdateLight(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(ENABLELIGHT);
}
void CDemoView::OnUpdateEnableselect(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(ENABLESELECT);
}
//其他函数/////////////////////////////////////////////////////////////
//计算三角面片的法向量(用于光照)
void CDemoView::CaculateNormal(GLdouble* dVertex1,GLdouble* dVertex2,
GLdouble* dVertex3,GLdouble* dNormal)
{
GLdouble dVector1[3],dVector2[3];
dVector1[0]=dVertex2[0]-dVertex1[0];
dVector1[1]=dVertex2[1]-dVertex1[1];
dVector1[2]=dVertex2[2]-dVertex1[2];
dVector2[0]=dVertex3[0]-dVertex1[0];
dVector2[1]=dVertex3[1]-dVertex1[1];
dVector2[2]=dVertex3[2]-dVertex1[2];
dNormal[0]=dVector1[1]*dVector2[2]-dVector1[2]*dVector2[1];
dNormal[1]=dVector1[2]*dVector2[0]-dVector1[0]*dVector2[2];
dNormal[2]=dVector1[0]*dVector2[1]-dVector1[1]*dVector2[0];
double dNormalLength=sqrt(dNormal[0]*dNormal[0]+
dNormal[1]*dNormal[1]+dNormal[2]*dNormal[2]);
if(dNormalLength!=0.0)
{
dNormal[0]=dNormal[0]/dNormalLength;
dNormal[1]=dNormal[1]/dNormalLength;
dNormal[2]=dNormal[2]/dNormalLength;
}
else
{
dNormal[0]=0.0;
dNormal[1]=0.0;
dNormal[2]=1.0;
}
}
//开始选择
void CDemoView::DoSelect(CPoint point)
{
GLint hits;
GLint vp[4];
glGetIntegerv (GL_VIEWPORT,vp);
glSelectBuffer(1000,selectBuf);
glRenderMode(GL_SELECT);
glInitNames();
glPushName(~0);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
gluPickMatrix(point.x,vp[3]-point.y,3,3,vp);
gluPerspective(45,(GLdouble)m_oldRect.right/(GLdouble)m_oldRect.bottom,0.1,1000.0);
glMatrixMode(GL_MODELVIEW);
DrawScene(GL_SELECT);
glPopMatrix();
glFlush();
hits=glRenderMode(GL_RENDER);
if(hits)
{
int n=0;double minz=selectBuf[1];
for(int i=1;i<hits;i++)
{
if (selectBuf[1+i*4]<minz) {n=i;minz=selectBuf[1+i*4];}
}
selectindex=selectBuf[n*4+3];
}
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glViewport(0,0,m_oldRect.right,m_oldRect.bottom);
gluPerspective(45,(GLdouble)m_oldRect.right/(GLdouble)m_oldRect.bottom,0.1,1000.0);
}
//删除选择的点
void CDemoView::DeletePnt()
{
if(dlgload.n3dpoint!=0)
{
//为撤销恢复操作作准备
nindeleteindex++;
if(nindeleteindex==6)
{
for(int i=0;i<4;i++)
{
deleteindex[i]=deleteindex[i+1];
deletecontent[i][0]=deletecontent[i+1][0];
deletecontent[i][1]=deletecontent[i+1][1];
deletecontent[i][2]=deletecontent[i+1][2];
deletecontent[i][3]=deletecontent[i+1][3];
deletecontent[i][4]=deletecontent[i+1][4];
}
deleteindex[4]=selectindex;
if(dlgload.n2dpoint!=0)
{
deletecontent[4][0]=dlgload.m_point2d[selectindex][0];
deletecontent[4][1]=dlgload.m_point2d[selectindex][1];
deletecontent[4][2]=dlgload.m_point3d[selectindex][0];
deletecontent[4][3]=dlgload.m_point3d[selectindex][1];
deletecontent[4][4]=dlgload.m_point3d[selectindex][2];
nindeleteindex--;
}
else
{
deletecontent[4][0]=0;
deletecontent[4][1]=0;
deletecontent[4][2]=dlgload.m_point3d[selectindex][0];
deletecontent[4][3]=dlgload.m_point3d[selectindex][1];
deletecontent[4][4]=dlgload.m_point3d[selectindex][2];
nindeleteindex--; }
}
else
{
if(dlgload.n2dpoint!=0)
{
deleteindex[nindeleteindex-1]=selectindex;
deletecontent[nindeleteindex-1][0]=dlgload.m_point2d[selectindex][0];
deletecontent[nindeleteindex-1][1]=dlgload.m_point2d[selectindex][1];
deletecontent[nindeleteindex-1][2]=dlgload.m_point3d[selectindex][0];
deletecontent[nindeleteindex-1][3]=dlgload.m_point3d[selectindex][1];
deletecontent[nindeleteindex-1][4]=dlgload.m_point3d[selectindex][2];
}
else
{
deleteindex[nindeleteindex-1]=selectindex;
deletecontent[nindeleteindex-1][0]=0;
deletecontent[nindeleteindex-1][1]=0;
deletecontent[nindeleteindex-1][2]=dlgload.m_point3d[selectindex][0];
deletecontent[nindeleteindex-1][3]=dlgload.m_point3d[selectindex][1];
deletecontent[nindeleteindex-1][4]=dlgload.m_point3d[selectindex][2];
}
}
//重组删除点后的顶点数组
if(dlgload.n2dpoint!=0)
{
dlgload.m_point2d[selectindex][0]=dlgload.m_point2d[dlgload.n2dpoint-1][0];
dlgload.m_point2d[selectindex][1]=dlgload.m_point2d[dlgload.n2dpoint-1][1];
dlgload.n2dpoint--;
}
dlgload.m_point3d[selectindex][0]=dlgload.m_point3d[dlgload.n3dpoint-1][0];
dlgload.m_point3d[selectindex][1]=dlgload.m_point3d[dlgload.n3dpoint-1][1];
dlgload.m_point3d[selectindex][2]=dlgload.m_point3d[dlgload.n3dpoint-1][2];
dlgload.n3dpoint--;
//对剩下的点进行三角化
if(dlgload.n2dpoint!=0)
{
int kk=0;
int &numberoftriangle=kk;
int vertexindex[100000];
dlgload.triangulation(dlgload.m_point2d,dlgload.n2dpoint,vertexindex,numberoftriangle);
dlgload.ntri=numberoftriangle;
for(int i=0;i<dlgload.ntri;i++)
{
for(int j=0;j<3;j++)
dlgload.triangle[i][j]=vertexindex[i*3+j];
}
}
Invalidate(FALSE);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -