povray[1] = 天空
在「第一幅畫」中,繪制了一個黃顏色的球體。現(xiàn)在將這個球體的顏色換成天藍色:
sphere {<0, 1, 2>, 2texture {pigment { color rgb<0.1, 0.25, 0.75> }} }于是,它就變成了天藍色的球體:
由于光源位于球體的右上方,所以球體的左下側(cè)表面出現(xiàn)了陰影。然而現(xiàn)實中,天空是沒有陰影的。要消除球體上的陰影,需要將其表面設(shè)置為不散射來自光源的光:
sphere {<0, 1, 2>, 2texture {pigment {color rgb <0.1, 0.25, 0.75>}finish {diffuse 0}} }結(jié)果這個球體失去了三維感,并且變得很暗:
要讓這個球體在保持現(xiàn)在的狀態(tài)下恢復它的三維感,需要建立參照物,譬如一張漫無邊際的穿過球體的平面:
plane {y, 0texture {pigment {checker color Red, color Blue}} }這個平面垂直于 y 方向并穿過原點:
恢復這個球體三維感的不止是這個平面,球體在這個平面上的影子也起了很重要的作用。
現(xiàn)在,再來考慮怎樣讓這個球體變的亮一些。由于它不散射來自光源的光,那讓它變亮,就只有增強環(huán)境光。舉個例子,房間外面陽光明媚,但是房間內(nèi)的物體卻沒有散射陽光。我們之所以能看見這些物體,是因為環(huán)境光的作用。下面的代碼為球體增加了很強的環(huán)境光:
sphere {<0, 1, 2>, 2texture {pigment {color rgb <0.1, 0.25, 0.75>}finish {ambient <1, 1, 1> diffuse 0}} }于是,它就亮了,呈現(xiàn)出了萬里無云的天空的顏色:
萬里無云,太夸張了,這個球體的半徑只是 2 而已。那么就將它放大 5000 倍吧,并且讓它的中心與坐標系原點重合:
sphere {<0, 0, 0>, 5000texture {pigment {color rgb <0.1, 0.25, 0.75>}finish {ambient <1, 1, 1> diffuse 0}} }于是,我們就看到了蔚藍的天空下一望無際的棋盤格的大平原:
還記得我們的相機是怎么設(shè)置的嗎?
camera {location <0, 2, -3>look_at <0, 1, 2> }現(xiàn)在,將鏡頭中心對準更遠的地方,并在場景中再添加一個球體:
camera {location <0, 2, -3>look_at <0, 3, 8> }sphere {<3, 1, 5>, 1texture {pigment {color Yellow}} }現(xiàn)在,場景變?yōu)?#xff1a;在蔚藍色的天空下,在棋盤格的地面上,躺著一個略微有點變形的黃顏色的球體。
這個球體之所以會略微有點變形,是透視投影的自然結(jié)果。如果它位于相機的鏡頭中心軸線上,
sphere {<0, 2.5, 2.5>, 1texture {pigment {color Yellow}} }結(jié)果就不會變形:
球心的位置是根據(jù)相機的位置及其觀測位置計算所得,使之恰好落在鏡頭中心軸線上。
天空沒有云,太單調(diào)了。我們可以像構(gòu)建天空那樣構(gòu)建云層嗎?
云層是什么?如果不是晴朗的清晨與黃昏,云層無非是白色、灰色以及透明色隨機混合的結(jié)果而已。先來看如何實現(xiàn)多種顏色的混合,拿剛才繪制的那個黃色的球體(球心為 <0, 2.5, 2.5>,半徑為 1 的那個球體)下手:
sphere {<0, 2.5, 2.5>, 1texture{ pigment{ gradient ycolor_map {[0.0 color rgb <0.95, 0.95, 0.95>][0.05 color rgb <1, 1, 1>][0.15 color rgb <0.85, 0.85, 0.85>][0.55 color rgbt <1, 1, 1, 1>][1.0 color rgbt <1, 1, 1, 1>]}}finish {ambient 1 diffuse 0}} }結(jié)果可得:
這是 povray 的梯度顏色機制的效果。「gradient y」表示「梯子」的「橫桿」垂直于 y 軸。上述示例中的梯子,第一根橫桿是非常淺的灰色,第二根橫桿是白色,第三根橫桿是比第一根橫桿深一點的灰色,第四根與第五根橫桿是透明的。
若將這架梯子的尺寸縮小一些,
sphere {<0, 2.5, 2.5>, 1texture{ pigment{ gradient ycolor_map {[0.0 color rgb <0.95, 0.95, 0.95>][0.05 color rgb <1, 1, 1>][0.15 color rgb <0.85, 0.85, 0.85>][0.55 color rgbt <1, 1, 1, 1>][1.0 color rgbt <1, 1, 1, 1>]}scale 0.25 // <--- 這里是關(guān)鍵}finish {ambient 1 diffuse 0}} }它的結(jié)構(gòu)會更清晰一些:
雖然整塊的梯度顏色區(qū)域被縮小了,但是就像桌面壁紙有個「Tile」的功能一樣,它會被 povray 重復使用,直至完全覆蓋物體表面。
雖然梯子形狀的云,沒人見過,但是只要將梯子的各行橫桿的形狀隨機扭曲一下:
sphere {<0, 2.5, 2.5>, 1texture{ pigment{ // gradient ybozo turbulence 0.75 // <-- 注意此處color_map {[0.0 color rgb <0.95, 0.95, 0.95>][0.05 color rgb <1, 1, 1>][0.15 color rgb <0.85, 0.85, 0.85>][0.55 color rgbt <1, 1, 1, 1>][1.0 color rgbt <1, 1, 1, 1>]}scale 0.25}finish {ambient 1 diffuse 0}} }它就可以變成現(xiàn)實中的云:
是的,它現(xiàn)在還不是現(xiàn)實中的云,只是個水晶球,但是只要像之前構(gòu)建天空那樣,將這個球的球心移到坐標原點,然后把它再放大到比天空小一些,那它就是云了,即:
sphere {<0, 0, 0>, 4000texture{ pigment{ bozo turbulence 0.75color_map {[0.0 color rgb <0.95, 0.95, 0.95>][0.05 color rgb <1, 1, 1>][0.15 color rgb <0.85, 0.85, 0.85>][0.55 color rgbt <1, 1, 1, 1>][1.0 color rgbt <1, 1, 1, 1>]}scale 0.25}finish {ambient 1 diffuse 0}} }結(jié)果卻令人失望,并沒有云,只是天空變的白了一點:
天空變白的原因很簡單。我們將球體放大了 4000 倍,但是球體上的云塊卻沒有放大,于是 povray 重復成千上萬次,用這個很小云塊填滿偌大個的球體表面,再加上球體被放大后,球面距離我們的相機也非常的遠,所以我們所看到的天空,變白了。
要解決這個問題,只需將原有的縮放比例乘以 4000:
sphere {<0, 0, 0>, 4000texture{ pigment{ bozo turbulence 0.75color_map {[0.0 color rgb <0.95, 0.95, 0.95>][0.05 color rgb <1, 1, 1>][0.15 color rgb <0.85, 0.85, 0.85>][0.55 color rgbt <1, 1, 1, 1>][1.0 color rgbt <1, 1, 1, 1>]}scale 0.25 * 4000}finish {ambient 1 diffuse 0}} }現(xiàn)在,可以看到像薄棉絮一樣的云了!
bozo 是 povray 提供的一組隨機擾動模式中的一種,主要用來畫云。其他模式有 marble(大理石)、agate(瑪瑙)、granite(花崗巖)、leopard(豹紋)、spotted(斑點)以及 wood(木頭)等,可以將這些隨機擾動模式逐一代入到上述示例,并改改 scale 值,看看都什么效果。
像下面這種隨機擾動模式:
sphere {<0, 0, 0>, 4000texture{ pigment{ marbleturbulence 1lambda .8frequency 2color_map {[0.0 color rgb <0.95, 0.95, 0.95>][0.05 color rgb <1, 1, 1>][0.15 color rgb <0.85, 0.85, 0.85>][0.55 color rgbt <1, 1, 1, 1>][1.0 color rgbt <1, 1, 1, 1>]}rotate 90 * zscale 0.3 * 800}finish {ambient 1 diffuse 0}} }可以渲染出「大馬士革鋼」的紋路:
大馬士革鋼由多種鋼材折疊鍛打而成,表面經(jīng)酸洗后,可以出現(xiàn)與上圖相似的紋路:
最后,再回到薄如棉絮的云的場景中,這個場景太空蕩了,可以在里面放一塊大石頭壓壓場子:
#include "stones.inc" box {<0, 0, 0>, <1, 1, 3>texture {T_Stone25}rotate 30 * ytranslate 5 * z }
如果將光源,由原來的
light_source {<2, 4, -2>color White }改為
light_source {<2000, 4500, -100>color White }那么光源的位置便處于天空與云層之間,于是我們就像上帝那樣,創(chuàng)造了一個太陽:
雖然現(xiàn)實中的太陽,應(yīng)該放在天空之外的,但是那個作為天空的球體會擋住陽光。
下面給出一份完整的 .pov 文件可供參考:
#version 3.7; #include "colors.inc"// 相機 camera {location <0, 2, -3>look_at <0, 3, 8> }// 光源 light_source {<2000, 4500, -100>color White }// 天空 sphere {<0, 0, 0>, 5000texture {pigment {color rgb <0.1, 0.25, 0.75>}finish {ambient <1, 1, 1> diffuse 0}} }// 云 sphere {<0, 0, 0>, 4000texture{ pigment{ bozo turbulence 0.75color_map {[0.0 color rgb <0.95, 0.95, 0.95>][0.05 color rgb <1, 1, 1>][0.15 color rgb <0.85, 0.85, 0.85>][0.55 color rgbt <1, 1, 1, 1>][1.0 color rgbt <1, 1, 1, 1>]}scale 0.25 * 4000}finish {ambient 1 diffuse 0}} }// 大地 plane {y, 0texture {pigment {checker color Red, color Blue}} }// 大石塊 #include "stones.inc" box {<0, 0, 0>, <1, 1, 3>texture {T_Stone25}scale 3rotate 45 * ytranslate 5 * z }就這樣,不務(wù)正業(yè)了一個周末的下午和晚上。
總結(jié)
以上是生活随笔為你收集整理的povray[1] = 天空的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux errno 列表
- 下一篇: Tomcat 之 启动tomcat时 错