1. 程式人生 > >CityEngine中的模型軸概念

CityEngine中的模型軸概念

3 模型軸
除了Shape軸以外,三維模型也是有自己的軸,我們可以在預覽圖中看到模型的軸,如下圖:
 
由上圖我們也可以看出模型軸與主軸的YZ座標是相反的。另外,這個模型軸是可以根據參考軸的不同而旋轉。如下圖:
 
圖中是分別顯示了Shape軸和模型軸的效果,我們可以看出,當我們把模型通過i(geometryPath)方法插入到Shape後,CityEngine會自動以Shape軸為參考,將模型軸旋轉到與Shape軸一樣,然後以Shape範圍為參考對模型進行縮放,以確保模型範圍與Shape範圍一致。由於Shape的Y座標是0值,所以模型在縮放的時候其Y座標將無法按照Shape範圍來拉伸。CityEngine會自動將模型在Y座標方向上拉伸,在CityEngine的幫助文件中提到了這個拉伸公式,拉伸值的公式如下:

 
4 更改參考軸
在上一節我們提到了模型的軸可以根據參考軸旋轉,那如何設定參考軸呢?在CGA檔案中,當我們使用i(geometryPath)方法插入模型的時候,模型會將它自身的軸旋轉匹配到Shape軸。這樣就會出現上一節的圖中的效果,模型的朝向被改變了。
在CGA的函式庫中,有一個alignScopeToAxes()函式,這個函式的可以在保證模型不被旋轉的情況下,改變參考軸,從而改變模型的範圍。如下例子:
 
以上程式碼,我先把alignScopeToAxes()註釋了,其意思就是將84.dae模型插入到Shape上,並以Shape軸為參考對模型進行縮放旋轉,效果如下圖:
 
在上兩個圖中可以看出模型被旋轉,導致模型的朝向與Shape沒能匹配。下面,我們修改CGA檔案的程式碼,將alignScopeToAxes()的註釋去掉,我們在看看效果:
  
從上兩個圖我們可以看出模型已經沒有以Shape軸為參考旋轉了,而是以主軸為參考進行旋轉,由於模型在其建立的時候已經是按照主軸的座標構建的,所以其朝向是自然與Shape的朝向匹配的。另外,雖然模型並沒有以Shape軸為參考旋轉,但是我們可以看到的是模型依然以Shape範圍為參考所放了。
通過上面的例子,我們可以總結,CityEngine在載入模型時是以參考軸為準旋轉模型,以Shape範圍為參考縮放模型,通過雙參考機制來控制模型的大小和朝向。
參考軸的變化還可以通過使用setPivot(axisMapSelector, cornerIndex)方式,首先我們需要了解setPivot的兩個引數的定義:
axisMapSelector:表示新軸的定義。源軸是xyz,如果新軸定義為xyz的話表示軸沒有變化;當新軸定義為zxy,表示源軸的x座標轉換為新軸的z座標,源軸y座標轉換為x座標,源軸的z座標轉換為y座標。
cornerIndex:是一個0到7的整數範圍值,其意義是表示Shape範圍的8個點,如下圖:
 
如上圖所示,如果Shape範圍是一個立方體的話,CityEngine會以Shape範圍的節點為起點,以順時針方向為各終點編號。這些節點就是轉換參考軸時的參考原點。在這8個節點,上,它們都具有不同的軸,如下圖:
 

有上面三個圖片我們可以看出節點的軸是由原點的軸決定的,先將原軸轉換為新軸,在重新定義各節點的軸。