上一篇留了一个问题,最初立方体不符合透视原理,只是不影响讲灭点。后来强迫症一范,思考一下还是解决了吧,否则如鲠在喉。
为什么不在上一篇上直接修改,犯错也是成长和学习的一部分,它且留当纪念自己走的弯路。这比较符合PDCA和敏捷思想,先做再改进,软件工程最重要的思想。如果一开始奔着完美去做,八成啥也做不出来,想法胎死腹中,无法落地。
问题引入
先看啥问题,立方体顶面是正方形是不对的。
为何不对?从透视角度来看,如果物体顶面是正方形,那么只有视角从物体正上方看,才是正方形。显然这个图不是从正上方看的,视觉矛盾就出现了。
问题分析
那从测上方看,顶面应该是什么样子,简单!生活中注意观察就能发现规律,比如我们观察长方体的纸巾盒,顶面是长方形,四个角是直角,从正上方看才是直角。我们从测前面拍个照片看,明显不是直角。
总结规律
物体透视变形(先不考虑灭点,近距离就当平行的)跟人眼观察角度有关。我们视角越接近正上方,形状变形越小;越是与被观察面夹角越小,被观察面变形越大。
不妨将眼睛和被观察面觉得角度称为观察角,两个极限观察点:
1. 正视(观察角90度),被观察的面无变形,(其实是有等比缩放关系,先不考虑)
2. 平视(观察角0度),被观察面变成直线,变形最大。对于前后两个角度,是变大成180度了,左右两个角度变成0度,成为一条线。
Python上图
通过点P1坐标、长、宽、高、立方体绕高度(Z)轴旋转角度、观察角,这几个参数绘制长方体终于看起来舒服了,其他七个点通过计算而来。
观察角怎么计算,其实很简单,不用计算,想想观察角度影响什么?它只影响顶面两个直角变形。所以我们直接指定一个直角变形参数就行了。 比如上图90度变形为135度,透视效果就出来了。
其他7个点坐标就是几何的简单三角函数计算。
Python上动效
先上个双灭点变形后的图
编程世界:www.pycodeworld.com 支持源码查看和在线修改参数。
灭点和90度变形角不能乱改,否则不符合视觉效果。
双灭点透视(改进版)
引入新问题
加入观察点三维坐标,通过观察点和被观察物体的位置关系,计算生成灭点和90度角变形后的角度。问题又深入了。。。感觉自己掉坑了。。。