《计算机图形学编程》笔记——第一章

《计算机图形学编程》笔记——第一章

入门

嗨,各位读者朋友们好,最近由于看到图形学有很多好玩的东西,于是想着尝试一下入门学习相关知识。图形学的用途非常推荐各位小伙伴看一下胡渊明博士的GAMES201第一讲:GAMES201:高级物理引擎实战指南2020,概述就介绍得非常好,笔者当初看了这一讲以后对图形学产生了浓厚的兴趣,无奈笔者三天打鱼两天晒网。。。

遗憾的是,看完第一讲后,后续的内容专业性就比较高了,对于流体力学等没什么研究的笔者来说要求太高,无奈只能从更基本的课程开始看。后来发现其实国内有一个维护得比较好的图形学论坛:计算机图形学与混合现实研讨会,这个论坛会定期做技术分享,在此看到了更加经典的课程:闫令琪老师的GAMES101-现代计算机图形学入门。闫老师对于知识的讲解深入浅出,非常适合初学者。同时,如果配合虎书:《Fundamentals of Computer Graphics》一起食用会更加美味。

另外,GAMES101会配有编程作业,相关资源网上也可以获取。但是可能对于入门选手来说,直接上一个这样的内容,会有点吃力,毕竟没有系统的学过c++/opengl,于是笔者退而求其次选择了一本编程书:计算机图形学编程,粗略了学习了一遍。笔者也不求精通,但是至少知道编程的流程,还有各个相关的函数怎么用,对于后续看系统的框架会有所助益。

要求

图形学对于编程和数学的要求非常高,特别是对于动画和模拟等,需要研究很多物理模型等。而常用的图形学编程语言是C++,因为OpenGL调用库是基于C语言开发的,本质上和C++是同源,因此基于C++结合OpenGL写代码,比较方便,尽管C++非常难。

值得注意的是,在开始写代码之前我们还需要安装相关的依赖项,或者说工具库。由于我们需要用OpenGL,着色器语言GLSL,窗口管理程序GLFW,甚至是GLUT。所以我们需要先安装一遍,这个过程是非常简单的。

# opengl
sudo apt-get install libgl1-mesa-dev
# glew
sudo apt-get install libglew-dev
# glfw
sudo apt-get install libglfw3-dev
# optional
sudo apt-get install freeglut3-dev

值得注意的是,OpenGL提供了数学库,即GLM,对于位姿变换的计算比较方便,不过赋值的时候有一些需要注意的地方,这块儿第三章会介绍。

将上面的库装完,我们就可以开始写代码了。课本提供了完整的参考代码,我们可以非常简单地实现可视化效果,得到反馈。

开源代码

由于作者在书本上提供了相关的链接资源,但是出于对版权的尊重,笔者还是不提供相关的源码链接了,非常建议读者朋友们购买书籍:计算机图形学编程来获取代码。

作者提供的代码主要是在Windwos和Mac上运行的程序,因此没有CMakeLists.txt的代码。为了方便在Linux下运行,笔者对每一章进行了封装,此外,每一章提供了README.md介绍代码运行的结果,此外还有附图。

代码地址: yepeichu123 /cg_book_practice

为了在README.md中提供可视化的结果,笔者将OpenGL窗口中的内容转换成OpenCV可以存取的图像格式。因此,若是要调用相关函数,需要读者朋友们安装OpenCV,笔者用的是Opencv3.2.0版本。如果觉得麻烦,可以将该函数和CMakeLists.txt中的内容注释。

drawMultipleCubes

引用

