📄 demoview.cpp
字号:
// demoView.cpp : implementation of the CDemoView class
//
#include "stdafx.h"
#include <math.h>
#include "demo.h"
#include "demoDoc.h"
#include "demoView.h"
#include "SelectDLG.h"
#include "triangle.h"
#include "MainFrm.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//Arcball
ArcBallT ArcBall(640.0f, 480.0f);
Matrix4fT Transform={1.0f,0.0f,0.0f,0.0f,// NEW: Final Transform
0.0f,1.0f,0.0f,0.0f,
0.0f,0.0f,1.0f,0.0f,
0.0f,0.0f,0.0f,1.0f};
Matrix3fT LastRot ={1.0f,0.0f,0.0f, // NEW: Last Rotation
0.0f,1.0f,0.0f,
0.0f,0.0f,1.0f};
Matrix3fT ThisRot ={1.0f,0.0f,0.0f, // NEW: This Rotation
0.0f,1.0f,0.0f,
0.0f,0.0f,1.0f};
/////////////////////////////////////////////////////////////////////////////
// CDemoView
IMPLEMENT_DYNCREATE(CDemoView, CView)
BEGIN_MESSAGE_MAP(CDemoView, CView)
//{{AFX_MSG_MAP(CDemoView)
ON_WM_CREATE()
ON_WM_DESTROY()
ON_WM_SIZE()
ON_COMMAND(ID_LOAD, OnLoad)
ON_COMMAND(IDM_SHOW_POINTS, OnShowPoints)
ON_WM_LBUTTONDOWN()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONUP()
ON_WM_RBUTTONDOWN()
ON_WM_RBUTTONUP()
ON_COMMAND(IDM_SHOW_MESH, OnShowMesh)
ON_COMMAND(IDM_TEXTURE_MAPPING, OnTextureMapping)
ON_COMMAND(ID_XYSHIFT, OnXyshift)
ON_COMMAND(ID_XYROTATE, OnXyrotate)
ON_COMMAND(ID_ZROTATE, OnZrotate)
ON_COMMAND(ID_RESETCAM, OnResetcam)
ON_COMMAND(ID_ANIMATE, OnAnimate)
ON_WM_TIMER()
ON_UPDATE_COMMAND_UI(IDM_SHOW_POINTS, OnUpdateShowPoints)
ON_UPDATE_COMMAND_UI(IDM_SHOW_MESH, OnUpdateShowMesh)
ON_UPDATE_COMMAND_UI(IDM_TEXTURE_MAPPING, OnUpdateTextureMapping)
ON_UPDATE_COMMAND_UI(ID_ANIMATE, OnUpdateAnimate)
ON_UPDATE_COMMAND_UI(ID_XYROTATE, OnUpdateXyrotate)
ON_UPDATE_COMMAND_UI(ID_ZROTATE, OnUpdateZrotate)
ON_UPDATE_COMMAND_UI(ID_XYSHIFT, OnUpdateXyshift)
ON_COMMAND(ID_SHOWBACK, OnShowback)
ON_UPDATE_COMMAND_UI(ID_SHOWBACK, OnUpdateShowback)
ON_COMMAND(ID_SHOWINDEX, OnShowindex)
ON_UPDATE_COMMAND_UI(ID_SHOWINDEX, OnUpdateShowindex)
ON_COMMAND(ID_LIGHT, OnLight)
ON_UPDATE_COMMAND_UI(ID_LIGHT, OnUpdateLight)
ON_COMMAND(ID_ENABLESELECT, OnEnableselect)
ON_UPDATE_COMMAND_UI(ID_ENABLESELECT, OnUpdateEnableselect)
ON_WM_KEYDOWN()
ON_WM_KEYUP()
ON_COMMAND(ID_SAVERESULT, OnSaveresult)
ON_COMMAND(ID_BACKWARD, OnBackward)
ON_COMMAND(ID_SAVETRINDEX, OnSavetrindex)
ON_COMMAND(ID_SHOWAXIS, OnShowaxis)
ON_UPDATE_COMMAND_UI(ID_SHOWAXIS, OnUpdateShowaxis)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDemoView construction/destruction
CDemoView::CDemoView()
{
// TODO: add construction code here
m_pDC=NULL;
LButtonSta=FALSE;
RButtonSta=FALSE;
rot[0]=0;
rot[1]=0;
rot[2]=0;
zoom=-4.5f;
xyshift[0]=0;
xyshift[1]=0;
selectindex=-1;
nindeleteindex=0;
TEXTURE=FALSE;
SHOWPOINTS=TRUE;
SHOWTRIMESH=FALSE;
ENABLELIGHT=FALSE;
ENABLEXYROTATE=TRUE;
ENABLEZROTATE=FALSE;
ENABLEXYSHIFT=FALSE;
ENABLEANIMATE=FALSE;
SHOWBACK=FALSE;
SHOWAXIS=FALSE;
SHOWINDEX=FALSE;
ENABLESELECT=FALSE;
CURSORINWND=TRUE;
CTRLKEYDOWN=FALSE;
m_timer=0;
dlgload.n3dpoint=0;
dlgload.n2dpoint=0;
dlgload.ntri=0;
//Arcball
isClicked=false;
isRClicked=false;
isDragging=false;
//打开程序时如果"data3D.bri"文件存在,则读入数据
//确定在程序当前目录
LPTSTR lpszCurDir;
TCHAR tchBuffer[128];
CString filename,exefullpath,exefilepath;
filename="\\data3D.bri";
lpszCurDir=tchBuffer;
GetModuleFileName(NULL,lpszCurDir,128);
exefullpath=lpszCurDir;
int pathlen=exefullpath.ReverseFind('\\');
exefilepath=exefullpath.Left(pathlen)+filename;
long i;
FILE* p3dfile;
if(p3dfile=fopen(exefilepath,"r"))
{
dlgload.n3dpoint=0;
for(i=0;i<MAXPOINT;i++)
{
dlgload.m_point3d[i][0]=0;
dlgload.m_point3d[i][1]=0;
dlgload.m_point3d[i][2]=0;
dlgload.m_point3d_old[i][0]=0;
dlgload.m_point3d_old[i][1]=0;
dlgload.m_point3d_old[i][2]=0;
}
for(i=0;i<MAXPOINT;i++)
{
fscanf(p3dfile,"%f",&dlgload.m_point3d[i][0]);
fscanf(p3dfile,"%f",&dlgload.m_point3d[i][1]);
fscanf(p3dfile,"%f",&dlgload.m_point3d[i][2]);
dlgload.m_point3d_old[i][0]=dlgload.m_point3d[i][0];
dlgload.m_point3d_old[i][1]=dlgload.m_point3d[i][1];
dlgload.m_point3d_old[i][2]=dlgload.m_point3d[i][2];
if((dlgload.m_point3d[i][0]==0)&&(dlgload.m_point3d[i][1]==0)&&(dlgload.m_point3d[i][2]==0))
break;
dlgload.n3dpoint++;
}
fclose(p3dfile);
if(dlgload.n3dpoint==MAXPOINT)
{
MessageBox("数据点数量超过程序最大可显示数量,可能导致图像显示不完整!",NULL,
MB_ICONWARNING|MB_SYSTEMMODAL);
return;
}
//归一化3D点坐标,使其形心在原点且各顶点到形心的平均距离为1
//计算xyz三坐标的均值
float mean[3]={0,0,0};
for(i=0;i<dlgload.n3dpoint;i++)
{
mean[0]+=dlgload.m_point3d[i][0];
mean[1]+=dlgload.m_point3d[i][1];
mean[2]+=dlgload.m_point3d[i][2];
}
mean[0]=mean[0]/dlgload.n3dpoint;
mean[1]=mean[1]/dlgload.n3dpoint;
mean[2]=mean[2]/dlgload.n3dpoint;
//使点的形心在原点
for(i=0;i<dlgload.n3dpoint;i++)
{
dlgload.m_point3d[i][0]=dlgload.m_point3d[i][0]-mean[0];
dlgload.m_point3d[i][1]=dlgload.m_point3d[i][1]-mean[1];
dlgload.m_point3d[i][2]=dlgload.m_point3d[i][2]-mean[2];
}
//使它们到原点的平均距离的平方是1
float meandis=0;
for(i=0;i<dlgload.n3dpoint;i++)
{
meandis+=(float)pow(dlgload.m_point3d[i][0]*dlgload.m_point3d[i][0]+dlgload.m_point3d[i][1]*dlgload.m_point3d[i][1]+dlgload.m_point3d[i][2]*dlgload.m_point3d[i][2],0.5);
}
meandis=meandis/dlgload.n3dpoint;
for(i=0;i<dlgload.n3dpoint;i++)
{
dlgload.m_point3d[i][0]=dlgload.m_point3d[i][0]/meandis;
dlgload.m_point3d[i][1]=dlgload.m_point3d[i][1]/meandis;
dlgload.m_point3d[i][2]=dlgload.m_point3d[i][2]/meandis;
}
}
}
CDemoView::~CDemoView()
{
//delete dlgload.triangle;
}
BOOL CDemoView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
cs.style|=WS_CLIPCHILDREN|WS_CLIPSIBLINGS;
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CDemoView drawing
void CDemoView::OnDraw(CDC* pDC)
{
CDemoDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
DrawScene(GL_RENDER);
}
/////////////////////////////////////////////////////////////////////////////
// CDemoView printing
BOOL CDemoView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CDemoView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CDemoView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CDemoView diagnostics
#ifdef _DEBUG
void CDemoView::AssertValid() const
{
CView::AssertValid();
}
void CDemoView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CDemoDoc* CDemoView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDemoDoc)));
return (CDemoDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CDemoView message handlers
int CDemoView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
Init();
return 0;
}
void CDemoView::OnDestroy()
{
CView::OnDestroy();
// TODO: Add your message handler code here
HGLRC hrc;
hrc=::wglGetCurrentContext(); //得到当前RC句柄
::wglMakeCurrent(NULL,NULL); //使当前RC无效
if(hrc)
::wglDeleteContext(hrc); //删除当前RC
if(m_pDC)
delete m_pDC; //删除当前DC
}
void CDemoView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
if(cy>0)
{
if((m_oldRect.right>cx)|(m_oldRect.bottom>cy))
RedrawWindow();
m_oldRect.right=cx;
m_oldRect.bottom=cy;
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45,(GLdouble)cx/(GLdouble)cy,0.1,1000.0);
glViewport(0,0,cx,cy);
ArcBall.setBounds(cx,cy);
}
Invalidate();
}
void CDemoView::Init()
{
PIXELFORMATDESCRIPTOR pfd;
int n;
HGLRC hrc;
m_pDC=new CClientDC(this);//得到当前窗口DC
ASSERT(m_pDC!=NULL); //诊断信息
//设置象素格式
if(!bSetupPixelFormat()) return;
//测试象素格式
n=::GetPixelFormat(m_pDC->GetSafeHdc());//得到当前DC象素格式索引
::DescribePixelFormat(m_pDC->GetSafeHdc(),n,sizeof(pfd),&pfd);//设置象素格式
//创建与当前DC兼容的RC
hrc=wglCreateContext(m_pDC->GetSafeHdc());
wglMakeCurrent(m_pDC->GetSafeHdc(),hrc);//使RC当前化
GetClientRect(&m_oldRect);
//创建光源
GLfloat light_position0[]={0.0f,0.0f,-9.0f,0.0f};
GLfloat light_position1[]={0.0f,0.0f,9.0f,0.0f};
GLfloat light_diffuse[]={1.0f,1.0f,1.0f,0.0f};
glLightfv(GL_LIGHT0,GL_POSITION,light_position0);
glLightfv(GL_LIGHT1,GL_POSITION,light_position1);
glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);
glLightfv(GL_LIGHT1,GL_DIFFUSE,light_diffuse);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_LIGHT1);
glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE);//启动双面光照(important!)
glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
BOOL CDemoView::bSetupPixelFormat()
{
static PIXELFORMATDESCRIPTOR pfd= //初始化象素格式结构体
{
sizeof(PIXELFORMATDESCRIPTOR), //size of this pdf
1, //version number
PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|PFD_DOUBLEBUFFER, ////support window & opengl
PFD_TYPE_RGBA, //RGBA type
24, //24-bit color depth
0,0,0,0,0,0, //colot bits ignored
0, //no alpha buffer
0, //shift bit ignored
0, //no accumulation buffer
0,0,0,0, //accum bits ignored
32, //32-bits z-buffer
0, //no stencil buffer
0, //no auxiliary buffer
PFD_MAIN_PLANE, //main layer
0, //reserved
0,0,0 //layer masks ignored
};
int pixelformat;
//从当前DC支持的象素格式中选择与pfd所指定最匹配一个,返回其索引
if((pixelformat=ChoosePixelFormat(m_pDC->GetSafeHdc(),&pfd))==0)
{
MessageBox("ChoosePixelFormat failed");
return FALSE;
}
//把指定DC象素格式设置成由索引指向的象素格式
if(SetPixelFormat(m_pDC->GetSafeHdc(),pixelformat,&pfd)==FALSE)
{
MessageBox("SetPixelFormat failed");
return FALSE;
}
return TRUE;
}
void CDemoView::DrawScene(GLenum mode)
{
glClearColor(0.7f,0.7f,0.9f,0.0f);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
if(ENABLELIGHT==TRUE)//启用光照
glEnable(GL_LIGHTING);
else
glDisable(GL_LIGHTING);
if(SHOWBACK==TRUE)//背面不可见
{
glFrontFace(GL_CW);//顺时针为正
glPolygonMode(GL_BACK,GL_LINE);
//glEnable(GL_CULL_FACE);
//glCullFace(GL_FRONT);
}
else
{
glPolygonMode(GL_BACK,GL_FILL);
//glCullFace(GL_FALSE);
//glDisable(GL_CULL_FACE);
}
glShadeModel(GL_SMOOTH);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(xyshift[0],xyshift[1],zoom);//平移
//Arcball rotate control
glPushMatrix();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -