## **贰、变换清零**
**AOI:** 首先,我们先来解决学习bpy最基本的问题吧:从哪里知道对应的操作是什么命令。
**H子:** Blender有没有什么地方能查看到自己每一步的操作对应了什么命令呢。如果有的话,倒是很方便了。
**AOI:** 你所说的正是存在的。首先,先看到Blender界面的最上方吧。就是那条菜单栏
![](https://box.kancloud.cn/58adf8963e524f2687637ee5c36a1346_1508x53.png)
鼠标移到菜单栏的下边界上,当鼠标看起来像这样的时候![](https://box.kancloud.cn/2623a0f31ca8d87e8ca92a900892cdac_29x33.png),往下拉,你就会打开一个新世界。
看起来,就像是这样的:
![](https://box.kancloud.cn/48b70622ab04c33cc3ddf6db417966e9_1443x165.png)
而这个位置,就是你所说的,显示操作对应的命令的地方了,虽然不是每个命令都会显示,但是绝大部分的命令都会在此显示出来。活用这个功能,就能大幅度的降低学习门槛了。
**H子:** 噢噢噢噢!(发出了欢喜的声音。)
**AOI:** 不要自顾自的感动了,先来操作一下吧。重置对象的变换和对对象进行变换吧。
首先选中随便一个模型,然后移动一下。
![](https://box.kancloud.cn/d91365a2a1ca9b6b85fc68a6a0bc3197_1282x567.png)
就可以看到,已经产生了一个移动的命令
再按一下Alt+G,清零一下移动的变换
![](https://box.kancloud.cn/1fa0be4fc22744ed0be54502c557576f_411x33.png)
就可以看到,这里也产生了一条清零移动变换的命令
这样,就得到了目标的两条命令了。
![](https://box.kancloud.cn/870a9ff0f6d35c95fa22fe18a6b45015_1279x46.png)
点击右键选择两条命令,并按Ctrl+C复制,即可复制命令
![](https://box.kancloud.cn/fd1f254ec9b91b84364015fdd91f237f_528x544.png)
可以看到,复制下来的命令,是基于ops类下面的object进行的操作。
![](https://box.kancloud.cn/8b7b58a57976c5a4881587d34fbadfac_1023x131.png)
查询官方文档的描述,可以看到,这个命令的作用是
> Translate (move) selected items
>移动选中的对象
而我们是通过context来获取对象,所以要遍历操作对象,只需要循环的选中每一个对象,然后使用这个命令对模型进行移动即可。
值得注意的是,这个命令所进行的操作,是**移动**,而不是**移动到**。也就是说,输入的value值,其实是一个**移动的增量**,这点请务必注意。
接下来,我们就可以在交互窗口输入一下刚才的命令,再选中一个对象,实际操作一下看看:
**H子:**好的,首先复制一下命令,然后贴到交互窗口。
![](https://box.kancloud.cn/e78114c96218b77cc4793a04751b7f41_1078x43.png)
再随便选中一个模型
![](https://box.kancloud.cn/993dce3cf4d4ef92ef2e748f87164488_592x548.png)
执行命令后返回了{'FINISHED'},同时模型也已经完成了变换
![](https://box.kancloud.cn/9380c564805e83391b85db97317d3791_1062x69.png)
![](https://box.kancloud.cn/2a389fb8cc3f510705adb649d00a7b23_561x511.png)
好的,确实的见到了模型的位置完成了和value输入的值一致的变换。
完成了!
也就是说,我也可以用同样的方法,去获得对模型的旋转和缩放的变换了?
而且,因为变换清零的命令是把所有的数据都清零,也就是说,清零前的数据,刚好就等于一次完整的变换操作,也就是说,**只要记录清零前的坐标,在完成了清零之后,再利用这个坐标进行一次变换,就可以把模型变换回到原本的状态了。**
**AOI:** 对,就是这么回事。所以之后只要逐个选中模型,然后再进行变换操作,就可以对每个模型清零变换并且导出,然后再放回原位,导出的模型是完美的,导出后,也不会因为导出的操作改变了原本在场景上的位置。
**H子:** 那么再试试看旋转好了。
![](https://box.kancloud.cn/7e47045ba7f32a3cc942d64be27f32e1_1278x31.png)
啊,奇怪了,多了一个参数了。
![](https://box.kancloud.cn/3d9962ee0904fc0cc2c8a09ed073056f_1013x138.png)
>**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+空格键
![](https://box.kancloud.cn/aa76e1a9979e1ddd7b79ac4d4cc9dac9_394x131.png)
![](https://box.kancloud.cn/fc1d8062696ed4fba87c3e3c5a3f1fbc_248x140.png)
阿
![](https://box.kancloud.cn/45636ebdfd687dcdc9064ce273517c78_559x32.png)
确实的输出了当前模型的欧拉角度了
看来是弧度值呢。
试试看直接赋值会怎么样呢:
![](https://box.kancloud.cn/987115ea3e70db865dc0c87ed4631404_554x28.png)
实际运行的效果是
![](https://box.kancloud.cn/897e81ace16a93816a6a4dd4b9e82950_176x105.png)
选中的模型的X轴角度确实改变了!
这样的话,只要我清空旋转之前,保存一下模型的原始XYZ旋转角度,然后导出完成后再重新把保存的数据赋予模型就好了把,甚至都不用什么其他的操作命令了。
总结一下:
bpy.context.selected_objects[0].location
bpy.context.selected_objects[0].rotation_euler
bpy.context.selected_objects[0].scale
这就分别是选中对象位于世界坐标系的位置,旋转和缩放的值了。后面只要在清零变换前保存这个值,就可以安心清零,然后再赋值还原了。