[VC(Visual C++) ]- OpenGL 簡單機器手臂4
本篇分享OpenGL 簡單機器手臂4程式,有興趣的(C/P)同好,歡迎來http://filemarkets.com/file/jashliao/92db1ba3/索取,因為我不會上傳檔案分享哈哈 ^ ^。
主要程式碼 |
// GLbaseView.cpp : implementation of the CGLbaseView class // #include "stdafx.h" #include "GLbase.h" #include <gl/glut.h>//第十三步 #include "glmfc.h"//第三步 #include "GLbaseDoc.h" #include "GLbaseView.h" #include "OpenGLFun.h"//第六步 #include "OpenGLPara.h" #include "Dlg1.h" #ifdef _DEBUG #definenew DEBUG_NEW #undef THIS_FILE staticchar THIS_FILE[] = __FILE__; #endif float view_x,view_y,view_z; float trans_x,trans_y; float Rotat1,Rotat2,Rotat3,Rotat4,Rotat5; float Trans1; ///////////////////////////////////////////////////////////////////////////// // CGLbaseView IMPLEMENT_DYNCREATE(CGLbaseView, CView) BEGIN_MESSAGE_MAP(CGLbaseView, CView) //{{AFX_MSG_MAP(CGLbaseView) ON_WM_CREATE() ON_WM_SIZE() ON_WM_ERASEBKGND() ON_WM_KEYDOWN() ON_COMMAND(ID_set, Onset) ON_BN_CLICKED(IDC_BUTTON1, OnButton1) ON_BN_CLICKED(IDC_A, OnA) ON_BN_CLICKED(IDC_C, OnC) ON_BN_CLICKED(IDC_D, OnD) ON_BN_CLICKED(IDC_E, OnE) ON_BN_CLICKED(IDC_Q, OnQ) ON_BN_CLICKED(IDC_S, OnS) ON_BN_CLICKED(IDC_W, OnW) ON_BN_CLICKED(IDC_X, OnX) ON_BN_CLICKED(IDC_Z, OnZ) ON_BN_CLICKED(IDC_UP1, OnUp1) ON_BN_CLICKED(IDC_UP2, OnUp2) ON_BN_CLICKED(IDC_UP3, OnUp3) ON_BN_CLICKED(IDC_UP4, OnUp4) ON_BN_CLICKED(IDC_UP5, OnUp5) ON_BN_CLICKED(IDC_UP6, OnUp6) ON_BN_CLICKED(IDC_Down1, OnDown1) ON_BN_CLICKED(IDC_Down2, OnDown2) ON_BN_CLICKED(IDC_Down3, OnDown3) ON_BN_CLICKED(IDC_Down4, OnDown4) ON_BN_CLICKED(IDC_Down5, OnDown5) ON_BN_CLICKED(IDC_Down6, OnDown6) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CGLbaseView construction/destruction CGLbaseView::CGLbaseView() { // TODO: add construction code here } CGLbaseView::~CGLbaseView() { } BOOL CGLbaseView::PreCreateWindow(CREATESTRUCT& cs) { // TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs return CView::PreCreateWindow(cs); } ///////////////////////////////////////////////////////////////////////////// // CGLbaseView drawing void CGLbaseView::OnDraw(CDC* pDC) { m_pPal = NULL;//第十步 CGLbaseDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); ////////////////////////////////////////第七步 CPalette * ppalOld = NULL; if (m_pPal) { ppalOld = pDC->SelectPalette(m_pPal, 0); pDC->RealizePalette(); } BOOL bResult = wglMakeCurrent(pDC->m_hDC, m_hrc); if (FALSE == bResult) TRACE(_T("wglMakeCurrent() failed %x.\r\n"), ::GetLastError()); opengl_Initial(); static GLfloat ambientLight[] = { 1.0f, 1.0f, 1.0f, 1.0f }; static GLfloat diffuseLight[] = { 0.7f, 0.7f, 0.7f, 1.0f }; static GLfloat specular[] = { 0.7f, 0.7f, 0.7f, 1.0f }; //燈光性質 static GLfloat specref [] = { 0.5f, 0.5f, 0.2f, 1.0f }; //反射性質 staticfloat normal[3];//設定法向量 // Clear the window with current clearing color glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//清除畫面的動作 if(Line_Flag) glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);//會產生多邊形的外圍輪廓 else glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);//會產生填滿的多邊形 /////////////////////////////////////////// glPushMatrix();///區塊start { glTranslatef(0.0f,0.0f,0.0f); glRotatef(view_x, 1.0f, 0.0f, 0.0f);//視角旋轉角度 glRotatef(view_y, 0.0f, 1.0f, 0.0f);//視角旋轉角度 glRotatef(view_z, 0.0f, 0.0f, 1.0f);//視角旋轉角度 glColor3ub(0.0f,0.0f,130.0f);//設顏色 drawRetc(1024.0f,768.0f,10.0f);//底板 glPushMatrix();///區塊start { glColor3ub(0.0f,130.0f,130.0f); glTranslatef((1024.0f/2.0f-100.0f/2.0f),(768.0f/2.0f-100.0/2.0f),(10.0f/2.0f+200.0f/2.0f)); glTranslatef(trans_x,0.0,0.0); glTranslatef(0.0,trans_y,0.0); drawRetc(100.0f,100.0f,200.0f);//主幹1 glRotatef(Rotat1,0.0f,0.0f,1.0f); glPushMatrix();///區塊start { glColor3ub(0.0f,130.0f,30.0f); glTranslatef(0.0f,0.0f,(200.0f/2.0f)+(200.0f/2.0f)); drawRetc(100.0f,100.0f,200.0f);//主幹2 glPushMatrix();///區塊start { glColor3ub(130.0f,30.0f,130.0f); glTranslatef(100.0f/2.0f-300.0f/2.0f,(100.0f/2.0f+100.0f/2.0f),(200.0f/2.0f)-(100.0f/2.0f)); glTranslatef(300.0f/2.0f-100.0f/2.0f,0.0f,0.0f); glRotatef(Rotat2,0.0f,1.0f,0.0f); glTranslatef(-300.0f/2+100.0f/2.0f,0.0f,0.0f); drawRetc(300.0f,100.0f,100.0f);//手臂1 glPushMatrix();///區塊start { glColor3ub(130.0f,30.0f,30.0f); glTranslatef(-100.0f,0.0f,0.0f); glRotatef(Rotat3,0.0f,1.0f,0.0f); glTranslatef(100.0f,0.0f,0.0f); glTranslatef(-300.0f/2-250.0f/2.0f+100.0f,-100.0f/2.0f-100.0f/2.0f,0.0f); drawRetc(250.0f,100.0f,100.0f);//手臂2 glPushMatrix();///區塊start { glColor3ub(30.0f,130.0f,130.0f); glTranslatef(-300.0f/2.0f+50.0f/2.0,0.0f,0.0f); drawCir(50.0f,100.0f,16);//手臂2的半圓 glRotatef(Rotat4,1.0f,0.0f,0.0f); glPushMatrix();///區塊start { glColor3ub(130.0f,130.0f,130.0f); glRotatef(90.0f,1.0f,0.0f,0.0f); glTranslatef(-50.0f,0.0f,(150.0f+Trans1)/2.0f); drawCir(10.0f,150.0f+Trans1,16);//手臂3 glPushMatrix();///區塊start { glTranslatef(0.0f,0.0f,(150.0f+Trans1)/2.0f); glRotatef(Rotat5,0.0f,0.0f,1.0f); drawRetc(40.0f,30.0f,3.0f);//手掌 } glPopMatrix();///區塊end } glPopMatrix();///區塊end } glPopMatrix();///區塊end } glPopMatrix();///區塊end } glPopMatrix();///區塊end } glPopMatrix();///區塊end } glPopMatrix();///區塊end } glPopMatrix();///區塊end ////////////////////////////////////////// ////////////////////////第十一步 glFlush(); SwapBuffers(pDC->m_hDC); if (ppalOld) pDC->SelectPalette(ppalOld, 0); wglMakeCurrent(NULL, NULL); } ///////////////////////////////////////////////////////////////////////////// // CGLbaseView diagnostics #ifdef _DEBUG void CGLbaseView::AssertValid() const { CView::AssertValid(); } void CGLbaseView::Dump(CDumpContext& dc) const { CView::Dump(dc); } CGLbaseDoc* CGLbaseView::GetDocument() // non-debug version is inline { ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CGLbaseDoc))); return (CGLbaseDoc*)m_pDocument; } #endif//_DEBUG ///////////////////////////////////////////////////////////////////////////// // CGLbaseView message handlers int CGLbaseView::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CView::OnCreate(lpCreateStruct) == -1) return -1; ///////////////////////////////////////////第四步 dc = new CClientDC (this); PIXELFORMATDESCRIPTOR pfd; memset(&pfd, 0, sizeof(PIXELFORMATDESCRIPTOR)); pfd.cColorBits = 24; pfd.cDepthBits = 32; pfd.dwFlags = PFD_DOUBLEBUFFER | PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL; pfd.iLayerType = PFD_MAIN_PLANE; pfd.iPixelType = PFD_TYPE_RGBA; pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR); pfd.nVersion = 1; int nPixelFormat = ChoosePixelFormat(dc->m_hDC, &pfd); if (0 == nPixelFormat) { TRACE(_T("ChoosePixelFormat() failed %d.\r\n"), GetLastError()); return -1; } TRACE(_T("pixel format %d.\r\n"), nPixelFormat); BOOL bResult = SetPixelFormat(dc->m_hDC, nPixelFormat, &pfd); if (FALSE == bResult) { TRACE(_T("SetPixelFormat() failed %d.\r\n"),GetLastError()); return -1; } // // create a rendering context // m_hrc = wglCreateContext(dc->m_hDC); if (NULL == m_hrc) { TRACE(_T("wglCreateContext() failed %x.\r\n"), GetLastError()); return -1; } // // create the palette // CreateRGBPalette(dc->m_hDC, m_pPal); return 0; } void CGLbaseView::OnSize(UINT nType, int cx, int cy) { CView::OnSize(nType, cx, cy); ///////////////////////////////////////////第五步 if ((cx <= 0) || (cy <= 0)) return; BOOL bResult = wglMakeCurrent(dc->m_hDC, m_hrc); if (FALSE == bResult) { TRACE(_T("wglMakeCurrent() failed %x.\r\n"), GetLastError()); return; } int w = cx; int h = cy; // Prevent a divide by zero if(h == 0) h = 1; // Set Viewport to window dimensions glViewport(0, 0, w, h);//設定視窗中可以讓Open GL繪圖的部分 // Reset coordinate system glMatrixMode(GL_PROJECTION); glLoadIdentity(); // Establish clipping volume (left, right, bottom, top, near, far) if (w <= h) glOrtho (-nRange, nRange, -nRange*h/w, nRange*h/w, -nRange*2, nRange*2); else glOrtho (-nRange*w/h, nRange*w/h, -nRange, nRange, -nRange*2, nRange*2); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glLightfv(GL_LIGHT0, GL_POSITION, lightPos); wglMakeCurrent(NULL, NULL); } void CGLbaseView::opengl_Initial()//第九步 { //open gl初始值設定 glEnable(GL_DEPTH_TEST); // Hidden surface removal glFrontFace(GL_CCW); // Counter clock-wise polygons face out glDisable(GL_CULL_FACE); // Do not calculate inside of jet glShadeModel(GL_SMOOTH); glEnable(GL_LIGHTING); glLightfv(GL_LIGHT0,GL_AMBIENT,ambientLight); glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuseLight); glLightfv(GL_LIGHT0,GL_SPECULAR,specular); glEnable(GL_LIGHT0); glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); glEnable(GL_COLOR_MATERIAL); glMaterialfv(GL_FRONT, GL_SPECULAR, specref);//將多邊形設為具有反射性質 glMateriali(GL_FRONT, GL_SHININESS, 128);//設定反射性質的亮度 glClearColor(0.0f, 100.0f, 150.0f, 1.0f );//設定桌布顏色 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//清除螢幕動作 } BOOL CGLbaseView::OnEraseBkgnd(CDC* pDC) { // TODO: Add your message handler code here and/or call default return TRUE;//第十二步 } void CGLbaseView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) { // TODO: Add your message handler code here and/or call default switch(nChar) { case 65://A,4 view_y+=5.0f; //MessageBox("A"); break; case 67://C,3 break; case 68://D,6 view_y-=5.0f; //MessageBox("D"); break; case 69://E,9 view_z+=5.0f; //MessageBox("E"); break; case 81://Q,7 view_z-=5.0f; //MessageBox("Q"); break; case 83://S,5 view_x=0.0f; view_y=0.0f; view_z=0.0f; break; case 87://W,8 view_x-=5.0f; //MessageBox("W"); break; case 88://X,2 view_x+=5.0f; //MessageBox("X"); break; case 90://Z,1 view_z=0.0f; view_x=-90.0f; view_y=0.0f; //MessageBox("Z"); break; case VK_F5: Line_Flag = !Line_Flag; break; case VK_UP: trans_x+= 5.0f; break; case VK_DOWN: trans_x -= 5.0f; break; case VK_RIGHT: trans_y += 5.0f; break; case VK_LEFT: trans_y -= 5.0f; break; } Invalidate(true); CView::OnKeyDown(nChar, nRepCnt, nFlags); } void CGLbaseView::Onset() { // TODO: Add your command handler code here /* CDlg1 dlg1(this);//建立對話盒實體 if(dlg1.DoModal()==IDOK) { Rotat1=dlg1.m_v1; Rotat2=dlg1.m_v2; Rotat3=dlg1.m_v3; Rotat4=dlg1.m_v4; Rotat5=dlg1.m_v5; Trans1=dlg1.m_v6; } Invalidate(true); */ bar1.show(); } void CGLbaseView::OnButton1() { // TODO: Add your control notification handler code here float data[6]={0}; bar1.GetData(data); Rotat1=data[0]; Rotat2=data[1]; Rotat3=data[2]; Rotat4=data[3]; Rotat5=data[4]; Trans1=data[5]; this->SetFocus(); Invalidate(true); } void CGLbaseView::OnQ() { // TODO: Add your control notification handler code here view_z-=5.0f; this->SetFocus(); Invalidate(true); } void CGLbaseView::OnS() { // TODO: Add your control notification handler code here view_x=0.0f; view_y=0.0f; view_z=0.0f; this->SetFocus(); Invalidate(true); } void CGLbaseView::OnW() { // TODO: Add your control notification handler code here view_x-=5.0f; this->SetFocus(); Invalidate(true); } void CGLbaseView::OnX() { // TODO: Add your control notification handler code here view_x+=5.0f; this->SetFocus(); Invalidate(true); } void CGLbaseView::OnZ() { // TODO: Add your control notification handler code here view_z=0.0f; view_x=-90.0f; view_y=0.0f; this->SetFocus(); Invalidate(true); } void CGLbaseView::OnE() { // TODO: Add your control notification handler code here view_z+=5.0f; this->SetFocus(); Invalidate(true); } void CGLbaseView::OnD() { // TODO: Add your control notification handler code here view_y-=5.0f; this->SetFocus(); Invalidate(true); } void CGLbaseView::OnC() { // TODO: Add your control notification handler code here Line_Flag = !Line_Flag; this->SetFocus(); Invalidate(true); } void CGLbaseView::OnA() { // TODO: Add your control notification handler code here view_y+=5.0f; this->SetFocus(); Invalidate(true); } void CGLbaseView::OnUp1() { // TODO: Add your control notification handler code here float data[6]={0}; bar1.SentData(0,1.0f); bar1.GetData(data); Rotat1=data[0]; Rotat2=data[1]; Rotat3=data[2]; Rotat4=data[3]; Rotat5=data[4]; Trans1=data[5]; this->SetFocus(); Invalidate(true); } void CGLbaseView::OnUp2() { // TODO: Add your control notification handler code here float data[6]={0}; bar1.SentData(1,1.0f); bar1.GetData(data); Rotat1=data[0]; Rotat2=data[1]; Rotat3=data[2]; Rotat4=data[3]; Rotat5=data[4]; Trans1=data[5]; this->SetFocus(); Invalidate(true); } void CGLbaseView::OnUp3() { // TODO: Add your control notification handler code here float data[6]={0}; bar1.SentData(2,1.0f); bar1.GetData(data); Rotat1=data[0]; Rotat2=data[1]; Rotat3=data[2]; Rotat4=data[3]; Rotat5=data[4]; Trans1=data[5]; this->SetFocus(); Invalidate(true); } void CGLbaseView::OnUp4() { // TODO: Add your control notification handler code here float data[6]={0}; bar1.SentData(3,1.0f); bar1.GetData(data); Rotat1=data[0]; Rotat2=data[1]; Rotat3=data[2]; Rotat4=data[3]; Rotat5=data[4]; Trans1=data[5]; this->SetFocus(); Invalidate(true); } void CGLbaseView::OnUp5() { // TODO: Add your control notification handler code here float data[6]={0}; bar1.SentData(4,1.0f); bar1.GetData(data); Rotat1=data[0]; Rotat2=data[1]; Rotat3=data[2]; Rotat4=data[3]; Rotat5=data[4]; Trans1=data[5]; this->SetFocus(); Invalidate(true); } void CGLbaseView::OnUp6() { // TODO: Add your control notification handler code here float data[6]={0}; bar1.SentData(5,1.0f); bar1.GetData(data); Rotat1=data[0]; Rotat2=data[1]; Rotat3=data[2]; Rotat4=data[3]; Rotat5=data[4]; Trans1=data[5]; this->SetFocus(); Invalidate(true); } void CGLbaseView::OnDown1() { // TODO: Add your control notification handler code here float data[6]={0}; bar1.SentData(0,-1.0f); bar1.GetData(data); Rotat1=data[0]; Rotat2=data[1]; Rotat3=data[2]; Rotat4=data[3]; Rotat5=data[4]; Trans1=data[5]; this->SetFocus(); Invalidate(true); } void CGLbaseView::OnDown2() { // TODO: Add your control notification handler code here float data[6]={0}; bar1.SentData(1,-1.0f); bar1.GetData(data); Rotat1=data[0]; Rotat2=data[1]; Rotat3=data[2]; Rotat4=data[3]; Rotat5=data[4]; Trans1=data[5]; this->SetFocus(); Invalidate(true); } void CGLbaseView::OnDown3() { // TODO: Add your control notification handler code here float data[6]={0}; bar1.SentData(2,-1.0f); bar1.GetData(data); Rotat1=data[0]; Rotat2=data[1]; Rotat3=data[2]; Rotat4=data[3]; Rotat5=data[4]; Trans1=data[5]; this->SetFocus(); Invalidate(true); } void CGLbaseView::OnDown4() { // TODO: Add your control notification handler code here float data[6]={0}; bar1.SentData(3,-1.0f); bar1.GetData(data); Rotat1=data[0]; Rotat2=data[1]; Rotat3=data[2]; Rotat4=data[3]; Rotat5=data[4]; Trans1=data[5]; this->SetFocus(); Invalidate(true); } void CGLbaseView::OnDown5() { // TODO: Add your control notification handler code here float data[6]={0}; bar1.SentData(4,-1.0f); bar1.GetData(data); Rotat1=data[0]; Rotat2=data[1]; Rotat3=data[2]; Rotat4=data[3]; Rotat5=data[4]; Trans1=data[5]; this->SetFocus(); Invalidate(true); } void CGLbaseView::OnDown6() { // TODO: Add your control notification handler code here float data[6]={0}; bar1.SentData(5,-1.0f); bar1.GetData(data); Rotat1=data[0]; Rotat2=data[1]; Rotat3=data[2]; Rotat4=data[3]; Rotat5=data[4]; Trans1=data[5]; this->SetFocus(); Invalidate(true); }
|
沒有留言:
張貼留言