三维立体图的原理和欣赏方法

上高中的时候第一次接触三维立体图,有位同学拿着一幅花花绿绿杂乱无章的图片盯着看,然后就说他看见了什么立体,描述的煞有介事,我当时看了一个下午,把眼睛看花了也看不出来是什么东西,没想到上了大学学习摄影测量,这立体成了我的专业,了解了立体成像的原理,现在我看这种立体就跟看普通图片似的,凝视几秒钟就看清楚了,真是知识的力量!本来想着自己写一篇这方面的帖子,结果网上一搜,已经有很人把这个问题讲的很好了,但是有些地方还不是很清楚,特将原文主要部分转来此处并做一解释

以下是正文(红色为本人评论):原文网址点击打开链接,原作者应该是刘红石。

三维立体画是利用人眼立体视觉现象制作的绘画作品。普通绘画和摄影作品,包括电脑制作的三维动画,只是运用了人眼对光影、明暗、虚实的感觉得到立体的感觉,而没有利用双眼的立体视觉,一只眼看和两只眼看都是一样的。充分利用双眼立体视觉的立体画,将使你看到一个精彩的世界。

一、立体视觉和立体画原理

人有两只眼,两只眼有一定距离,这就造成物体的影象在两眼中有一些差异,见图1,由图可见,由于物体与眼的距离不同,两眼的视角会有所不同,由于视角的不同所看到是影象也会有一些差异,大脑会根据这种差异感觉到立体的景象。

图 1

三维立体画就是利用这个原理,在水平方向生成一系列重复的图案,当这些图案在两只眼中重合时,就看到了立体的影象。参见下图2,这是一幅不能再简单的立体画了。图中最上一行圆最远,最下一行圆最近,请注意:最上一行圆之间距离最大,最下一行圆之间距离最小。

图 2

这是怎么发生是呢?让我们再看下图3,从图中我们可以看到,重复图案的距离决定了立体影象的远近,生成三维立体画的程序就是根据这个原理,依据三维影象的远近,生成不同距离的重复图案。


3.

其实,我觉得图2很难看出立体,此外,可以补充一下原理:如图4,正常情况下我们的眼睛要看蓝线代表的平面的话,就会左右眼同时聚焦在红圈点上,然而,如果让右眼去看绿圈点,而左眼继续看红圈点,那么我们的大脑就会认为我们看见了远处黑圈点!那么怎样让右眼和左眼各自看不同的点,而自认为看的是同一个点呢?那就只能是,左右眼看见了十分相似的点,如此来欺骗大脑!这就是立体图最本质的原理。


4.

二、立体画的观看

如果你现在还不会看立体画,是不是已经很着急了,下面我将介绍怎样看立体画。

立体画有两种形式:第一种是由相同的图案在水平方向以不同间隔排列而成,看起来是远近不同的物体,请看下图。这样的立体画可用任意一种图象处理软件制作,如Photoshop、Windows画笔等,你也可以一试。

图 5

另一种立体画较复杂,在这种立体画上你不能直接看到物体的形象,画面上只有杂乱的图案,制作这样的立体画只有使用程序了,我为此编写了一些程序,有C和QBASIC的源程序,请看自制立体画程序下载。两种作品看法是一样的,原理都是使左眼看到左眼的影象,让右眼看到右眼的影象,(有人说了:你这不是废话吗?)听我说具体的方法:当你看立体画时,你要想象你在欣赏玻璃橱窗中的艺术品,也就是说你不要看屏幕上的立体画,而要把屏幕看成是玻璃橱窗的玻璃,你要看的是玻璃之内的影象。

三、两点练习法

请把下图6上方的两点作为目标,先使眼睛休息片刻,然后象眺望远方那样,用稍模糊的视线瞄准两点,就会看从两点各自分离出另外两个点,然后调整视线,试图将里面两个点合成一点,当四点变为三点时,你便会看到立体图象。

图 6

四、另一种观看方法

从电脑上看费劲的话,可以这样,如果画面上标有两点(如没有,可以通过仔细观看,在横向上,相隔约3-5厘米,就有相同的图案,如两个相同颜色和大小的点等),那么可以用两个颜色深点的线垂直粘在显示器屏幕的上面(可以进入屏幕少许),使两条线垂直并分别与两点相连。然后,在显示器后面上方放个小东西做参照物,沿显示器上边沿来看参照物,前后移动眼睛的焦点,使左眼、左线、参照物成一直线,右眼、右线、参照物成一直线,可以挡上一只眼调整,然后两眼看参照物,此时两条线就变成了三条,让视线沿中间的线爬进立体画面就看到了立体效果。

相关链接:

三维立体图欣赏(百度贴吧--三维图吧):点击打开链接

刘红石立体画作品欣赏:点击打开链接

时间: 2024-08-06 15:10:02

三维立体图的原理和欣赏方法的相关文章

(转)简述47种Shader Map的渲染原理与制作方法

在Shader中会使用各种不同图参与渲染,所以简单地总结下各种图的渲染原理.制作方法,最后面几种是程序生成图. 1. Albedo 2. Diffuse(Photographic) 从上图可以看出来,Albedo是去掉Diffuse的光照和阴影生成的,而在pbr工作流下必须要用Albedo. 转换方法:How to Make an Albedo Texture from a Diffuse Texture 3. Alpha Map 注意:jpg没有alpha通道,png也没有alpha通道,显示

