地平论吧 关注:30,141贴子:882,687
  • 21回复贴,共1

一种在Excel中模拟三维模型透视的非常简洁的方法

只看楼主收藏回复

先放一个好玩的例子在前面当幌子

我们在模拟各种难以实拍的画面时往往需要以来三维建模。虽然建模软件的上手难度不高,而且效果直观简洁,但是深究起来,如果我们不理解三维建模软件中对模型的成像原理,那么它的渲染结果是否可以代表现实并未可知。此前我本着打破砂锅问到底的心态,为了弄清楚三维模型的原理,在excel里用“散点图功能”手写了一个简单的三维线条绘制模型。那套模型虽然更加贴合现实,但是计算极其冗长,以至于过了一年我都还很难把它拿出来分享讲清楚原理。而直到昨天我在帮课题组后辈绘制论文插图时,突然想出了一种极简版的绘制方法。这个方法简单到无需任何三角函数,只要加减乘除,就可以轻松地绘制出严格符合透视原理的三维模型。
整个绘制思路我以表1中的数据作为例子进行讲解:
(1)建系,以观测者为原点,右是x,前是y,上是z;
(2)将要绘制的空间中的点的坐标(x, y, z)写在前三列,眼尖的朋友可以发现这组坐标是正方体的八个顶点;
(3)规定这个模型的位移(右, 前, 上),“前”值要为正,就是要让模型往远了移动,不然看不到;
(4)将前三列坐标整体位移(右, 前, 上),就是x变为x+右,y变为y+前,z变为z+上,写到4~6列;
(5)计算X=x/y,Y=z/y,写到7~8列,这一步骤相当于将该模型投影到y=1的平面上;
(6)框选XY两列,点“插入”→“图表”→“散点图”(见图1),将其X-Y散点图绘制出来;
(7)调整绘制出来散点图的长宽比,结果如图2所示。
表1.一个绘制立方体的示例

图1. X-Y散点图功能在Excel内的位置

图2. 按如上参数绘制的立方体顶点立体图

然而,只有顶点毕竟有点抽象,好在X-Y散点图上可以为点和点之间加上连线(设置数据系列格式→系列选项→线条→自动)。这样一来,我们就可以再玩一个“一笔画”的游戏,来将这个多面体的棱给画出来,如图3,具体数据见表2。
图3. 正方体棱边一笔画,注意有一部分棱边需要重复绘制

表2. 通过“一笔画”来绘制正方体棱边的过程

得到了这个结果之后,我们甚至可以通过调整“位移”中的数据来实现立方体在画面中的移动(图4)
图4. 通过“位移”的调整生成复数张正方体的立体画面,并制作成动图

只要知道顶点的坐标,知道哪些点到哪些点之间应该绘制连线,理论上任何立体图形都可以用这种方式绘制出来。空间中的弧线、曲面也不例外,不过是需要转化为直线段或小三角形面的拼接罢了。
这种绘制和普通镜头成像的几何原理是一致的,绘制出来的图形无畸变且符合生活常识。背后的原理如下(图5):
(1)通过前期计算定出要显示的每个点P在空间中的坐标(x,y,z);
(2)作连接视点O到点P的直线,交y=f的平面于一点(x',f,z'),该平面相当于成像用的底片,f起到焦距的作用;
(3)算出x'、z',将其作为二维画面上的X、Y值进行绘制。
图5. 透视现象背后的相似三角形原理,其中P为被拍摄的点,P′为P在底片上的投影点,本帖中均取焦距f=1

以上这个过程是严格符合三角形相似原理的。而且我们还可以从图中的几何关系验证一些常识,例如:
(1)远小近大,物体距离趋于无穷远时(yP→∞)拍摄下来的大小为0;
(2)焦距越大,画面上的图像就会被放得越大;
(3)同一个物体在垂直光轴方向上平移,拍摄下来的大小不变;
(4)平行于底片的平面上所有的点会被等比例缩放到底片上而不发生变形。
希望这个简单的模型可以帮助大家理解三维图形绘制及常规镜头成像的几何原理。


IP属地:福建1楼2023-11-30 16:32回复
    对大部分人来说Excel只是一个能用来做表格的软件,不可能琢磨出这样的花式应用,太神了


    来自Android客户端2楼2023-11-30 16:59
    收起回复
      好,支持,一會再審閱


      IP属地:中国台湾来自Android客户端3楼2023-11-30 17:10
      收起回复
        这个帖子最主要也是用来解答这个问题的:“为什么无畸变超广角的模拟画面中,靠近画面边缘的地平网格不会发生球状畸变?”就是因为模拟用的地平网格和底片所在的平面平行,整个平面的光轴距相等,每一个格点都等比例地投影上来了。




        IP属地:福建来自Android客户端4楼2023-11-30 17:12
        回复
          哇哦,太厉害了。这个技术也许可以让我们能够在excel里实现3d游戏?


          IP属地:陕西来自Android客户端5楼2023-11-30 18:39
          收起回复
            哇,这个一笔画正方体,我在玩图形计算器hp39gii的时候干过一模一样的事情,也是为了在计算器的屏幕上使用连线画出正方体的图像
            当时刚好在学矩阵变换,给原坐标乘一个旋转矩阵还能让它转起来
            这些内容进一步深入应该就属于计算机图形学的范畴了,后来我还看到过有人给彩屏的图形计算器写了个光线追踪程序,那个是真逆天


            来自Android客户端6楼2023-12-01 06:22
            收起回复
              码了,以后再学(


              IP属地:浙江来自iPhone客户端7楼2023-12-20 01:50
              收起回复


                IP属地:湖北来自iPhone客户端8楼2024-01-21 11:57
                回复
                  还有这个玩法,让人耳目一新


                  来自Android客户端9楼2024-01-21 21:59
                  收起回复
                    能模拟四维吗


                    IP属地:河南来自Android客户端10楼2024-02-15 06:04
                    收起回复