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

📄 shiyanview.cpp

📁 用vc简单的实现的OpenGL控制机器人行走
💻 CPP
字号:
// shiyanView.cpp : implementation of the CShiyanView class
//

#include "stdafx.h"
#include "shiyan.h"

#include <gl/glut.h>
#include <gl\gl.h>
#include <gl\glu.h>
#include <gl\glaux.h>

#include "shiyanDoc.h"
#include "shiyanView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;

#endif

/////////////////////////////////////////////////////////////////////////////
// CShiyanView

IMPLEMENT_DYNCREATE(CShiyanView, CView)

BEGIN_MESSAGE_MAP(CShiyanView, CView)
	//{{AFX_MSG_MAP(CShiyanView)
	ON_WM_CREATE()
	ON_WM_SIZE()
	ON_WM_ERASEBKGND()
	ON_WM_DESTROY()
	ON_WM_TIMER()
	ON_BN_DOUBLECLICKED(IDOK, OnDoubleclickedOk)
	ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
	ON_WM_LBUTTONDOWN()
	//}}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)
	ON_BN_CLICKED(IDC_BUTTONONE, OnButtonOne)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CShiyanView construction/destruction

CShiyanView::CShiyanView() : m_pButtonOne(NULL)
{
	// TODO: add construction code here

}

CShiyanView::~CShiyanView()
{
}

BOOL CShiyanView::PreCreateWindow(CREATESTRUCT& cs)
{
	cs.style=cs.style|WS_CLIPSIBLINGS|WS_CLIPCHILDREN;

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CShiyanView drawing

void CShiyanView::OnDraw(CDC* pDC)
{
	CShiyanDoc* pDoc = (CShiyanDoc*)CView::GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	wglMakeCurrent(m_pDC->GetSafeHdc(),m_hRC);
	glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
	glTranslatef(0.0,70,-50);
	glRotatef(45.0,0.0,1.0,0.0);
	
	//glPushMatrix();
	    glRotatef(spin,0.0,1.0,0.0);
	    glTranslatef(0.0,0.0,distance);
		GLfloat mat_ambient[]={0.3,0.5,0.8,1.0};
		GLfloat mat_diffuse[]={0.2,0.3,1.0,1.0};
		GLfloat mat_specular[]={1.0,1.0,1.0,1.0};
		GLfloat mat_shininess[]={100.0};
		
		glMaterialfv(GL_FRONT,GL_AMBIENT,mat_ambient);
		glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);
		glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);
		glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess);
		BrickWallTexture();
		glTranslatef(0.0,0.0,-10.0);
		glPushMatrix();
		
		    glPushMatrix();
		        glTranslatef(0.0,100,0.0);
		        auxSolidBox(60,60,40);
		    glPopMatrix();
		
		    glPushMatrix();
		        auxSolidBox(120,160,40);
		    glPopMatrix();
		
		    glPushMatrix();
		        glTranslatef(70,80,0.0);
		        glRotatef((GLfloat)leftarm,1,0.0,0.0);
		        glTranslatef(0.0,-60,0.0);
		        auxSolidBox(20,120,30);
		
		        glTranslatef(0.0,-60,0.0);
		        glRotatef((GLfloat)leftforearm,1,0.0,0.0);
		        glTranslatef(0.0,-50,0.0);
		        auxSolidBox(20,120,30);
            glPopMatrix();
		
		    glPushMatrix();
		        glTranslatef(-70,80,0.0);
		        glRotatef((GLfloat)rightarm,1,0.0,0.0);
		        glTranslatef(0.0,-60,0.0);
		        auxSolidBox(20,120,30);
		
		        glTranslatef(0.0,-60,0.0);
		        glRotatef((GLfloat)rightforearm,1,0.0,0.0);
		        glTranslatef(0.0,-50,0.0);
		        auxSolidBox(20,120,30);
            glPopMatrix();
		
		    glPushMatrix();
		        glTranslatef(30,-80,0.0);
		        glRotatef((GLfloat)lefthigh,10,0.0,0.0);
		        glTranslatef(0.0,-60,0.0);
		        auxSolidBox(30,120,30);
		
		        glTranslatef(0.0,-40,0.0);
		        glRotatef((GLfloat)leftshank,10,0.0,0.0);
		        glTranslatef(0.0,-50,0.0);
		        auxSolidBox(30,10,30);
		
		        glTranslatef(0.0,-65,10);
		        auxSolidBox(30,30,50);
            glPopMatrix();
		
		    glPushMatrix();
		        glTranslatef(-30,-80,0.0);
		        glRotatef((GLfloat)rightthigh,10,0.0,0.0);
		        glTranslatef(0.0,-60,0.0);
		        auxSolidBox(30,120,30);
		
		        glTranslatef(0.0,-40,0.0);
		        glRotatef((GLfloat)rightshank,10,0.0,0.0);
		        glTranslatef(0.0,-50,0.0);
		        auxSolidBox(30,10,30);
		
		        glTranslatef(0.0,-65,10);
		        auxSolidBox(30,30,50);
            glPopMatrix();
	    glPopMatrix();

	