[1] GAMES201:高级物理引擎实战指南2020
[2] 计算机图形学与混合现实研讨会
[3] GAMES101-现代计算机图形学入门
[4]《Fundamentals of Computer Graphics》
[5] 计算机图形学编程
[6] yepeichu123 /cg_book_practice

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
计算机图形学 VC图形编程 绘制点 绘制点 32位的COLORREF类型值来确定图形颜色值,其结构为0x00bbggrr, bb:代表蓝色值,范围从00到FF; gg:代表绿色值,范围从00到FF; rr:代表红色值,范围从00到FF; 还可以用RGB宏来完成相同的功能: RGB(short red ,short green, short blue) red 代表红色值,范围从0到255; green代表绿色值,范围从0到255; blue代表蓝色值,范围从0到255; 绘制点 void CPixelView::OnDraw(CDC* pDC) { ………… for(int i=0;i<200;i++) pDC->SetPixel(1*i,50,RGB(0,0,255)); for(int j=0;j<200;j++) pDC->SetPixel(2*j,100,(COLORREF)0x0000ff00); for(int m=0;m<200;m++) pDC->SetPixel(3*m,150,(COLORREF)0x000000ff); for(int n=0;n<200;n++) pDC->SetPixel(4*n,200,(COLORREF)0x0000ffff); for(int p=0;p<200;p++) pDC->SetPixel(5*p,250,(COLORREF)0x00ff00ff); for(int s=0;s<200;s++) pDC->SetPixel(6*s,300,(COLORREF)0x00000000); } 使用鼠标绘图 在VC中,鼠标的各种事件(单击鼠标左键,单击鼠标右键,双击鼠标左键,双击鼠标右键,移动鼠标)被作为消息,通过系统自带的消息映射功能,对操作者的不同操作进行响应处理。 使用鼠标绘图 绘制直线 void CCreateLineView::OnLButtonDown(UINT nFlags, CPoint point) { CDC* pDC=GetDC();//获取设备环境 pDC->SelectStockObject(NULL_BRUSH);//空画刷,选取库存的GDI模式 使用鼠标绘图 绘制直线 switch(m_step) { case 0://当第一次单击鼠标左键 m_Startp=m_Endp=point;//确定直线的起点 m_step++;//等待输入直线的终点 break; 使用鼠标绘图 绘制直线 case 1://当第二次单击鼠标左键 m_Endp=point;//确定直线的终点 m_step=-1;//使得再单击鼠标左键均无效 //m_bline=TRUE;//生成直线 DrawLine(pDC,m_Startp,m_Endp);//绘制直线 break; default://为空操作,表示不再绘制新直线; } 使用鼠标绘图 绘制直线 ReleaseDC(pDC);//释放不再使用的DC CView::OnLButtonDown(nFlags, point); } 使用鼠标绘图 绘制直线 void CCreateLineView::DrawLine(CDC *pDC, CPoint start, CPoint end) { pDC->MoveTo(start.x,start.y); pDC->LineTo(end.x,end.y); } 使用鼠标绘图 绘制直线 设置4个成员变 使用鼠标绘图 绘制直线 设置橡皮筋模式 void CCreateLineView::OnMouseMove(UINT nFlags, CPoint point) { CDC* pDC=GetDC(); int nDrawmode=pDC->SetROP2(R2_NOT);//设置绘图模式:屏幕颜色反色。 pDC->SelectStockObject(NULL_BRUSH); 使用鼠标绘图 绘制直线 设置橡皮筋模式 if(m_step==1&&!m_bline) { CPoint prePnt,curPnt; prePnt=m_Endp;//获得光标所在的前一个位置 curPnt=point; 使用鼠标绘图 绘制直线 设置橡皮筋模式 DrawLine(pDC,m_Startp,prePnt);//绘制橡皮线 DrawLine(pDC,m_Startp,curPnt); m_Endp=point; } pDC->SetROP2(nDrawmode);//恢复先前的绘图模式 ReleaseDC(pDC);//释放DC 与绘图相关的GDI对象类 CBitmap类,CBrush类,CFont类,CPen类 CRgn类,CPalette类。 通常,我们都是使用GDI绘图对象类所创建的对象进行绘制各种图形的, 好象画家手里的画笔,而设备环境就是用什么样的画纸。 CPen 画笔是一种用来画线及绘制有形边框的工具,用户可以指定它的颜色及厚度,并且可以指定它画实线、点线或虚线。 CPen(int nPenStyle,int nWidth,COLORREF crcolor); CPen CPen(int nPenStyle,int nWidth,COLORREF crcolor); nPenStyle: PS_SOLID:实线画笔。 PS_DASH:虚线画笔。 PS_DOT:点线画笔。 PS_DASHDOT:点划线画笔。 CPen CPen(int nPenStyle,int nWidth,COLORREF crcolor); nWidth :指定画笔宽度。 CPen for (int i=0;i<7;i++) { CPen NewPen1(PS_SOLID+i,1,RGB(0,255,0)); CPen *pOldPen=pDC->SelectObject(&NewPen1); pDC->MoveTo(10,20*i+10); pDC->LineTo(700,20*i+10); pDC->SelectObject(pOldPen); } CBrush 画刷定义了一种位图形式的像素,利用它可以对域内部填充颜色。 CBrush(int nIndex,COLORREF crcolor); CBrush CBrush(int nIndex,COLORREF crcolor): nIndex:画刷的阴影线的风格 HS_BDIAGONAL:从左到右向下成45度的对角线。 HS_CROSS:水平线和垂直线相交的十字交叉线。 HS_DIAGCROSS:夹角为45度的斜十字交叉线。 HS_FDIAGONAL:从左到右向上成45度的对角线。 HS_HORIZONAL:水平阴影线。 HS_VERTICAL: 垂直阴影线。 CBrush CBrush NewBrush1(RGB(0,255,0)); CBrush *pOldBrush1=pDC->SelectObject(&NewBrush1); pDC->Rectangle(50,50,200,300); pDC->SelectObject(pOldBrush1); CBrush CBrush NewBrush2(HS_BDIAGONAL,RGB(255,0,0)); CBrush *pOldBrush2=pDC->SelectObject(&NewBrush2); pDC->Rectangle(250,50,400,300); pDC->SelectObject(pOldBrush2); CFont 字体是一种具有某种风格和尺寸的所有字符的完整集合,它常常被当作资源存于磁盘中,其中有一些还依赖于某种设备。 扫描转换矩形 void CFillView::Fillrectangle(CDC *pDC, COLORREF rccolor) { int x,y; for (y=50;y<300;y++) for (x=50;x<200;x++) { pDC->SetPixel(x,y,rccolor); } } 扫描转换矩形 void CFillView::OnLButtonDown(UINT nFlags, CPoint point) { if ((50 < point.x) & (point.x <200) & (50<point.y) & (point.y<300)) {CDC *pDC=GetDC(); Fillrectangle(pDC, RGB(255,255,0)); } CView::OnLButtonDown(nFlags, point); } 谢 谢

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值