## **貳、變換清零**
**AOI:** 首先,我們先來解決學習bpy最基本的問題吧:從哪里知道對應的操作是什么命令。
**H子:** Blender有沒有什么地方能查看到自己每一步的操作對應了什么命令呢。如果有的話,倒是很方便了。
**AOI:** 你所說的正是存在的。首先,先看到Blender界面的最上方吧。就是那條菜單欄

鼠標移到菜單欄的下邊界上,當鼠標看起來像這樣的時候,往下拉,你就會打開一個新世界。
看起來,就像是這樣的:

而這個位置,就是你所說的,顯示操作對應的命令的地方了,雖然不是每個命令都會顯示,但是絕大部分的命令都會在此顯示出來。活用這個功能,就能大幅度的降低學習門檻了。
**H子:** 噢噢噢噢!(發出了歡喜的聲音。)
**AOI:** 不要自顧自的感動了,先來操作一下吧。重置對象的變換和對對象進行變換吧。
首先選中隨便一個模型,然后移動一下。

就可以看到,已經產生了一個移動的命令
再按一下Alt+G,清零一下移動的變換

就可以看到,這里也產生了一條清零移動變換的命令
這樣,就得到了目標的兩條命令了。

點擊右鍵選擇兩條命令,并按Ctrl+C復制,即可復制命令

可以看到,復制下來的命令,是基于ops類下面的object進行的操作。

查詢官方文檔的描述,可以看到,這個命令的作用是
> Translate (move) selected items
>移動選中的對象
而我們是通過context來獲取對象,所以要遍歷操作對象,只需要循環的選中每一個對象,然后使用這個命令對模型進行移動即可。
值得注意的是,這個命令所進行的操作,是**移動**,而不是**移動到**。也就是說,輸入的value值,其實是一個**移動的增量**,這點請務必注意。
接下來,我們就可以在交互窗口輸入一下剛才的命令,再選中一個對象,實際操作一下看看:
**H子:**好的,首先復制一下命令,然后貼到交互窗口。

再隨便選中一個模型

執行命令后返回了{'FINISHED'},同時模型也已經完成了變換


好的,確實的見到了模型的位置完成了和value輸入的值一致的變換。
完成了!
也就是說,我也可以用同樣的方法,去獲得對模型的旋轉和縮放的變換了?
而且,因為變換清零的命令是把所有的數據都清零,也就是說,清零前的數據,剛好就等于一次完整的變換操作,也就是說,**只要記錄清零前的坐標,在完成了清零之后,再利用這個坐標進行一次變換,就可以把模型變換回到原本的狀態了。**
**AOI:** 對,就是這么回事。所以之后只要逐個選中模型,然后再進行變換操作,就可以對每個模型清零變換并且導出,然后再放回原位,導出的模型是完美的,導出后,也不會因為導出的操作改變了原本在場景上的位置。
**H子:** 那么再試試看旋轉好了。

啊,奇怪了,多了一個參數了。

>**value** (float in [-inf, inf], (optional)) – Angle
>**axis** (float array of 3 items in [-inf, inf], (optional)) – Axis, The axis around which the transformation occurs
從API來看,旋轉的操作是給定一個角度和旋轉所繞的軸進行啊。這樣的話,一個物體本身不就無法獲得這個參數了嗎。
看來并不可以直接這樣用了阿,只能另辟蹊徑了嗎?
繼續查查看好了
首先看看,選中的對象自身有什么參數好了:
輸入個bpy.context.selected_objects[0].
然后按ctrl+空格鍵


阿

確實的輸出了當前模型的歐拉角度了
看來是弧度值呢。
試試看直接賦值會怎么樣呢:

實際運行的效果是

選中的模型的X軸角度確實改變了!
這樣的話,只要我清空旋轉之前,保存一下模型的原始XYZ旋轉角度,然后導出完成后再重新把保存的數據賦予模型就好了把,甚至都不用什么其他的操作命令了。
總結一下:
bpy.context.selected_objects[0].location
bpy.context.selected_objects[0].rotation_euler
bpy.context.selected_objects[0].scale
這就分別是選中對象位于世界坐標系的位置,旋轉和縮放的值了。后面只要在清零變換前保存這個值,就可以安心清零,然后再賦值還原了。