// 			GLfloat road_ambient[]={0.6,0.6,0.6,1.0};
// 				GLfloat road_diffuse[]={1.0,1.0,1.0,1.0};
// 				GLfloat road_specular[]={0.8,0.3,0.5,1.0};
// 				GLfloat road_shininess[]={80.0};
// 					
// 				glMaterialfv(GL_FRONT,GL_AMBIENT,road_ambient);
// 				glMaterialfv(GL_FRONT,GL_DIFFUSE,road_diffuse);
// 				glMaterialfv(GL_FRONT,GL_SPECULAR,road_specular);
// 				glMaterialfv(GL_FRONT,GL_SHININESS,road_shininess);
// 				 	
// 			 glPushMatrix();
// 				 	        glTranslatef(0.0,-330,0.0);
// 				 	        glColor3f(1.0,1.0,1.00);
// 				        glBegin(GL_POLYGON);
// 					            glNormal3f(0.0,1.0,0.0);
// 					            glVertex3f(20.0,0.0,-5000.0);
// 				            glVertex3f(20.0,0.0,5000.0);
// 				            glVertex3f(-20,0.0,-00.0);
// 				            glVertex3f(-20,0.0,-5000.0);
// 				 	        glEnd();
// 				glPopMatrix();
			//glPopMatrix();
	SwapBuffers(wglGetCurrentDC());
	
}

/////////////////////////////////////////////////////////////////////////////
// CShiyanView printing

BOOL CShiyanView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CShiyanView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CShiyanView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CShiyanView diagnostics

#ifdef _DEBUG
void CShiyanView::AssertValid() const
{
	CView::AssertValid();
}

void CShiyanView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

// CShiyanDoc* CShiyanView::GetDocument() // non-debug version is inline
// {
// 	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CShiyanDoc)));
// 	return (CShiyanDoc*)m_pDocument;
// }
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CShiyanView message handlers

int CShiyanView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CView::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	// TODO: Add your specialized creation code here
	m_pDC=new CClientDC(this);
	ASSERT(m_pDC!=NULL);
	if ( m_pButtonOne == NULL )
	{
		m_pButtonOne = new CButton() ;
		m_pButtonOne->Create(_T("走"), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, 
			CRect(10,10,100,30), this, IDC_BUTTONONE);
		
	}

	
	if(!bSetupPixelFormat())
		return -1;
	
	m_hRC=wglCreateContext(m_pDC->GetSafeHdc());
	wglMakeCurrent(m_pDC->GetSafeHdc(),m_hRC);
	return 0;
}
BOOL CShiyanView::bSetupPixelFormat()
{
	static 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
	};
	int pixelformat;
	
	if((pixelformat=ChoosePixelFormat(m_pDC->GetSafeHdc(),&pfd))==0)
	{
		MessageBox("ChoosePixelFormate failed");
		return FALSE;
	}
	
	if(SetPixelFormat(m_pDC->GetSafeHdc(),pixelformat,&pfd)==FALSE)
	{
		MessageBox("SetPixelFormat failed");
		return FALSE;
	}
	return TRUE;
}

void CShiyanView::OnSize(UINT nType, int cx, int cy) 
{
	CView::OnSize(nType, cx, cy);
	
	// TODO: Add your message handler code here
	
	
	wglMakeCurrent(m_pDC->GetSafeHdc(),m_hRC);   
	
	m_left=-cx/2.0;
	m_right=cx/2.0;
	m_bottom=-cy/2.0;
	m_top=cy/2.0;
	m_near=-1000;
	m_far=1000;
	
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	glOrtho(m_left,m_right,m_bottom,m_top,m_near,m_far);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
	glViewport(0,0,cx,cy);
	
	wglMakeCurrent(NULL,NULL);
}

BOOL CShiyanView::OnEraseBkgnd(CDC* pDC) 
{
	// TODO: Add your message handler code here and/or call default
	
	return TRUE;
}

