2012年3月2日 星期五

[VC(Visual C++) ]- OpenGL 簡單機器手臂4

[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);    

}

 



 


沒有留言:

張貼留言