使用 POV-Ray 進行科學視覺化
本技能封裝了一組 POV-Ray 建構模組與慣例,這些是為一個實際的英雄圖形(四張磁基態渲染圖,加上五個用於計畫書的概念圖示小工具)而開發,並經過多輪視覺審查後精煉而成。每當交付成果是獨立的圖表或圖示,需要放置在他人將閱讀的文件中(而非 UI、網頁或渲染影像)時,請使用此技能。
為何使用 POV-Ray,以及它能為你帶來什麼
POV-Ray 場景是純文字,這代表:它們易於參數化(對 N 個原子進行迴圈、生成晶格、掃描參數)、易於從可重複使用的巨集中組合,且無需重做任何工作即可重新渲染為不同解析度。輸出結果是平面、精確控制的點陣影像(而非互動式 3D 場景)——這正是論文、投影片和計畫書 PDF 實際需要的格式。
快速開始
- 首先
#include "common.inc"- 設定相機、軟性三點光源系統、背景/透明度以及共享的材質預設。看它一次;註解說明了每個選擇背後的原因(如果你需要偏離它,這很重要)。 - 引入你需要的任何檔案:
molecule.inc- 原子(sv_atom)、鍵結(sv_bond)、向量箭頭(sv_arrow)wave.inc- 振盪管道:傳播波和模糊的「抽象交互作用」連接器是相同的巨集(sv_wave_tube),只是參數不同glow.inc- 分層光暈技巧,適用於任何應被解讀為發光/熱/能量的物體(sv_glow_sphere)orientation_color.inc- 將方向/角度對應到感知上不同的顏色(sv_orientation_colour/sv_colour_wheel),用於方向本身就是數據時(自旋角度、流動方向、相位)
- 使用
scripts/render.sh <scene.pov> [W] [H] [out.png]進行渲染,而非直接呼叫povray- 它會設定+UA(真正的 Alpha 通道)、合理的抗鋸齒,並將 POV-Ray 指向此技能的assets/,以便你的#include指令能解析,無需複製檔案;若 Alpha 通道出現問題,它會發出警告(請參閱下方的陷阱 - 這曾悄悄地困擾過實際工作階段)。 - 在宣告完成之前,查看結果。讀回 PNG 檔案(使用
Read工具)並實際觀看 - POV-Ray 會樂於渲染出一些微妙的錯誤(被相機框架裁切、顏色錯誤、箭頭重疊),且不報任何錯誤。
五個小工具範本
assets/widgets/ 有五個準備好進行改編的場景,每個都是上述建構模組的實際範例:
| 檔案 | 顯示內容 | 建構來源 |
|---|---|---|
laser.pov | 一個傳播的振盪波 + 方向箭頭(光、聲音、任何訊號) | sv_wave_tube(開放、無錐度) |
particle_current.pov | 一行 N 個粒子,每個粒子帶有一個向量屬性,沿著流動方向漂移 | sv_atom + sv_arrow + 一個流動箭頭 |
thermal_grid.pov | 一個 NxN 晶格,帶有小的位置抖動,根據離中心距離從發光熱到冷 | sv_glow_sphere + 一個抖動的網格迴圈 |
interaction_triangle.pov | N 個物體由模糊、發光、非剛性的「交互作用」線連接(與物理鍵結不同) | sv_atom + sv_wave_tube(錐度、抖動、發光) |
複製最接近你需要的範本,並在修改幾何形狀本身之前,更改頂部宣告的參數(顏色、數量、間距、振幅)——所有四個範本都設計成「旋鈕」位於頂部。
對於真實的分子/晶體結構(而非概念圖示),跳過小工具,直接使用 molecule.inc:對原子座標進行迴圈,呼叫 sv_atom 和 sv_bond,並為每個原子的向量(自旋、偶極、位移)使用 sv_arrow;如果該向量的方向本身是有意義且值得以顏色編碼的數據,則使用 sv_orientation_colour。
值得保留的設計慣例
這些並非隨意決定——每一個都來自實際的視覺審查回合:
- 白色背景,真正的 Alpha 通道(
+UA)。 渲染結果可直接放入投影片/頁面/圖表中,沒有可見的方框,並且無論背後是什麼,都能與其他面板乾淨地組合。 common.inc中的三點光源系統,而非單一點光源。一個硬光閱讀起來像是渲染的 3D 物體(「剪貼畫」);而軟性主光+補光+補光系統閱讀起來像是拋光、霧面、印刷的插圖。在多面板圖表的每個面板上保持相同的系統,以便它們讀起來像同一系列——一個與相鄰面板照明不同的面板,即使幾何風格匹配,看起來也像一個不匹配的貼紙。- 鍵結/剛性連接器獲得一個小的遠離相機的 z 偏移(
sv_bond的ZOffset參數),每當鍵結和箭頭可能在同一區域附近平行運行時——否則它們會 Z 軸衝突,或者鍵結會明顯切入箭頭尖端。偏移量足夠小(在典型場景比例下為 0.15-0.25 單位),沒有人會有意識地注意到它的存在。 - 箭頭比「接觸」短 10-20%。 如果兩個向量箭頭在一個共享點相遇,縮小
Scale直到它們的尖端彼此錯開——接觸的尖端閱讀起來像渲染故障,而非數據。 - 抽象與物理連接使用不同的視覺語言。 真實的鍵結(
sv_bond):剛性、清晰、霧面。抽象的耦合/力/相關性(sv_wave_tube搭配Glow=true):波浪狀、邊緣柔和、發光。不要將無法指向真實原子-原子軌道重疊的交互作用畫得像實體桿件一樣。 - 稍微扭曲「通用」的排列。 完美的等邊三角形或完美的規則網格閱讀起來像剪貼畫。小而刻意的規則性偏差(參見
interaction_triangle.pov的三角形,或thermal_grid.pov的抖動)即使在非模擬輸出的示意圖示中,也能閱讀起來像「一個真實的系統」。
當你在渲染真實的模擬數據而非圖示時
如果原子位置/向量來自實際模擬(DFT、分子動力學、微磁學等),上述的圖示小工具慣例仍然適用,但你是從真實座標數據填入 sv_atom/sv_bond/sv_arrow 呼叫,而非手工挑選數值。實用注意事項:
- 透過原子對之間的距離截止值來生成鍵結,而非手動操作。
- 如果你想顯示一個真實的、物理上週期的平鋪區域(比一個模擬單元更大的區域),而無需重新執行昂貴的模擬,並且該屬性均勻地平鋪(對於大多數簡單的有序基態而言是正確的),那麼通常可以在幾何上複製已經收斂的小單元結果,而不是重新模擬一個更大的系統——但請先在你的案例中驗證該屬性確實不會在單元之間變化。
- 裁剪到物理上有意義的邊界(例如,一個完整的配位殼/單元圖案),而非任意的矩形——裁剪本身應說明結構的一些真實情況。
故障排除
在花時間除錯 POV-Ray 解析錯誤或看起來錯誤的渲染結果之前,請閱讀 references/troubleshooting.md ——它列出了在建立此技能時已遇到的特定陷阱(看起來像普通變數名稱的保留 SDL 詞彙、靜默的 Alpha 透明度錯誤、POV-Ray 的相機手性、sphere_sweep/array 的作用域怪異點)。大多數 POV-Ray 錯誤訊息對於語法問題是誠實的,但對於從普通程式設計師的預期來看為何它看起來如此,卻沒有幫助;該檔案的存在是為了讓你不必重新發現同樣的少數陷阱。
有關每個巨集參數和設計原理的更完整說明(包含比此處更多的範例呼叫),請參閱 references/techniques.md。