五.BOB RayTrace整體研究:



     BOB的基本程式架構如下所示:

     ----------------------------

     // ........標題.......   /* 注解

     #include color.bc      /* 外部程式--顏色檔

     #include textures.bs    /* 外部程式--材質庫

//工作環境的設定 studio {........    ........ (相機) }

light {........ (燈光) ........ }

surfaace {........ ........ (表面材質) }

//各種物體 sphere {........ ........ }

cone {........ ........ }

ring {........ ........ }

polygon {........ ........ }

//取得外部物體 surface {........ ........ }

transform { scale x y z } //縮放比例 transform { rotate 0 0 35 } //Z軸轉35度 #include column.bo transform_pop

transform { rotate 90 0 0 translate 27 20 12 } #include column.bo transform_pop transform_pop

輸入檔(.B)的格式:

   〈Initialization〉 例:#include COLOR.BC
   〈Studio Definition〉 定義環境
   〈Lights〉 定義一個或多個光源的位置、強度、型態..等
   〈Surface 1〉 定義表面的特性,材質..等
   〈Object 1〉          .
      .            .
      .            .
      .            .
   〈Surface n〉         .
   〈Object n〉          .

Studio影像處理工作坊(整體環境設定)的格式:

   Studio {
       from x y z
       at x y z
       up x y z
       angle ang
       resolution i j
       start line
       stop line
       aspect asp
       projection mode
       ambient acolor
       background bcolor
       haze density

       antialias mode
       threshold dist
       jitter

       aperture size
       focal_length dist
       samples n

       no_shadows
       no_exp_trans
       caustics
       depth max_depth
       }

  1. 【Studio參數說明】
    from:設定照相機位置。(此參數不可不定義)
    at:照相機的觀測點。
    up:座標系統法面。(一般值為0 0 1表示Z軸朝上)
    angle:照相機的視角。(一般值為 50 )
    resolution:影像在像素中的尺寸。(此參數可不定義)
    start line:掃描起始列。(一般值為 0 )
    stop line:掃描結束列。(一般值為 479 )
    aspect asp:螢幕比例。(一般值為 4/3=1.333 )
    projection:物體材質投射的型態。其模式如下:
    spherical:球面投影。
     orthographic:垂直投影。
     paarallax:(=flat)為平面投影。
    ambient:陰暗區的光亮度(環境光)。
    background: 背景顏色。
    haze: 霧的濃度(density)。
    antialias:消除鋸齒邊。其模式如下:
     none:在每一個像素上投射出一條追跡的光束。完全不處理鋸齒邊,故計算
        時間較快。
     quick:計算之後,採副樣本,用快速取樣取一進似值的方式做光跡法(只適
        用於預視圖)。
     corners:每一像素只有一條追跡的光束,其所計算結果與週圍4點計算之平均
         值共用。
     adaptive:投射出一條光束在像素上,若計算值超出臨界值(threshold),會      將像素細分成4個細分點,如此反覆計算,直到它達到一個常數值或      使它的強度產生很平滑的改變。
    threshold:應用在adaptive模式中,其值域從0∼255,在quick模式中,其內定值
        為16。
    jitter:一些微小分子的隨機振動現像。當一物體用棋盤的表面時,可使交接界    線在不同方向較為平滑。
    aperture:是鏡頭焦距的一個參數值。(內定值=0) 可改變焦點的擴散程度,使影     像清析或糢糊。必須與focal_length配合使用。
    focal_length:focal_length決定相機到焦距平面之距離。其決定值由Form與at來
          決定。
    samples:光跡追蹤時所採用的光束量(內定值為8條)。
    no_shadows:不產生物體的影子。
    no_exp_trans:光跡追蹤時忽略所有透明物體的存在。
    canstics:是一種經驗值參數。可使透明物體之內部產生圖案,其內部圖案是由     光線在內部反射所造成的。
    depth:光跡追蹤遞回層次的深度。可計算物體的交線,其最大值為20,亦是內    定值。(在預視的Render中可將此值改為1或2可增加Render的速度。)

Lights

在BOB光跡追蹤程式中燈光可分為4種型態:

【point】:一個點光源在空間中佔據一點,它有position(位置)、color(顏色)、   falloff(衰減)等屬性來決定光源的距離及強度,一個點光   源就像在三度空間中,放了一個燈泡,其光源可設定為隨   著距離長度而減少亮度,也可以設定為不受距離影響而亮   度一致。

例: light {
     type point   //燈光型式為point。
              falloff f   //燈光的衰減量。
              position x y z //燈光放置的位置。
              color r g b   //燈光的顏色。
              }

(※燈光強度的改變是根據下列公式:
     I = I。/(dist^f)
     I。:基本燈光強度。
     dist:燈源到物體表面的距離。
     f:若 f=0 -- 不衰減。
     若 f=1 -- 與距離成反比。
     若 f=2 -- 自然物理現像,與距離平方成反比。
          依此我們可計算物體表面的顏色。※)

【directional】:有方向性的平行光源,它有兩種敘述方式
型式1:
   light {
      type directional  //燈光型式為directional。
      color r g b   //可設定顏色。
      direction dx dy dz //方向性以X,Y,Z三軸的向量值表示其方向
      }
