RhinoFreak 发表于 2022-1-26 11:02

OpenGL经典应用(纯干货)

纯干货,哈哈,先卖个关子。OpenGL更多的是三维的应用,我想要玩转OpenGL需要会如何绘制三维坐标系,如何处理数据和顶点之间关系、何时高亮捕捉绘制的图形等。建立的经典三维坐标系如图所示。



经典OpenGL三维坐标系绘制图

        // 三维坐标系框架
        glColor3f(0.0,0.0,0.0);
        glBegin(GL_LINE_STRIP);
        glVertex3f(0.0,0.0,0.0);
        glVertex3f(0.0,1.0,0.0);
        glVertex3f(1.0,1.0,0.0);
        glVertex3f(1.0,0.0,0.0);
        glVertex3f(0.0,0.0,0.0);
        glVertex3f(0.0,0.0,-1.0);
        glVertex3f(0.0,1.0,-1.0);
        glVertex3f(0.0,1.0,0.0);
        glEnd();

        glBegin(GL_LINE_STRIP);
        glVertex3f(1.0,0.0,0.0);
        glVertex3f(1.0,0.0,-1.0);
        glVertex3f(0.0,0.0,-1.0);
        glEnd();在MFC框架实现中,会调用到接口函数XXX::OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid),我们要实现的在该函数中完成。该函数实现内容(干货)如下:
      CClientDC pDC(this);
        wglMakeCurrent(pDC.m_hDC,m_hRC);
       
        // 1
        glClear(GL_COLOR_BUFFER_BIT);
        // 2
        float viewX,viewY,startX,startY,temp ,angle1,angle2;
        angle1= m_LeftAndRight/180*(float)PI;
        angle2= m_UpAndDown/180*(float)PI;
        //
        temp= (cos(angle1)+sin(angle1) +m_edge*2)/4.0f;      
        viewX = m_viewX/temp;
        startX= (m_viewX*sin(angle1))/4.0f/temp;
        temp= (cos(angle2)+sin(-angle2)*(sin(angle1)+cos(angle1))+m_edge*2)/4.0f;
        viewY = m_viewY/temp;
        startY= (m_viewY*sin(-angle2)*(sin(angle1)+cos(angle1)) )/4.0f/temp;

        // 3
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glOrtho(-2,2,-2,2,0.4,15);
        glMatrixMode(GL_MODELVIEW);

        // 4、
        glLoadIdentity();
        gluLookAt(0.0,0.0,5.0,0.0,0.0,0.0,0.0,1.0,0.0);
        glColor3f(0.0,0.0,0.0);

        glRotatef(m_UpAndDown,1.0,0.0,0.0);
        glRotatef(m_LeftAndRight,0.0,1.0,0.0);

        MallocMemory();
        // 5
        if ( //判断 )
        {
         //绘制想要的内容
           glCallList(WATERFALL);
        }
        // 6、
        Make_Decorate();

        // 7、高亮穿透显示捕捉到的曲线
        Show_Bright();

        // 8
        SwapBuffers(pDC.m_hDC);
其中viewX,viewY决定了用多少像素来显示这4.0*4.0的空间,而可视的仍然只有这m_viewX*m_viewY的空间,前面两个定位参数是画面左下角相对于屏幕左下角的像素差,可以理解为在屏幕坐标系下坐标。
最后,在MFC的函数XXX::OnInitDialog()中开辟内存,设置定时器就可以实现数据的导入和绘制。

--------------------------------------------------------------------------------Mark 2021.1.23 23:00

Ilingis 发表于 2022-1-26 11:10

太棒了,受益匪浅[赞同][赞同][赞同][酷][赞][赞][赞]

ainatipen 发表于 2022-1-26 11:17

经典到2022年用1998年的固管是吧
再见

kyuskoj 发表于 2022-1-26 11:22

有些场合还是离不开[大笑][大笑][大笑]
页: [1]
查看完整版本: OpenGL经典应用(纯干货)