前言
之前在画画的时候发现,自己在遇到透视关系比较强的视角时就会变成一个大脑宕机的制杖,于是打算最近练一下带大透视的构图。
因为个人习惯在做事时先把它的某些规律或是法理抽象概括出来(或者自己编),于是便有了这篇文章来留档- -
需要说明的是,本文讲的不是烂大街的一二三点透视等那种缺乏一般性和实用性的东西(主观看法- -因为我即便在板绘前就知道这些概念也还是有很多疑问- -比如消失点,地平线的位置确定之类的问题,自己在画画时也基本只能是靠看上去感觉对不对来判断。当然也可能是因为我没画过什么大透视的东西···)。而且经计算发现,所谓一二三点透视只在绘制的对象是类似于楼房那种比较方正的物体、并且所有“方块”的摆放角度都一致时才是正确的。一个画面中实际的消失点数量是无限多的,空间中每一条不同方向的直线都会对应一个消失点。
当然,本文最后给出的判断方法也做不到精确的算出来画面上每一根线的曲率、角度、长短之类。这样在实际使用上并不现实(比如,曲线怎么整?拿切线or以直代曲嘛!?),而且它的数学过程也决定,一些前置的相关条件只能通过我们自己的空间想象力来大致判断(所以标题才说定性使用)。
一、基础铺垫
先简单说下透视(近大远小)是怎么回事。不扯人眼成像原理之类的,透视成像原理差不多就是下面这张图。
里面有一根垂直于视平面的线段(两个红点连起来的那根)。如果是正交成像,就是场景里的每个点都垂直于视平面发射线,那么是看不到这根线的;但透视成像是场景里每个点向视点(差不多就是眼睛)发射线,形成了一个视锥(图里的四棱锥),所以原本在正交成像中看不见的垂直线两端也会像图中一样岔开一个角度发射线。(所以发散一下,想让透视视图看不见也很简单,让线段方向和射线方向一致即可)
至于透视成像标志性的现象近大远小,自然也就是因为离得远的物体发射线的夹角比离得近的小导致的。
二、先直接说结论
下面是确定某条线的消失点在画布上的大致方位的流程:
1、想象一个十字线把画布四等分,单开个图层画出来也行
2、把你的画面想象成3D空间中的一块竖着的画布。你(的眼睛)在世界的中心,画布在你正前方一小段距离
3、利用你的空间想象力,想象一下你要画的这条线在画布上的正交投影
4、把这个投影线段的起点(原线段离画布近的端点的投影点)挪到画布中心。不好想象角度的话,可以先确定投影在之前四等分中的哪个部分(象限)中。如果还要更精确,可以在四等分基础上连接画布对角线进行八等分,以此由粗略到精确逐步逼近
5、现在已经可以确定,原线段及所有在3D空间中与原线段平行的线的消失点,其实都在这条挪到画布中心的投影线段的正向延长线上。换句话说,这一步已经确定了消失点与画布中心连线的角度
6、想象一下原线段在3D空间中相对于画布有多“陡峭”(原线段垂直于画布的程度,或者说原线段与画布的夹角大小)。定性的来说,越陡峭,消失点距离画布中心的距离越短,反之越长。当完全垂直时,消失点就是画布中心;当完全平行时,没有消失点(在无限远处)
7、总得来说,上面的过程确定了两件事,消失点的角度和距离(其实就是极坐标)。如果想象力比较优秀,还有这么个一步到位的法子。回想一下基础铺垫中的视锥体,然后想象一条与你要画的那条线在3D空间中同向,但发射点在视点的射线(下图红色射线),然后再想象这条射线与视平面的交点,这个交点就是消失点
这里补充一下广角的概念。广角也就是视锥体纵向的张开角度,一般取60°左右(人眼的纵向视度在放松情况下差不多就这个值)。广角的大小关联的是画布的边界,更进一步说是最大能看到多大范围内的场景。如果广角太大,就会像下面这样,越靠近外围拉伸越严重
8、基于上面的结论,对于地平线的定位也可以简单推出。实际上,地平线就是无数个消失点构成的一条线。可以在地平面上任选几条线段,分别找消失点后连线得到地平线。或者采用7中的方法,取一平行于地平面且过视点的平面,想象新平面和视平面的交线就是地平线
9、至于鱼眼透视之类的骚操作,现在连基本透视都不会画的我还没心思搞这些- -但从原理上讲其实应当和上面差不多,只不过其中的视平面换成了带有弧度的曲面,或者考虑了一些光线折射的问题,所以造成了鱼眼镜头的透镜效果
三、数学推导
首先还是直接上结论,即消失点的坐标表达式:
其中,k是画布的高宽比,θ是半广角,Lxyz是线段的方向向量分量。
需要说明的是,这里的坐标经过归一化处理,x以画布宽度的一半作为单位长度,y以画布高度的一半作为单位长度,以此方便实际使用。
消失点坐标的求解可以看做一个极限情况下的直线与三维平面求交点的问题。为方便求解,设视点为坐标原点O,画布(视平面)的宽方向,高方向和法向为xyz轴建立坐标系。
已知线段L的方向向量(Lx,Ly,Lz)(实际使用时这里需要“目测”),视锥半广角θ,视平面的高宽比k(可以根据画布宽高来算),视平面深度depth。求:L上一点P(a,b,c)在c→+∞时,PO和视平面的交点(x,y,z)。
把上面这俩直线方程联立就能得到交点的表达式
然后就是个简单到不能再简单的极限得到最终结果
因为实际使用中没法判断视平面深度depth,所以这里为了消掉它进行了开始的那一步归一化处理。通过侧视图可发现depth与视平面高度的关系是:0.5h=depth·tanθ,根据高宽比可以得到0.5w=depth·tanθ/k,然后分别拿x和y除半宽和半高就得到了一开始的结果。
因为广角的常见值是60°,所以还可进一步简化上面的结果得到下述近似表达式。
因为视平面平行于xOy面,所以上述结果也等价于以画布中心为原点,宽高方向为xy轴的二维坐标系中的归一化坐标,也就是说在画画的时候可以直接用来估算消失点的位置。相较于第二节的定性方法,如果有能力将想象的线段方向数值化,可以考虑用上述公式。
四、程序验证
写个简单的测试程序验证一下。
可以发现在线段终点距离较远时,其投影也会逐渐逼近消失点(黄色虚线逐渐变短),效果上说明公式是正确的。下方控制台输出的是归一化坐标。
五、总结
这次主要思考了有关消失点位置的判定方法(这排版越来越有实验报告或者毕设论文内味了···)。其实透视中还有很多值得思考的问题点,例如两条呈一定夹角的线段在不同视角下的角度变化规律,以及等间距线段(例如路旁的树)在透视成像下的密度变化等。这些以后有机会再算算吧- -看看能不能总结出一些有实际使用价值的公式或规律_(:з」∠)_
当然,个人觉得画画这事光知道理论是不够的(喜闻乐见脑子懂了手跟不上),得通过实践来将理论逐渐内化成一种能力,或者说肌肉记忆。上面的结果目前也只是理论上可行,本人还没有大规模的实际运用过。如果有实际使用的感想或者进一步修改的建议,欢迎评论回复。