|
纯干货,哈哈,先卖个关子。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 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|