增加PDF文件对比度的粗浅原理,及方法

  上边这张照片不是异形,而是著名的鹦鹉螺.下边这张照片,是送给研究生同学的毕业纪念,向龙同学帮我激光雕刻的. 最近的照片在[http://www.douban.com/photos/album/134230762/]. 电子书扫描版跟照片差不多,一个可能的问题是看起来乌突突的,黑的不够黑,白的不够白,像是蒙了一层雾.用picasa的luck功能或者snapseed的automatic功能,都能把图片上的雾去掉.但是同样的功能用在PDF上的软件我没有找到. 但是如果弄懂了原理--让我想起 倚天屠

thinkPHP下的widget挂件原理与使用方法

当我们在多个视图页面中用到同一段动态的代码块时,我们就有必要用到thinkphp的widget扩展. widget就相当于在页面中调用一个专属widget的控制器,并将它关联的视图植入当前的页面中,所以,widget的视图内容要按照当前页面的情况来考虑. 先来举个例子吧 需求:写一个供页面使用的主题widget,及多个页面要从数据库中提取所有主题并以列表的模式罗列在页面中,实现以主题筛选的功能. 应用页面: <!-- 主题 --> <dt class="filter_cat&q

mydumper备份原理和使用方法

mydumper介绍 MySQL自身的mysqldump工具支持单线程工作,依次一个个导出多个表,没有一个并行的机,这就使得它无法迅速的备份数据. mydumper作为一个实用工具,能够良好支持多线程工作,可以并行的多线程的从表中读入数据并同时写到不同的文件里,这使得它在处理速度方面快于传统的mysqldump.其特征之一是在处理过程中需要对列表加以锁定,因此如果我们需要在工作时段执行备份工作,那么会引起DML阻塞.但一般现在的MySQL都有主从,备份也大部分在从上进行,所以锁的问题可以不用考虑

epoll的原理和使用方法

设想一个场景:有100万用户同一时候与一个进程保持着TCP连接,而每个时刻仅仅有几十个或几百个TCP连接时活跃的(接收到TCP包),也就是说,在每一时刻,进程值须要处理这100万连接中的一小部分连接.那么,怎样才干高效地处理这样的场景呢?进程是否在每次询问操作系统收集有事件发生的TCP连接时,把这100万个连接告诉操作系统,然后由操作系统找出当中有事件发生的几百个连接呢?实际上,在Linux内核2.4版本号曾经,那时的select或者poll事件驱动方式就是这样做的. 这里有一个分厂明显的问题,

Android检测Cursor泄漏的原理以及使用方法(转)

简介: 本文介绍如何在 Android 检测 Cursor 泄漏的原理以及使用方法,还指出几种常见的出错示例.有一些泄漏在代码中难以察觉,但程序长时间运行后必然会出现异常.同时该方法同样适合于其他需要检测资源泄露的情况. 最近发现某蔬菜手机连接程序在查询媒体存储(MediaProvider)数据库时出现严重 Cursor 泄漏现象,运行一段时间后会导致系统中所有使用到该数据库的程序无法使用.另外在工作中也常发现有些应用有 Cursor 泄漏现象,由于需要长时间运行才会出现异常,所以有的此类 bu

cursor: pin S产生原理及解决方法

转自:http://www.dbafree.net/?p=778 今天晚上在一个比较重要的库上,CPU严重的冲了一下,导致DB响应变慢,大量应用连接timeout,紧接着LISTENER就挂了,连接数也满了等一连串问题. 我们的监控抓取了当时系统的等待事件,ACTIVE SQL及SESSION_WAIT等待事件,所以问题比较容量定位,查看下监控,马上就发现出问题的时间点上出现大量的cusor:pin S,这个等待事件很常见. 再通过查询持有的等待事件cursor: pin S的会话正在执行的SQ

【Spark 深入学习-08】说说Spark分区原理及优化方法

本节内容 ------------------ · Spark为什么要分区 · Spark分区原则及方法 · Spark分区案例 · 参考资料 ------------------ 一.Spark为什么要分区    分区概念:分区是RDD内部并行计算的一个计算单元,RDD的数据集在逻辑上被划分为多个分片,每一个分片称为分区,分区的格式决定了并行计算的粒度,而每个分区的数值计算都是在一个任务中进行的,因此任务的个数,也是由RDD(准确来说是作业最后一个RDD)的分区数决定. 为什么要分区,这个借用

12.ThreadPoolExecutor线程池原理及其execute方法

jdk1.7.0_79  对于线程池大部分人可能会用,也知道为什么用.无非就是任务需要异步执行,再者就是线程需要统一管理起来.对于从线程池中获取线程,大部分人可能只知道,我现在需要一个线程来执行一个任务,那我就把任务丢到线程池里,线程池里有空闲的线程就执行,没有空闲的线程就等待.实际上对于线程池的执行原理远远不止这么简单. 在Java并发包中提供了线程池类——ThreadPoolExecutor,实际上更多的我们可能用到的是Executors工厂类为我们提供的线程池:newFixedThread