找回密码
 立即注册
查看: 331|回复: 3

OpenGL经典应用(纯干货)

[复制链接]
发表于 2022-1-26 11:02 | 显示全部楼层 |阅读模式
纯干货,哈哈,先卖个关子。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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2022-1-26 11:10 | 显示全部楼层
太棒了,受益匪浅[赞同][赞同][赞同][酷][赞][赞][赞]
发表于 2022-1-26 11:17 | 显示全部楼层
经典到2022年用1998年的固管是吧
再见
发表于 2022-1-26 11:22 | 显示全部楼层
有些场合还是离不开[大笑][大笑][大笑]
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2025-5-14 10:35 , Processed in 0.141151 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表