引言
清明时节雨纷纷,路上行人欲断魂”,每到清明,你总能从那如丝如雨缕的春雨绵绵中感到心上缭绕的那点忧愁。
很少有这样一个节日,像清明这样的矛盾。当你放歌踏青时,它是一个轻盈的日子,是节气;当你慎终追远的时候,它是一个悲怆的日子,是节日。
在每一个清明冰凉的夜,你是否也曾仰望满天的繁星,追忆那已故的人?他们就像那满天的繁星,在你生命的漫漫长夜中匆匆划过,照亮了一段时光。
现在就让我们一起用 Processing 来模拟那片星域,让记忆中的人和事翻上心头,细细评味。
效果展现
原理分析
首先通过观看视频,我们可以发现在鼠标所在的点附近的星星是最小的,离该点越远,星星的面积越大,移动的速度越快。就好像星星都从这个点里出来一样,我们暂且把这个点叫做消失点。并且观察可得,消失点把屏幕分成了四个区域A,B,C,D(如图一所示),同时把星星也分成了四类。其中A中的星星向左上方移动,B中点向右上方移动,C中的点向左下方移动,D中的点向右下方移动。
接下来我们来看一下代码实现的大概思路。
我们在脑海里假想一个长方体,以这个长方体的一个顶点为原点,建立世界坐标系。然后选取一个面作为Processing 程序的窗口,建立屏幕坐标系。然后在屏幕上任选一个点,作为消失点,该点在屏幕坐标系下的坐标为(x_endpoint,y_endpoint )。
接着在这个长方体里随机生成一系列的星星,每个星星由一个三维向量(x_world,y_world,z_world)表示,这是它在世界坐标系下的坐标。
接下来我们要做的就是把每一个星星的在世界坐标系的坐标,转换成在processing窗口里面的坐标(x_screen,y_screen),这样我们就可以在屏幕上把星星绘制出来。
首先需要计算星星在世界坐标系下相对于消失点(endpoint)x,y方向的偏移量,接下来将这个偏移量根据星星的z_world进行放缩,最后再将放缩完成的偏移量加回消失点的坐标,得到星星在屏幕上的坐标。
公式如下:
x s c r e e n = ( x w o r l d − x e n d p o i n t ) / z w o r l d ∗ s c a l e + x e n d p o i n t x_{screen}=(x_{world}-x_{endpoint})/z_{world} *scale+x_{endpoint} xscreen=(xworld−xendpoint)/zworld∗scale+