萬花筒模擬


背景介紹

還不知道什么是萬花筒的小朋友請點擊這里:

 最常見的萬花筒,側邊是由三面鏡子構成的,鏡子不斷反射底部的圖像,產生千變萬化的組合。它產生的圖像比如:

 (圖1)(圖2)

為了更清晰的解釋,我們用下面的圖為例:

(圖3)

以上圖ABC為例 ,真實的圖像是中間最亮的三角形部分,其余的鏡像都是由鏡子反射造成的。

我們的目標就是要用計算機模擬萬花筒生成的圖像。

目標詳解

輸入:

底圖,以上面ABC為例,就是中間最亮的三角形部分;

輸出:

以底圖為基礎,正確的繪制出反射圖像。不僅要考慮最簡單的平鋪形式(ABC這個例子就是平鋪);還要考慮萬花筒的鏡子可以調整,比如調整后可以生成圖2所示的結果。

具體目標:

-正確的處理圖像鏡像;

-模擬鏡子的非理想表面,比如散射和反照率。

目標分析

  •  處理圖像鏡像

有兩個備選方案:

方法一,中心圖像是原始圖像,其它部分都是原始圖像的鏡像,很自然想到算出正確的鏡像平鋪開即可。基本原理如下圖所示。

但是為了模擬更一般的情況(比如圖2),鏡像是在三維空間而不是二維空間中計算的。另外,要考慮到鏡像之間交叉或者重疊情況。

除了以上這些問題,這個方法最重要的潛在的問題是:由於並非物理模擬,不容易擴展;比如鏡子的材質或形狀改變,很可能會導致這種方法的失效。

當然,這個方法的優點也很明顯,就是效率,如果用GPU實現,幾乎沒有什么計算,除了簡單的紋理采樣計算。

考慮到我們的主要是用於實驗目的,效率的要求不是特別迫切,我們嘗試尋找更接近物理的模擬方法。

方法二,光線跟蹤。不了解光線跟蹤但感興趣的同學請wiki之。

適合用光線跟蹤的原因如下:接近物理真實情況;在萬花筒有限的空間內,光線跟蹤計算也比較簡單。二維簡化圖示意如下:

 

  • 模擬鏡子的非理想表面

現實世界的鏡子不是完美的,模擬的時候可以把這些“缺陷”也考慮進去。我想到兩點:

一個是反照率(albedo),我們需要在每一次反射的時候,乘以一個小於1的系數來實現。它產生的效果就是中間圖像最亮,越往外圖像越暗。

另外一個是漫反射,非理想鏡子表面也存在漫反射。經過多次反射后,產生的效果是圖像的模糊;反射次數越多,圖像模糊度越大。ray trace的時候產生漫反射的光線可以解決這個問題,但是會使計算量按幾何級數增加,這個計算量目前是無法負擔的。最簡單的模擬辦法是通過mipmap來模擬,反射次數越多的地方采用尺寸越小的mipmap slice,當然這個方法並不精確,和實際效果是有偏差的。

  • 在現實基礎上的擴展

除了模擬現實,我們可以在我們創造的虛擬世界中加入現實中不存在的元素,或做各種奇怪的實驗。

比如,鏡子的面數可以改變,鏡子之間的夾角可以隨意改變。

比如,鏡子可以有傾斜度(即和底面的夾角並非直角),圖2就是一個實例。

比如,底面(即原始圖平面)本身也可以傾斜。

比如,鏡子反射光線的時候,可以使用抖動技術;這樣反射次數多的地方,會產生溶解的效果。

確定方案

使用D3D在Pixel Shader中做ray trace的核心計算,充分利用GPU的並行計算能力;

在單獨窗口中設置參數,不占用主界面的顯示空間。

此版本結果展示

截圖

下載地址

http://files.cnblogs.com/mchz/Kaleidescope_v1.0.0.1.rar

運行環境要求

WinXP SP2 or Higher
DirectX11 Runtime & DirectX10 Supported Video Card
VS2012 Runtime(http://files.cnblogs.com/mchz/vcredist_x86.rar)

功能詳述

----------
|V1.0.0.1|
----------
第一個版本。本應用的目的是模擬萬花筒。核心功能通過D3D在GPU上實現。
此版本實現的功能有:
支持三面鏡子,且三面鏡子組成一個柱體或台體,剖面是正三角形(這也是現實中絕大多數萬花筒的實現方式)。
可調節的參數是:
-設置底圖: 底圖指的是萬花筒底部的實際物體(比如多彩碎屑),我們用圖片文件模擬,支持拖拽圖片到窗口;
-支持底圖縮放;
-支持底圖平移;
-萬花筒長度調節: 長度越長,底面離眼睛越遠,鏡子越長;
-萬花筒旋轉速度調節;
-可視圓半徑: 指的是圓形Mask的半徑。半徑越小,在GPU上執行速度越快;
-可調節鏡子傾斜度: 這樣三面鏡子可組成台體(頂部和底部剖面大小不同)而不是一般的柱體。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM