# 場景窗口
visual中的所有的3D物體都在一個窗口中顯示,此窗口為display類的對象,通過這對象我們可以修改窗口的各種屬性;控制場景中的照相機,從各個角度觀察場景。
## 控制場景窗口
從visual庫載入所有對象之后,缺省情況下,有一個可以用變量scene訪問的缺省的場景窗口對象,它也是初始情況下的當前窗口:
```
>>> from visual import *
>>> scene
<visual.ui.display object at 0x032BF600>
```
我們看到場景窗口對象是visual.ui.display類的一個實例。真正的窗口需要在其中放置物體才會被顯示出來。因此如果我們用display()創建自己的窗口對象的話,那么可以不用管這個缺省的窗口對象,我們創建的窗口對象將變成當前窗口。用box等類創建的3D物體將會被放到當前窗口中。下面語句調用display創建一個新的窗口對象:
```
>>> scene2 = display(title='Scene2', x=0, y=0, width=600, height=200, ...
center=(5,0,0), background=(0,1,1))
```
執行上面的語句之后,將創建一個標題為Scene2的窗口,其左上角的坐標為(0,0),寬度為600像素,高度為200像素,照相機所正對的位置的坐標(5,0,0),也就是說窗口中心的點的3D坐標為(5,0,0),背景為青色。注意要顯示窗口,我們需要往里面放物體:
> ```
> >>> box()
> >>> <visual.primitives.box object at 0x0334F090>
>
> ```
>
> ```
> >>> box(pos=(5,0,0), color=color.red)
> >>> <visual.primitives.box object at 0x0334F120>
>
> ```
第一個立方體放在了缺省坐標(0,0,0)處,其顏色為缺省的白色;第二個立方體放在了坐標(5,0,0)處,顏色為紅色。紅色立方體在窗口的中心,和我們設置的窗口的center屬性一致。

在場景中放置立方體
我們可以調用窗口對象的select方法使其成為當前窗口。通過display.get_selected()可以獲得當前窗口對象:
```
>>> scene.select()
>>> sphere()
<visual.primitives.sphere object at 0x0331D7B0>
>>> scene2.select()
>>> sphere(pos=(2.5,0,0), color=color.blue)
<visual.primitives.sphere object at 0x0331D810>
>>> display.get_selected() == scene2
True
```
上面的程序先將scene改為當前窗口,然后在其中創建一個球體;接著將scene2改為當前窗口,在其中創建一個藍色的球體,放在坐標(2.5,0,0)處。最后調用display.get_selected()檢查當前窗口是否是scene2。執行這段程序之后,將出現兩個場景窗口,缺省窗口的標題為VPython,其中有一個球體;我們自己創建的窗口標題為Scene2,其中有兩個立方體和一個球體。

