工科生的Java Hello World 透视投影动画 -----透视投影数学基础篇

这次我们抛开代码和java,为了实现简单的透视投影动画,来了解一些必要的数学知识,

工科生都学过《线性代数》这门课,如果没有这方面的知识,也没有关系,百度一下,了解简单的矩阵乘法,加法知识即可,非常简单。

透视投影,说白了,就是将三维物体的坐标按一种方式转换为二维平面坐标,这样才能放在屏幕上和图纸上看,至于是哪种方式,就看你的需要了,如果要求立体感,真实感强烈,就采用透视投影,若要求平行性好,变形小的工程要求,就可以选用平行投影。

由于这里我们没有工程需求,而是要求真实感强,所以选用了透视投影,而且是最简单的单点透视。


工科生的Java Hello World 透视投影动画 -----透视投影数学基础篇_第1张图片


如图所示,将具有三维坐标的p(x,y,z) 投影到xoy 平面上p'(x',y',z')显然z'为一个常数;

可以把xoy理解成电脑屏幕。

那么q点就是透视投影中心点,它在垂直于xoy平面的直线上,d也是个常数。


投影过程非常简单,将q与p点相连,与xoy相交一点p',求出p'的坐标就是整个投影过程。



按照三角形相似原理来求得整个变换的公式

很容易得到:z'=0(常数)

x'=d*x/(d+|z|)

y'=d*y/(d+|z|)

这就是一点透视投影的公式,由已知的 常数d和原三维坐标计算我们的屏幕坐标

到这一步,其实你就能写个程序进行透视投影了。

 

提供一些思路:

首先定义8个正方体顶点,坐标是三维坐标,写成2二维数组,

然后根据上式计算出每个顶点的屏幕坐标

最后用画线函数DrawLine按顶点顺序画出棱边即可。

 

但是在计算机图像学中,这些变换都是通过矩阵相称来实现的,更为统一,方便

如果有个矩阵 R能实现:

[x',y',z']=[x,y,z] *R

就能一步完成坐标转换

这个R是什么呢,

依照“齐次坐标的概念”我们还需要给三维坐标加上一维:

[x',y',z',v]=[x,y,z,1] *R

至于为什么这么做,还需百度一下

 

好,根据这个式子和上面我们介绍的投影公式,我们找出R

得到

R=|1,0,0,0|

     |0,1,0,0|

     |0,0,1,1/d|

     |0,0,0,1|

    

计算完后,还需将得到的坐标归一化,让v=1:同时除以v,得到最终屏幕坐标

 

好,简要的数学知识就介绍到这,如果想深入了解,每个步骤都可以百度,以求甚解。

下次我们实现一个矩阵计算的类


 

你可能感兴趣的:(Java)