型式2:
   light {
      type directional
      color r g b
      from x y z //以光線的起點與終點表示光的方向。
      at x y z
       }

【spherical】:球形燈光。
 light {
    type spherical  //燈光型式為spherical。
    position x y z  //燈光的位置。
    radius r    //球形燈光的半徑。
    color r g b  //燈光的顏色。
    falloff f   //陰暗區的衰減量。
    samples n  //samples這個參數是來控制陰影區產生                     陰影的光束量(其內定值為16)。
             }

【spot】:聚光燈。
 light {
    type spot    //燈光型式為 spot。
    position x y z   //燈光的位置。
    direction dx dy dz //方向性的向量(也可用at x y z表示)。
          min_angle angle1 //強光區。
          max_angle angle2 //弱光區。
          color r g b   //燈光的顏色。
          falloff f    //弱光區光的衰減量。
          }

(※若物體是在min_angle之內,則物體可得到完全的照明,就有如點光源一樣。   若物體是在min_angle與max_angle之間,則表面的照明會隨下列公式而衰減

I=I。*(angle-min_angle)/(max_angle-man_angle)
angle:此角度為物體所佔據範圍的最大角度。

若您想製作一盞具有漸層效果的燈光,可試試如下的設定:

min_angle = 0
max_angle = 30

若您想製作一盞具有明顯界線一如探照燈的燈光,可試試如下的設定:

min_angle = 30
max_angle = 30
                              *)

Primitives基本元件

在Bob中,可利用以下幾種指令,繪製一些基本的幾何圖形。
  1. Sphere球形
    格式:  sphere {
            center x y z
            radius r
            }

    center x y z是定義此圓的中心於三度空間(x y z軸)的位置,radius r是定 義此圓的半徑大小。

  2. Polygon多邊形
    我們可以利用此polygon指令來製作正方形,長方形,三角形,甚至於多邊 形的物體。
    格式:  polygon {
             points n
             vertex x y z
                .
                .
                .
             }

    例:正方形polygon {
             points 4
             vertex 1 1 0
             vertex 1 -1 0
             vertex -1 -1 0
             vertex -1 1 0
             }

    例:三角形polygon {
             points 3
             vertex 0 0 0
             vertex -1 -1 0
             vertex -1 1 0
             }

    例:正方體:正方體則需8個點,組成6個面。
         polygon {
             points 8
             vertex 1 1 0
             vertex 1 -1 0
             vertex -1 -1 0
             vertex -1 1 0
             vertex 1 1 2
             vertex 1 -1 2
             vertex -1 -1 2
             vertex -1 1 2
             }

  3. Ring環
    此指令可製作一圓環。
    格式:   ring {
             center x y z
             normal a b c
             min_radius r0
             max_radius r1
             }

    center x y z是定義此圓的中心於三度空間(x y z軸)的位置,
    normal a b c定義物體的法線,min_radius r0定義內圈的半徑, min_radius r1定義外圈的半徑,也就是說,內圈與外圈的差距越大,此環的寬 度也就越大;內圈與外圈的差距越小,此環的寬度也就越小。

    因為我們要製作放在物體下的地板時,Ring比Polygon要來的容易,所以我
    們通常使用Ring來製作object下的ground plane,只要將min_radius的r0設為0即 可,或將r0和r1兩行用一radius r代替,r代表整個圓盤的半徑。

      格式:  ring {
             center x y z
             normal a b c
             radius r
             }                                                   

  4. Cone圓錐體
    使用cone可作出各種不同的圓錐體,只要控制它的基底部份(base)和頂端
    部份(apex)圓面的半徑,再由XYZ座標來控制圓錐的高度,即可。

    例如:base與apex的半徑(radius)一樣時,則為一圓柱
       base比apex的半徑(radius)大時,則為上面較小的圓錐
       base比apex的半徑(radius)小時,則為下面較小的圓錐

    格式:cone {
          base x y z base_radius r1
          apex x y z apex_radius r2
          }


Transformations轉移

此命令可以讓你去移動物體,改變物體比率,和改變物體的位置。
格式:transform {
        scale s
        rotate x y z
        translate dx dy dz
        }

Clipping修剪

我們可以利用clip指令去修剪一些基本圖形以產生更有變化的圖形。它的做用類
似boolen函數運算。而有以下三種圖形可以用clip修改:
平面(plane)、球形(sphere)、柱形(cone)。

格式:
  平面修改 clip {
          center x y z
          normal x y z
          }

  球形修改 clip {
          center x y z
          radius r
          inside or outside
          }

  柱形修改 clip {
          apex x y z apex_radius r
          base x y z base_radius r
          inside or outside
          }

例:要製作半圓的圖,我們可先做出一個圓,再用clip修改,如下列所示:

  sphere {
      center 0 0 0
      radius 1
      clip {
         center 0 0 0
         normal 0 0 1
        }
             }

這會產生出上半圓,如要下半圓,只要將normal部份改變成normal 0 0 -1即
可。inside與outside的差別在,下outside指令時,會將clip所設定的部份切掉,而為 inside時,會留下clip所設定部份與物體交集的地方。