void CShiyanView::OnInitialUpdate() 
{
	CView::OnInitialUpdate();
	
	wglMakeCurrent(m_pDC->GetSafeHdc(),m_hRC);
	
	GLfloat light_ambient[]={0.5,0.5,0.5,1.0};
	GLfloat light_diffuse[]={1.0,1.0,1.0,1.0};
	GLfloat light_specular[]={0.3,0.5,0.8,1.0};
	GLfloat light_position[]={2.0,2.0,5.0,0.0};
    
	GLfloat lmodel_ambient[]={0.6,0.6,0.6,1.0};
	
	glLightfv(GL_LIGHT0,GL_POSITION,light_position);
	glLightModelfv(GL_LIGHT_MODEL_AMBIENT,lmodel_ambient);
	
	glEnable(GL_LIGHTING);
	glEnable(GL_LIGHT0);
	glEnable(GL_DEPTH_TEST);
	glDepthFunc(GL_LESS);
	glEnable(GL_AUTO_NORMAL);
	glEnable(GL_NORMALIZE);
	glFrontFace(GL_CW);
	
	glClearColor(0.5,0.5,0.5,1.0);
	glColor3f(1.0,1.0,1.0);
	
	
	GetClientRect(&m_rect);
	glViewport(0,0,m_rect.right,m_rect.bottom);
	
	m_left=-m_rect.right/2.0;
	m_right=m_rect.right/2.0;
	m_bottom=-m_rect.bottom/2.0;
	m_top=m_rect.top/2.0;
	m_near=-1000;
	m_far=1000;

	SetTimer(1,100,NULL);
	
	
	
	
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	glOrtho(m_left,m_right,m_bottom,m_top,m_near,m_far);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
	glClearColor(0.0,0.0,0.0,1.0);
	
	glClearDepth(1.0f);
	glEnable(GL_DEPTH_TEST);
	
	
	wglMakeCurrent(NULL,NULL);
	
}

void CShiyanView::OnDestroy() 
{
	CView::OnDestroy();
	
	// TODO: Add your message handler code here
	KillTimer(1);
	if ( m_pButtonOne != NULL )
	{
		delete m_pButtonOne ;
		m_pButtonOne = NULL ;
	}

	wglMakeCurrent(NULL,NULL);
	wglDeleteContext(m_hRC);
	delete m_pDC;
	
}
void CShiyanView::stride(void)
{
	if(leftarm<15)
	{
		leftarm=value+20;
		leftforearm=value-8;
		rightarm=value-15;
		rightforearm=value-25;
		
		lefthigh=value-15;
		leftshank=value-1;
		rightthigh=value+15;
		rightshank=value+10;
	}
	else
	{
		leftarm=value-15;
		leftforearm=value-25;
		rightarm=value+20;
		rightforearm=value-8;
		
		lefthigh=value+15;
		leftshank=value+10;
		rightthigh=value-15;
		rightshank=value-1;
	}
}
void CShiyanView::go(void)
{
	distance=distance+30;
	stride();
	//glutPostRedisplay();
	
}

void CShiyanView::OnTimer(UINT nIDEvent) 
{
  //go();
  //PostMessage(WM_PAINT);
	
	CView::OnTimer(nIDEvent);
}

void CShiyanView::OnDoubleclickedOk() 
{
  

}

void CShiyanView::OnButton1() 
{
	go();	// TODO: Add your control notification handler code here
	//CShiyanView::OnDraw(GetDlgItem(IDOK)->GetDC());

	//CShiyanView::OnDraw(m_pDC);
    PostMessage(WM_PAINT);
	
}
void CShiyanView::BrickWallTexture(void)
{
// 	image=auxDIBImageLoad("Data/REDBRICK.bmp");
// 	
// 	if(pdata!=NULL)
// 		free(pdata);
// 	pdata=(BYTE*)malloc(256*256*3*sizeof(BYTE));
// 	if(!pdata)
// 		exit(0);
// 	glPixelStorei(GL_UNPACK_ALIGNMENT,1);
// 	gluScaleImage(GL_RGB,image->sizeX,image->sizeY,GL_UNSIGNED_BYTE,image->data,256,256,GL_UNSIGNED_BYTE,pdata);
// 	glTexImage2D(GL_TEXTURE_2D,0,3,256,256,0,GL_RGB,GL_UNSIGNED_BYTE,pdata);
 }

void CShiyanView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	go();
  PostMessage(WM_PAINT);
	CView::OnLButtonDown(nFlags, point);

}
void CShiyanView::OnButtonOne()
{
	//AfxMessageBox("天才") ;
	go();
  PostMessage(WM_PAINT);
}

⌨️ 快捷键说明

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