物體、燈光和攝像機的位子都是使用的典型的3d座標系統。之前,我們講解過pov-ray的座標系統。這裡我們在回顧一下,x軸的正方向指向右邊,y軸正方向指向上,z軸指向螢幕裡。
座標系統的位置經常用三個元素來表示(x,y,z),這是很容易理解的。
向量也不總是來表示指示方向的。他們也涉及一些對物體移動、旋轉和大小控制的操作。
大小,位置,方向和變形的座標操作,與乙個叫做transformations的識別符號有關。接下裡我們就闡述一下transformations和他們的使用。
支援變形的關鍵字有rotate,scale,translate。他們用來變形,處理大小或者移動物體和紋理。乙個轉化矩陣可以用來完成更複雜的變化操作。一組變形操作可以融合在一起,儲存到乙個transformation識別符號裡。transformations的語法如下所示
transformation:
rotate | scale |
translate | transform transform_identifier |
transform |
matrix transformation_block:
transform_identifier | transformation | inverse
transform_declaration:
#declare identifier = transform |
#local identifier = transform
translate關鍵經常後面跟著乙個向量,這個向量用來確定相對於目前位置,要移動的變化量。
sphere
translate <-5,
2, 1>
}
上面的**將會把球體,從<10,10,10>移動到<5,12,11>,而不是<-5,2,1>。另外translate後面的如果有的元素為0,那麼就是沒有變化。
你可以通過使用scale識別符號來改變物體或者貼圖模式的大小。同樣的,關鍵字後面也是乙個向量。
scale可以用來拉伸或者壓扁元素。大於1拉伸,小於1壓扁。
多個scale可以用使用。
sphere
上面的**會拉伸球體程式設計乙個橢球體。x方向是原來的2倍,y方向不變,z方向是原來的1/2。
如果向量中三個元素都相同,那麼可以用乙個常數來代替。另外不能設定為0,系統將發出警告,同時將0變為1,視為沒有進行scale操作。
你可以通過使用rotate識別符號來改變物體或者紋理的方向。向量的中元素分別表示三個軸的旋轉角度。
注意,旋轉是按照x,y,z的順序進行的,如果你對乙個複雜的選擇變數理解不了,不妨,想宣戰單個方向。然後一步步來。
rotate
<0, 30, 0> // 30 degrees around y axis then,
rotate
<-20, 0, 0> // -20 degrees around x axis then,
rotate
<0, 0, 10> // 10 degrees around z axis.
pov-ray使用的是左手系旋轉系統,當進行旋轉時,不妨用一下左手試試。
matrix關鍵字可以用來指定具體的變換矩陣,從而應用到物體和紋理上。它的語法如下:
matrix:
matrix
val00到val32組成了乙個4x4的矩陣,一般情況下,矩陣中的第四列會隱式設定成<0,0,0,1>。對於乙個給定的點p=
qx = val00 * px + val10 * py + val20 * pz + val30
qy = val01 * px + val11 * py + val21 * pz + val31
qz = val02 * px + val12 * py + val22 * pz + val32
一般的,你是不會使用matrix關鍵字,因為它比變換命令更不好描述,而且不直觀。然而matrix命令可以完成一些更複雜的變換,比如說裁剪操作
object
因為旋轉操作與軸有關,大小操作與原位置有關,你可能希望在原位置,對物體先進性大小和旋轉操作,然後在移動物體。
需要注意的是:在指定物體位置然後在進行旋轉操作時,經常會發生錯誤。因為旋轉操作是圍繞著旋轉軸進行的,這時物體的位置就可能變化太大,從而超出攝像機的視野。
同樣的,移動操作之後在進行大小操作,也會把物體移動到想象不到的位置。如果你先移動然後在大小,會導致,移動倍數效果。比如說
translate <5,
6, 7>
scale 4
上面的**,將會移動到<20,24,28>而不是<5,6,7>
transform
乙個相反變換,效果就是正常變換的對立面。可以用來取消一些變換,這樣就可以不適用一大推的正常變換操作了。
當然,正常變換也可以達到inverse的效果,只需要改變其對立屬性即可。比如說:translate y*3的對立可以為:translate -y*3
整合多個變換操作到複雜的場景中是非常有用的。乙個變換識別符號就可以達到這樣的目的。變換識別符號被宣告成下面形式:
transform_declaration:
#declare identifier = transform |
#local identifier = transform
identifier是識別符號的名字,transformation是任何有效的變換操作,修改。具體例子如下:
#declare mytrans =
transform
下面是上面定義的識別符號的具體使用,括號可以省略。
object
object
如果在乙個極端複雜的csg物體上使用變換識別符號,會比單獨應用每乙個變換指令快,這是因為,當再次使用識別符號時,他已經是被編譯過的了。當然是再次使用,速度會快,而不是初次使用。
當乙個物體進行變換時,附著在物體上的紋理也會跟著變換。但是會有以下幾種情況出現:如果現實變換操作(rotate、matrix、translate)在進行紋理設定,那麼紋理是不會發生變換的。如果先進行紋理設定,在進行變換,那麼紋理也會跟著變換。如果在紋理設定中進行變換操作,那麼只會對紋理產生效果。
sphere // texture identifier from textures.inc
scale
3// this scale affects both the
// shape and texture
} sphere
} sphere
}
另外,變換操作還可以單獨的應用到pigment和su***ce normal中,這樣應用操作的同時,可能會影響到其他的一些因素。下面是乙個例子:
box
normal
rotate y*45
// this affects the entire texture but
} // not the object.
}
POV Ray簡單上手教程 攝像機的使用
在本篇,我們學習pov ray中攝像機的一些功能,來獲得一些酷炫的效果 我們首先構建一幅場景 我們使用三個物體,乙個底面 乙個粉色球體,乙個綠色正方體,乙個藍色柱體和乙個黑白相間的地面。三個物體的位置資訊如下 球體在前面,正方體在中間,柱體在後面。最後使用兩個光源來完成場景。上述場景 如下 incl...
opengl 教程 13 攝像機座標系
在前面的教程中,我們都是預設攝像機座標在三維座標的原點,本篇教程我們開始討論把攝像機放在三維空間的任意位置,從而更方便的從不同視角觀察物體。決定三維空間攝像機座標系有三個因素,攝像機的在三維空間的位置,攝像機lookat的方向向量,攝像機的up方向向量,有了這三個值,我們就可以確定三維空間攝像機的位...
ROS 座標系 官方教程與個人理解
4.座標系之間的聯絡 5.多個機械人座標系 6.座標系轉換 7.個人理解 8.參考鏈結 rep代表了ros使用的移動平台的座標框架的命名約定和語義意義。為了更好地整合和重用軟體元件,驅動程式 模型和庫的開發人員需要乙個共享約定來協調框架。座標框架的共享約定為開發人員建立移動基地的驅動程式和模型提供了...