用PyOpenGL叩开3D的心扉——OpenGL全解析(2)

By | 2011/10/10

每个人都有做3D的潜质

看看这张图片(选自“一秒钟看穿统计陷阱”),美国木匠的平均收入是罗坦提亚木匠的两倍,给出一张统计图片,美国人的钱袋长、高都是罗坦提亚木匠的两倍,看起来挺忠实于数据。

但是右边钱袋实际占用的面积就是左边的4倍。这幅图像导致的暗示效果其实还没完,因为在生活中钱袋都是立体的,所以每个读者看到这个钱袋的时候会不经意地给它加上一个厚度,这样一来,在有些人眼里这幅图表达的明明是美国木匠的收入是罗坦提亚的8倍。原文的意思是这样的印象完全脱离了原始数据所给出的信息,无疑是一次成功的误导(它说的很对!)。

只要你被误导了,无意识的加上了一个厚度,你就拥有了做3D的基本条件了。既然被广泛的使用,可见被大众的3D感是如何的强烈!你一定是其中之一么?

人有两只眼睛,就是为了看立体景象的,自然进化的结果都告诉我们要好好用3D啊。为什么两只眼睛是3D?难道单眼看世界就成平面了?!我闭上一只眼睛——骗子,还是立体的啊,你耍我么?

岂敢岂敢,现在闭上一只眼睛,拿根缝衣针来试着穿一下?失败了吧!没有缝衣针的话简单一点随便走走能很容易的用手从侧面一下子抓到眼前的东西么?失败了吧!不要气馁,这些只是说明你是个正常人。

– – – – 自然给了我们清澈的双眸,我们却用它来发现距离。- – – –

我们能感受到距离,是因为左右两眼看到的事物是不同的,这样的不同反馈到我们的大脑,大脑就把它合成立体的图像,不仅包含左右的距离,还有前后的距离,太神奇了!

计算机上的3D

有些计算机历史知识的,会知道最早的计算机是把结果打在纸带上的,富有艺术力的程序员就在纸带上靠编程打印一系列的*来形成图像,如果你从基础开始学习C语言,很可能就会在学习循环的章节的习题上看到类似的习题。当然纸张表现的艺术,总有些不够cool,而且,是对森林资源的浪费不是么……

于是显示器被发明出来了,与纸不同的是,可以无穷的复用,速度超快,不过新发明总是基于老的东西的,显示器与纸面一样,都是显示二维的图像的,从一开始就是如此,到现在都是,未来嘛……有变化的趋势。

希望你中学的时候有听过美术课,或者,立体几何课上有稍微努力过,如果这也没有,那就发挥一下自己的观察能力吧,看看眼前的任何东西吧,然后默念并感悟这句毁天灭地惊天地泣鬼神的无敌真言——“近大远小”,如何,得道了么?

看看那些艺术绘画作品,人类大概几千年前就明白了这个道理:

2D + 透视 = 3D

上图,顶天立地如假包换的平面图,但是你看到了什么?立体方块是吧。

错觉,一切都是错觉~ 但是我们的计算机3D靠的就是这种错觉诞生的(如果没有立体基础就用笔试着描画一下上图第一幅感受一下,3D就这样在你手中诞生了,快去买瓶啤酒庆祝一下吧)。但是这些终究是错觉,仔细盯着第一幅图,也许一开始会感觉第二幅的感觉,但再看一会儿就会觉得是第三幅。光靠线条的透视,大脑其实并不能得到唯一完美的结论,我们的3D艺术肯定还需要其他的东西来补足,就是后面两幅图中的重要演员——光照。事实上,一般最后的作品还需要纹理来帮忙;如果还能加上阴影等,会更真实。

正交 透视

看看什么是透视,我们知道铁轨是两根距离相等的铁条排放出来的,就像上图右半那样。但是实际观察一下(注意生命安全……),总感觉铁轨在遥远的地方相交了,像左半那样。

透视(perspective)的观察方式下,物体会随着移远而越来越小,视线会在物体移离观察者时最终交汇。这是对真实视觉的模拟,也就是人们观察世界的方式。一般来说,我们以后用OpenGL编程,这种视图也比较多。

另一种观察的方式称为正交(orthogonal) 。这种情况下,视线永远不会交汇而且物体不会改变其大小,没有透视效果。现实生活中我们没有看到这种东西的福气,但对于CAD程序等非常方便,角度长度什么的测量会比较容易。

视野

如果您喜欢照相,相信不用多说就能明白视野这个概念;如果您没什么照相的经验,没关系跟我念:

– – – – 欲穷千里目,更上一层楼 – – – –

当然,李先生是想说“站得高,看得远”的,我想说的是“视野宽,看的多”,不过异曲同工。

广角和远角总是听过的吧?没有的话就按照字母意思猜一下,广角,意味着看的很广,人眼一般只能看到120°~130°,狗的话能看到180°,所以“狗眼看人低”是不对的,小狗们看到的东西可比我们多啊,应该是“狗眼看人小”,因为要在一眼看那么多东西,自然就得把事物都缩小一点才能放得下啊;远角嘛,差不多就是用望远镜咯,虽然看的很远,但基本只能看到一个小圆了。

视野

玩过一些大型3D的话,很可能会有滚动滚轮更改视角的功能,那是感受视野的绝好方法。视野放远,第三人称视角,可能就能看到全局,怪啊东西啊都变的很小了;视野拉近,第一人称视角,怪物好大,恐怖啊……

3D坐标

这次只是系列的第二次,想来还有很多的热情,趁着机会多散布些概念,免得以后说了让人厌。3D坐标

讨厌数学的人同样讨厌坐标,但是请喜欢上它——如果你对3D有兴趣的话。3D坐标是暂时的3D描述最主要甚至是唯一的手段。

想象你在是一个点,就在Origin上,啊,你就是那个Origin原点,眼睛向纸面的外面看。那么你的左手就是就是x轴的正方向,脑袋朝着y的正方向,往前看是z的正方向。那个孤单的点如何表示?{3, 5, 1}就是它的归宿,意思就是向x轴方向前进3,在向y轴方向前进5,z轴方向前进1距离,基本就是在你左上方了,抬头看看吧:)

顺便问问{8, 4, -5}在哪里?

这一篇写了好久才捏出来,3D的基础知识还是很多的,这次虽然讲了不少,而且用的是非常通俗的说法,可能深度比较不够。不过问题不大,随着我们学习的深入,有些新的东西会慢慢引入,有些已经讲述过的东西理解也会加深,慢慢来吧。

2 thoughts on “用PyOpenGL叩开3D的心扉——OpenGL全解析(2)

  1. stayhigh

    博主 你好
    我是一位是對python 有興趣的研究者
    這次的PyOpenGL的題目相當有興趣
    能將你的文章轉貼嗎?

    Reply

发表评论

电子邮件地址不会被公开。 必填项已用*标注