多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
## **贰、变换清零** **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 这就分别是选中对象位于世界坐标系的位置,旋转和缩放的值了。后面只要在清零变换前保存这个值,就可以安心清零,然后再赋值还原了。