在第二個場景中放置球體
窗口對象有如下的屬性:
* **foreground** : 在窗口中創建物體時所采用的缺省顏色,缺省值為白色。例如運行 scene.foreground = color.green 之后,窗口中新添加的物體如果不指定顏色的話就會是綠色的。
* **background** : 窗口的背景顏色,缺省值為黑色。
* **ambient** : 環境光的顏色,缺省值為color.gray(0.2),為了和visual 3兼容,使用scene.ambient=0.2和scene.ambient=color.gray(0.2)是一樣的。
* **lights** : 場景窗口中的光源列表,場景中的缺省光源為:
> ```
> [distant_light(direction=(0.22, 0.44, 0.88), color=color.gray(0.8)),
> distant_light(direction=(-0.88, -0.22, -0.44), color=color.gray(0.3))]
>
> ```
>
> 可以用如下的語句查看光源的屬性:
>
> ```
> >>> scene.lights[0].direction
> vector(0.218217890235992, 0.436435780471985, 0.87287156094397)
>
> ```
* **cursor.visible** : 控制場景窗口中鼠標是否顯示,如果設置為False的話,那么鼠標將被隱藏。你可以用它在用鼠標拖拽物體時隱藏鼠標,釋放物體時顯示鼠標。
* **objects** : 窗口中所有可見的物體的列表,被隱藏的物體和光源不在此列表之中,當通過設置某物體的visible屬性隱藏它時,其效果就是將它從此列表中刪除。下面的語句讓場景中所有的box都變成紅色:
> ```
> for obj in scene2.objects:
> if isinstance(obj, box):
> obj.color = color.red
>
> ```
* **show_rendertime** : 如果其值為true,那么在窗口的左下角將顯示如 "cycle:27: 5" 的字樣。它表示場景潤色的幀之間的間隔為27毫秒,每幀需要5毫秒時間潤色。這表明用戶的Python程序每幀有22毫秒的處理時間。
* **stero** : 立體視覺設置。如果你有雙色3D立體眼鏡的話,不妨試試這個選項。例如scene.stereo="redcyan",將潤色為紅-青立體眼鏡用的場景,此外還有"redblue"和"yellowblue"等選項。此外還可以設置為"crosseyed",它將潤色左右兩個場景,當你左右眼交叉聚焦到右左兩個圖時,產生立體效果。和流行一時的立體圖片類似,反正我是看不出來。設置為"active"的話,產生可以用shutter glasses觀看的立體場景。
* **stereodepth** : 修改立體視覺的深度,缺省值為0,設置為2有最好的立體效果。這個參數我沒有用過。
下面的屬性 x, y, width, height, title和fullscreen等都只能在窗口隱藏的時候修改。因此通常是在用display創建窗口的時候同時設置這些屬性。如果你需要設置已經顯示了的窗口的屬性的話,先通過設置visible = False將其隱藏,設置這些屬性,最后再重新顯示窗口。
* **x, y** : 窗口在屏幕中的位置,窗口左上角的屏幕坐標
* **width, height** : 整個窗口的像素寬度和高度,包括邊框和標題欄
* **title** : 窗口的標題欄中的文字,如果需要設置中文的話,需要設置為windows的缺省編碼,例如scene.title = u"中文標題".encode("gb2312")
* **fullscreen** : 全屏顯示,如果用scene.fullscreen=True全屏顯示的話,將沒有窗口的邊框和標題欄,按Esc鍵退出
* **visible** : 窗口是否可見,當某個物體被添加進窗口時,窗口將自動的被設置為可見
* **exit** : 當exit為False的時候,將禁止窗口的關閉按鈕,也就是無法通過關閉按鈕關閉窗口,缺省值為True。
## 控制照相機
照相機的控制是通過設置窗口的屬性來完成的。
* **center** : 照相機所正對的3D空間的坐標點,即使用戶旋轉場景,照相機也始終正對著這個坐標。如果你修改了center的值的話,照相機將保持其方向不變,進行平行移動使得其正對center坐標。center的缺省值為(0,0,0)。
> 
>
> 改變照相體的center屬性對照相機進行平移
* **autocenter** : 如果設置為True的話,將自動計算center屬性,使得它為包含所有物體的最小的長方體的中心,此最小長方體的各邊與x, y, z軸平行。這樣,照相機始終跟隨著場景中的物體,因此如果你移動了場景中的任何物體,都有可能改變center屬性。
* **forward** : 照相機所指向的方向。也就是從照相機所在的位置到center的方向矢量。用戶不能直接修改照相機所在的位置,但可以通過scene.mouse.camera獲得。當用戶旋轉場景時,其實就是在修改forward屬性。當forward被修改之后,照相機將會改變其位置使得其方向和forward矢量平行,其中心正對center點。forward的缺省值為(0,0,-1),因此是從上往下的俯視觀察場景。
> 
>
> forward屬性改變照相機的方向和位置
- 用Python做科學計算
- 軟件包的安裝和介紹
- NumPy-快速處理數據
- SciPy-數值計算庫
- matplotlib-繪制精美的圖表
- Traits-為Python添加類型定義
- TraitsUI-輕松制作用戶界面
- Chaco-交互式圖表
- TVTK-三維可視化數據
- Mayavi-更方便的可視化
- Visual-制作3D演示動畫
- OpenCV-圖像處理和計算機視覺
- Traits使用手冊
- 定義Traits
- Trait事件處理
- 設計自己的Trait編輯器
- Visual使用手冊
- 場景窗口
- 聲音的輸入輸出
- 數字信號系統
- FFT演示程序
- 頻域信號處理
- Ctypes和NumPy
- 自適應濾波器和NLMS模擬
- 單擺和雙擺模擬
- 分形與混沌
- 關于本書的編寫
- 最近更新
- 源程序集
- 三角波的FFT演示
- 在traitsUI中使用的matplotlib控件
- CSV文件數據圖形化工具
- NLMS算法的模擬測試
- 三維標量場觀察器
- 頻譜泄漏和hann窗
- FFT卷積的速度比較
- 二次均衡器設計
- 單擺擺動周期的計算
- 雙擺系統的動畫模擬
- 繪制Mandelbrot集合
- 迭代函數系統的分形
- 繪制L-System的分形圖