关于计算机图形学上机考试雪崩的反思。。

那么我首先要说一些技术之外的事情。。

那就是我拿了笔记本但是却没有拿鼠标。。以前上图形学实验也犯过这个错误。。离开了鼠标。。

我工作效率基本要降一大半。。

然后就是上机。。

那么由于没有鼠标。。我总是在犹豫使用触摸板。。

而且也没有打开老师授课的PPT。。。

忘记说题目了。。题目很简单。。照着书上画一个Bezier曲线

那么书上是有代码的。。但是书上是opengl+DOS,而题目要求是opengl+MFC

那么两者是怎么转化的呢。。

我的理解是利用wgl系列函数绑定当前pdc然后在onDraw里用画笔pdc画就好了。。

但是此处并不是显式调用pdc而是隐式地绑定了device context pointer

那么你最后要记得释放pdc..,然后呢。。如果有一些onSize消息需要我们进行

重绘的话。。那我们也可以进行这个消息的处理。。但是一个逻辑是。。。。

如果不发生该事件则。。该消息就不会发送。。不发送我们就不需要处理

但是我在出错的过程中。。老想着改它。。这样肯定是蠢的

那么有了我以前做工程上述的经验以后。。

我分析了一下书上程序的结构,将专门绘图的一段代码copy到onDraw

但是呢。。此时我用的是之前做过的一个MFC 3D的工程去改。。。

所以前面的初始化我都没管。。事实上呢。。从这一步开始就崩了。。

那么你的代码能正常显示的话。。要依赖于你的投影模式。。在显示屏上

就需要投影,并且我们知道有一个很重要的概念叫做视区。。就是用户要看的区域大小?

当时其实还是有考虑的?

我看到了这个函数。。以为稳了。。谁知道它不能执行我们想要的功能。。

那么实际上是少了这个函数

那么原来那个3D的工程是说。。。

用了这样的投影方式和投影参数。。那么。。这里并没有2D,3D的关键词。。。

我在做的时候并没有意识到2D到3D工程到底在哪些地方敏感。。。

我没有抓到关键的地方。。实际上当时的情况是这样。。如果使用了3D的投影方式和参数

那么你的所有绘图语句不会报错。。但是呢。。结果是。。啥都不显示。。

那么当时我看到这个结果第一反应是懵逼。。觉得自己哪里写错了。。。

奥对。。中间还有一个错误。。和书上一模一样的函数。。书上没事。。我的出事了。。

然后我很慌。。然后clean rebuild确认不是工程问题后。。发现。。我抄错了。。

各种删。。各种改。。onSize都改了。。太蠢。。

不过到后来都没有显示。。完全没有想法该怎么解决。。

那么当时发生了这个问题。。即使我们的姿势水平不够。。但我们依然能够得到一些结论

首先。。这个工程成功运行起来了。。

那么说明我的绘图语句应该都没有太大的问题。。

那么很明显的一个矛盾是。。执行了绘图语句却看不到绘图。。

那么我的一个想法是。。绘图太细。。颜色和背景色一样。。

但是我的后续操作排除了这个可能性

那我们怎么办。。后来我就gg了。。。

那么我们再次关注这个主要矛盾。。已绘和看不到。。可能由哪些原因造成

首先我们要有一个前提。。保证已绘。。

那么有两个问题我们并没有关心。。那就是绘到哪里。。结果显示到哪里

那么这里有一个非常显然的逻辑。。我绘图到A区域。。没有擦除操作。。

我再次观察A区域。。A区域必定有绘图痕迹(假设颜色和大小正常)

那么我们现在观察到的区域并没有痕迹。。那么说明。。要么我们观察的并不是A区域

要么我们的绘图操作确实不正确。。

但是呢。。按照这个逻辑。。我们需要调整一下区域?在哪里调整?ViewPort?还是雪崩

那么还是不行。。

那么后面这个问题我们考虑了之后先放着。。

我们来关心一下更为基础的问题。。MFC可能的大概工作流程。。。

绘制-显示

那么这个绘制操作到底意味着什么呢。。我们肯定把它想成了一个拿着笔直接在屏幕上

画的操作。。但是如果说能画的话为什么不显示?仍然可以怀疑区域不对。。

但是我们要知道。。opengl用到了投影矩阵。。这意味着什么。。它有一个已经处理好的矩阵

然后将这个处理好的矩阵再投影到屏幕上的视窗区域

那么绘制的过程就是不断地处理这个矩阵。。显示的过程就是投影。。

那么绘制的过程是书上给的。。但是呢书也不能保证一定对。。

但是如果一旦我们的绘制过程没错。。我们就应该怀疑我们的显示过程

显示过程显然在前面是设置了状态。。由于还是缺乏这方面的知识。。我们可以选择搜索

每个函数都是什么意思,那么考试之后我来模拟一下这个过程

---glViewport():
glOrtho函数只是负责使用什么样的视景体来截取图像,并不负责使用某种规则把图像呈现在屏幕上。
glViewport主要完成这样的功能。它负责把视景体截取的图像按照怎样的高和宽显示到屏幕上。

那么最后这个函数是一个透视函数。。

然而前面的orth函数我们并没有。。有关投影的函数。。

那么我们想到。。PPT上是怎么处理MFC二维工程的呢。。

那么其实我们可以一下子找到不同点。。但是当时我鼠标不好使。。

那么其实不打开PPT我们把glOrtho复制进去就可以发现

 

 只显示了一部分。。那么我们一个很自然的想法是这个视区?开小了。。

改大了之后

那是因为这里少了一个符号。。

改成上面这样的话。。

就会出现结果。。大功告成。。

分析会对结果有影响的因素。。带着对这个因素的思考去

查每一个函数都是什么意思。。是否都执行了你所期望的功能。。

如果说。。你不先分析。。缩小我们关注的范围。。我们很难直接找到投影函数。。并且关于视窗的知识也是很重要的

那么如果问题还没有解决。。一方面还可以缩小问题规模。。缩小到1之后。。我们再去考虑扩大我们考虑的因素

那么这个是分析工程问题的一个常见的思路吧。。

posted @ 2016-12-20 03:05  狡啮之仰  阅读(386)  评论(0编辑  收藏  举报